文字列リソース
文字列リソースを作成するには、次の 3 つの手順を実行するだけです。
各文字列の名前と値のエントリを含むテキスト ファイルを作成します。
Resgen.exe を使用して、このテキスト ファイルを .resources ファイルに変換します。
DLL を作成し、アセンブリ生成ツール (AL) または .NET Framework SDK に付属する言語コンパイラの 1 つを使用して、.resources ファイルを埋め込みます。
**メモ **AL の詳細については、「付録 B : リソース ツール」を参照してください。
文字列が既定以外のカルチャにローカライズされる場合は、各カルチャおよび言語に依存しない既定のカルチャについて、上記の 3 つの手順を実行する必要があります。また、AL の使用時にカルチャを指定する必要もあります。
リスト 1. 文字列テキスト ファイルのサンプル (MyStrings.txt)
; Sample strings for the calculator Default locale
;
Math_Greeting = Welcome Integer Calculator
Math_Formula_Label = Formula and Results:
Math_Clear_Button = Clear
Math_Calc_Button = Calculate
Math_Calc_Error = Invalid Formula. Please try again.
Resgen.exe は、文字列リソース (.txt ファイル)、XML リソース (.resx ファイル)、コンパイル済みリソース (.resources ファイル) の 3 種類のリソース ファイル形式を相互に変換します。MyStrings.txt リソース ファイルをコンパイルするには、次のコマンド ラインを実行して、複数のリソースを含むコンパイル済みの中間ファイルを生成します。
resgen MyStrings.txt MyStrings.resources
この時点で、パッケージ化の方法は 3 つあります。つまり、実行可能アセンブリにリソースを埋め込む方法、リソースを保持するだけのサテライト アセンブリを作成する方法、.resources ファイルにリソースを残して直接アクセスする方法です。最後の方法は、主にツールを作成するときには便利ですが、本格的なアプリケーションでは、アセンブリを使用して署名とバージョン チェックの利点を生かすことをお勧めします。
多くのアプリケーション (特にローカライズされないアプリケーション) では、実行可能アセンブリにリソースを埋め込むだけで十分です。この埋め込みは、/res スイッチと次の構文を使用してコンパイル時に行います。
(csc|vbc) ... /out:WorldCalc.exe /res:MyStrings.resources WorldCalc.cs
メモ 理解しやすいように、上記のコマンド ラインでは /target、/addmodule、/a、/r の各パラメータは省略してあります。
このコマンド ラインは、WorldCalc.cs を WorldCalc.exe にコンパイルし、MyStrings.resources ファイルからリソースを埋め込みます。リソースを別の DLL に入れる場合は、たとえば次のコマンド ラインを使用できます。
al /out:WorldCalc.Resources.DLL /embed:MyStrings.resources,MyStrings.resources,Private
/embed パラメータの構文は次のとおりです。
/embed:<filename>[,<name>[,Private]
各パラメータの説明を次に示します。
<filename> - .resources ファイルの名前です。
<name> - リソースの内部名です。通常は ResourceManager を構築するときに使われます。一般には名前空間が含まれます。
Private - リソースが他のアセンブリから参照できるかどうかを指定します (既定値は no です)。
****メモ /embed の代わりに /link パラメータを使うこともできます。この場合は、マニフェストを含むリソース アセンブリ DLL がビルドされますが、リソース自体が埋め込まれるのではなく、.resources ファイルへのリンクが格納されます。
コードによるリソースの作成
コードを使用すると、.resource ファイルを直接作成できます。この方法は、適切に書式設定されたリソースの生成を自動化するとき、特に、リソースがデータベースに格納されている場合や、以前の Win32 文字列リソース テーブルのような別のシステムからリソースを移行した場合に便利です。.resources ファイルを作成するには、一意のファイル名で ResourceWriter を作成し、AddResource を少なくとも 1 回呼び出し、Close を呼び出してファイルを閉じます (Close によって暗黙的に Generate が呼び出されます)。ResourceWriter を使用して 5 つのエントリを含む .resources ファイルを作成する方法を、次の小さなプログラムとして示します。
リスト 2a..resource ファイルの作成と読み取り (ResWrite.cs)
using System;
using System.Collections;
using System.Resources;
class MainApp {
public static void Main() {
// First create the resource file and add strings.
IResourceWriter rw = new ResourceWriter("sample.resources");
rw.AddResource("test1", "one");
rw.AddResource("test2", "two");
rw.AddResource("test3", "three");
rw.AddResource("test4", "four");
rw.AddResource("test5", 512341234);
rw.Close();
...
}
}
リスト 2b..resource ファイルの作成と読み取り (ResWrite.vb)
Imports System
Imports System.Collections
Imports System.Resources
Class MainApp
Public Shared Sub Main()
' First create the resource file and add strings.
Dim rw As ResourceWriter = New ResourceWriter("sample.resources")
rw.AddResource("test1", "one")
rw.AddResource("test2", "two")
rw.AddResource("test3", "three")
rw.AddResource("test4", "four")
rw.AddResource("test5", 512341234)
rw.Close()
...
End Sub
End Class
**メモ **同じインターフェイスをサポートする他の ResourceWriter クラスでもコードが正しく動作するように、これを IResourceWriter に割り当てる必要があります。
ファイルからリソースを取得する最も簡単な方法は、ResourceReader クラスを使用してリソースを反復処理することです。前のコードに基づいて、書き込まれたリソースを列挙するために必要な最小限のコードを次に示します (リソースは、同じ ResWrite.cs プログラム ファイルや ResWrite.vb プログラム ファイルから取得されます)。
リスト 3a.ResourceReader による反復処理 (ResWrite.cs)
...
// Iterate through the resources.
IResourceReader rr = new ResourceReader("sample.resources");
IDictionaryEnumerator de = rr.GetEnumerator();
while (de.MoveNext()) {
Console.WriteLine(de.Key + " " + de.Value);
}
rr.Close();
...
リスト 3a.ResourceReader による反復処理 (ResWrite.vb)
...
' Iterate through the resources.
Dim rr As ResourceReader = New ResourceReader("sample.resources")
Dim de As IDictionaryEnumerator = rr.GetEnumerator()
While de.MoveNext()
Console.WriteLine((de.Key.ToString() + " " + de.Value.ToString()))
End While
rr.Close()
...
この小さなプログラムでは、まず、前に作成したのと同じ .resources ファイル用の ResourceReader を作成しています。リソースを書き込んだときと同様に、これを IResourceReader に割り当てて柔軟性を高めています。次に、DictionaryEnumerator を使用してリソースを反復処理し、リソース名とそれに対応する値をコンソールに出力します。
ResourceReader を直接使用した場合もリソースを列挙できますが、名前付きエントリを指定して固有のリソースを直接取得することはできません。セクション「コードによるリソースの取得」で説明する強力な ResourceManager を使用すると、リソースを直接取得できます。
参照
イメージ リソース | リソースのパッケージ化 | コードによるリソースの取得 | リソースのまとめ | 付録 A : リソースに関する追加情報 | 付録 B : リソース ツール