ResourceManager
ResourceManager クラスを使用すると、実行時に、適切なカルチャのリソースへ簡単にアクセスできます。ResourceManager は、特定のルート名を持つ共通のソースからの複数のリソースを管理します。複数のクラス コンストラクタによって、さまざまなシナリオがサポートされます。たとえば、アセンブリからリソースを取得したり、リソース ファイルからリソースを取得したりできます。また、別の静的メソッドを使用することにより、イメージのようなスタンドアロンのリソース ファイルからリソースを取得することもできます。既定の実装は、すべてのリソース名を読み込んだ後、要求に応じて値を読み込み、それらを後で使用できるように格納します。この方法では、すべてのリソースが読み込まれるわけではないため、ResourceSet クラス (このセクションで後述) よりもメモリ消費量が少なくてすみます。ただし、特定のリソースを最初に取得するときには時間がかかることがあります。さらに、既定の ResourceManager 実装では、オブジェクトのシリアル化がサポートされます。最後に、ResourceManager オブジェクトには、ローカライズされた特定のリソースが用意されていない場合に、地域に依存しないニュートラル カルチャのフォールバック リソースを検索する機能が用意されています。
ResourceReader を使用してリソースを列挙する単純な機構については、既に説明しました。今度は、ほぼ同じことを強力な ResourceManager を使用して行います。
リスト 4a.ResourceManager による名前付きリソースの処理 (ResWrite.cs)
...
ResourceManager rm = ResourceManager.
CreateFileBasedResourceManager("sample", ".", null);
Console.WriteLine(rm.GetString("test1"));
Console.WriteLine(rm.GetString("test2"));
Console.WriteLine(rm.GetString("test3"));
Console.WriteLine(rm.GetString("test4"));
Console.WriteLine(rm.GetObject("test5").ToString());
...
リスト 4b.ResourceManager による名前付きリソースの処理 (ResWrite.vb)
...
Dim rm As ResourceManager = ResourceManager.
CreateFileBasedResourceManager ("sample", ".", Nothing)
Console.WriteLine(rm.GetString("test1"))
Console.WriteLine(rm.GetString("test2"))
Console.WriteLine(rm.GetString("test3"))
Console.WriteLine(rm.GetString("test4"))
Console.WriteLine(rm.GetObject("test5").ToString())
...
まず、静的な CreateFileBasedResourceManager メソッドが使われていることに気付きます。このメソッドは、ファイル、場所、および既定以外の ResourceSet を使用するかどうかを指定する 3 つの引数を受け取ります。このコードは、場所がアプリケーションの基本ディレクトリ (AppBase) であることを想定しています。次に気付くのは、ResourceManager クラスの GetString メソッドを使用して文字列リソースを簡単に取得できることです。
GetObject メソッドを使用すると、イメージ リソースを取得することもできます。前の例はリソースの名前の値を書き込むだけでしたが、次の 2 行のコード (Graphic.cs サンプル ファイルから引用) では、GetObject メソッドを使用してグラフィック イメージを取得および表示する方法を示します。
rm = new ResourceManager("Images", this.GetType().Assembly);
pictureBox1.Image = (System.Drawing.Image)rm.GetObject("flag");
Graphic.vb サンプル ファイルから、Visual Basic で同じ処理を行うコードを次に示します。
rm = New ResourceManager("Images", Me.GetType().Assembly)
pictureBox1.Image = CType(rm.GetObject("flag"), System.Drawing.Image)
この 2 つのステートメントは、Images リソース ファイルから flag という名前のオブジェクトを読み込み、それを Image 型にキャストし、結果をピクチャ ボックスの Image プロパティに割り当てます。もちろん、実際に読み込まれるイメージは使用中のカルチャによって異なります。ニュートラル カルチャ リソースの場合は、コンパイル オプションで指定された場所からリソースが取得されます。リソースを指定するコンパイラ オプションを次に示します。
.../res:Images.resources,Images.resources...
この特定のサンプルでは、コンパイラ オプションによって Un.jpg ファイルが埋め込まれます。他のカルチャの場合は、ビルド処理の実行中に、ビットマップが対応するサテライト アセンブリに埋め込まれます。
ResourceManager は、シリアル化できる任意のデータに対して使用できます。言い換えると、Serializable 属性でマークされ、ISerializable インターフェイスをサポートするクラスに対して機能します。組み込み型には、Image 型 (および Bitmap、Icon、Cursor、Metafile の各派生型) と文字列型があります。ResourceManager では文字列パラメータの大文字と小文字が区別されるため、リソース ファイル名とリソース キーもすべて大文字と小文字が区別されます。
ファイルは、サブディレクトリまたは .resources ファイルに格納するか、アセンブリにパッケージ化できます。アセンブリ内のリソースを見つけるため、ResourceManager は、実行中のアセンブリの名前を受け取り、".resources" およびアセンブリの "メジャー.マイナ" バージョン番号を追加し、現在のロケールを追加し、現在実行中のアセンブリの署名キー ハッシュを追加して、このアセンブリを見つけるようにアセンブリ キャッシュに指示します。アセンブリ キャッシュのバインド要求をトレースする便利なツールについては、「付録 B : リソース ツール」のアセンブリ バインディング ログ ビューア (FusLogVW) に関するドキュメントを参照してください。
**メモ **個々のファイルとして存在するスタンドアロンのリソースを実装すると、Web アプリケーションの実行中に Microsoft Internet Information Services (IIS) にるファイルのロックが発生することがあります。この場合、アプリケーションの実行中はリソース ファイルを更新できなくなります。この問題への対策として、アプリケーションの \bin サブディレクトリ内のサテライト アセンブリにリソースを格納すると、以降の Web 要求を処理するために新しいアプリケーション ドメインが作成されるとき、IIS のシャドウ コピー機構によって新しいリソースが自動的に読み込まれます。