サテライト アセンブリに含まれるリソースの取得
更新 : 2007 年 11 月
理想としては、既定 (ニュートラル) アセンブリのリソースをメイン アセンブリと共にパッケージ化し、アプリケーションでサポートする各言語についてサテライト アセンブリを個別に作成する必要があります。ResourceManager クラスを使用すると、実行時にカルチャ固有のリソースにアクセスしたり、アプリケーションがリソース フォールバック プロセスによってリソースを取得する方法を制御できます。詳細については、「リソースのパッケージ化と配置」の「リソース フォールバック プロセス」を参照してください。ResourceManager クラスのコンストラクタのいずれかを通じてリソースにアクセスすることを推奨します。そのためには、リソースをコンパイルしてサテライト アセンブリにするか、またはリソースをアプリケーションのメイン アセンブリの一部とする必要があります。
ResourceManager は、現在のスレッドの CultureInfo.CurrentUICulture プロパティに基づいて、どのリソースを取得するのかを判断します。たとえば、アプリケーションのコンパイル時に、既定の英語リソースと、フランス語とドイツ語のリソース用のリソースを含む 2 個のサテライト アセンブリを使用し、さらに CurrentUICulture プロパティを "de" と設定した場合、ResourceManager はドイツ語リソースを取得します。CurrentUICulture プロパティの設定方法の詳細ついては、「CurrentUICulture プロパティの使用」を参照してください。
ResourceManager.GetString メソッドを使用して文字列リソースの取得と表示を行う例を次に示します。
…
Dim private rm As ResourceManager
rm = New ResourceManager("MyStrings", Me.GetType().Assembly)
Console.Writeline(rm.GetString("string1"))
…
…
private ResourceManager rm;
rm = new ResourceManager("MyStrings", this.GetType().Assembly);
Console.Writeline(rm.GetString("string1"));
…
このコードにより、ファイル MyStrings から string1 が取得され、表示されます。実際にどの文字列が読み込まれるかは、現在のスレッドの CurrentUICulture プロパティによって異なります。
ResourceManager.GetObject メソッドを使用してバイナリ リソース (グラフィック イメージなど) の取得と表示を行う例を次に示します。
…
Dim private rm As ResourceManager
rm = New ResourceManager("MyImages", Me.GetType().Assembly)
PictureBox.Image = Ctype(rm.GetObject("MyObject"), System.Drawing.Image)
…
…
private ResourceManager rm;
rm = new ResourceManager("MyImages", this.GetType().Assembly);
PictureBox.Image = (System.Drawing.Image)rm.GetObject("MyObject");
…
このコードにより、リソース ファイル MyImages から MyObject という名前のオブジェクトが読み込まれます。MyObject は Image 型にキャストされ、PictureBox というイメージ プロパティに割り当てられます。実際にどのオブジェクトが読み込まれるかは、現在のスレッドの CurrentUICulture プロパティによって異なります。
ResourceSet クラスには、1 つのカルチャ用にローカライズされたリソースがすべて格納されます。ResourceSet はリソース フォールバック プロセスを使用しません。したがって、ResourceSet はローカライズされたアプリケーションではそれほど便利ではありません。
サテライト アセンブリに関するバージョン管理サポート
既定では、要求されたリソースを取得するときに、ResourceManager はメイン アセンブリのバージョン番号と一致するバージョン番号を持ったサテライト アセンブリを探します。アプリケーションを配置した後で、メイン アセンブリまたは特定のリソース サテライト アセンブリを更新する場合が考えられます。.NET Framework は、メイン アセンブリとサテライト アセンブリのバージョン管理をサポートします。
SatelliteContractVersionAttribute クラスは、メイン アセンブリのバージョン管理をサポートします。アプリケーションのメイン アセンブリに対して SatelliteContractVersionAttribute を指定することで、サテライト アセンブリを更新しなくても、メイン アセンブリの更新と再配置を実行できます。メイン アセンブリを更新した後で、メイン アセンブリのバージョン番号をインクリメントしてください。ただし、サテライト コントラクト バージョン番号は変更しません。要求されたリソースを取得するときに、ResourceManager はこの属性によって指定されたバージョンのサテライト アセンブリを読み込みます。
発行者ポリシー アセンブリは、サテライト アセンブリのバージョン管理をサポートします。メイン アセンブリを更新せずに、サテライト アセンブリの更新と再配置を実行できます。サテライト アセンブリを更新した後で、バージョン番号をインクリメントし、発行者ポリシー アセンブリと共に出荷してください。発行者ポリシー アセンブリの中で、新しいサテライト アセンブリが、以前のバージョンとの下位互換性を持つことを指定してください。ResourceManager は、要求されたリソースを取得するためにメイン アセンブリの既存のサテライト コントラクト バージョン番号を使用しますが、アセンブリ ローダーによって、発行者ポリシー アセンブリ内の指定されたバージョンのサテライト アセンブリにバインドされるため、正しい更新バージョンのアセンブリが取得されます。発行者ポリシー アセンブリの詳細については、「発行者ポリシー ファイルの作成」を参照してください。
アセンブリ バージョン管理の完全なサポートを有効にするには、厳密な名前付きアセンブリをグローバル アセンブリ キャッシュに配置し、厳密な名前を持たないアセンブリをアプリケーション ディレクトリに配置することをお勧めします。厳密な名前付きアセンブリをアプリケーション ディレクトリに配置する場合は、アセンブリを更新しても、サテライト アセンブリのバージョン番号をインクリメントできません。既存のコードを新しいコードに置き換える場所で更新操作を行い、バージョン番号は同じままにする必要があります。たとえば、完全限定名が "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a" であるサテライト アセンブリのバージョン 1.0.0.0 を更新する場合は、同じ完全限定名 "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a" でコンパイルした更新版の myApp.resources.dll で元のアセンブリを置き換えます。バージョン番号をインクリメントできないため、サテライト アセンブリ ファイルでの更新を行うと、アプリケーション側でサテライト アセンブリのバージョンを正確に判断することが難しくなります。
アセンブリのバージョン管理については、「アセンブリのバージョン管理」と「ランタイムがアセンブリを検索する方法」を参照してください。