サテライト アセンブリの作成

トピック「リソースのパッケージ化と配置」で説明したハブ アンド スポーク モデルは、リソースを使用するアプリケーションを開発する場合に推奨されるデザインの実装です。

ハブ アンド スポーク モデルでは、リソースを簡単に見つけて使用できるように、リソースを特定の場所に配置する必要があります。決められたとおりにリソースのコンパイルと名前付けを行わなかったり、正しい場所にリソースを配置しなかったりした場合、共通言語ランタイムはリソースを見つけることができません。その結果、ランタイムは既定のリソース セットを使用します。リソース名については、CultureInfo クラスまたは「リソースのパッケージ化と配置」を参照してください。

サテライト アセンブリのコンパイル

.resources ファイルをコンパイルしてサテライト アセンブリにする場合は、アセンブリ リンカ (Al.exe) を使用します。Al.exe は、指定された .resources ファイルからアセンブリを作成します。定義上、サテライト アセンブリにはリソースだけを含めることができます。実行可能コードを含めることはできません。

ファイル strings.de.resources からアプリケーション MyApp 用のサテライト アセンブリを作成する Al.exe コマンドを次に示します。

al /t:lib /embed:strings.de.resources /culture:de /out:MyApp.resources.dll

ファイル strings.de.resources からアプリケーション MyApp 用のサテライト アセンブリを作成する Al.exe コマンドを次に示します。/template オプションにより、このサテライト アセンブリは親アセンブリ MyApp.dll からアセンブリ メタデータを継承します。

al /t:lib /embed:strings.de.resources /culture:de /out:MyApp.resources.dll
/template:MyApp.dll

上記の例で使用した Al.exe のオプションを詳しく説明する表を次に示します。

オプション 説明

/t:lib

/t オプションは、サテライト アセンブリをコンパイルしてライブラリ (.dll) ファイルを作成することを指定します。サテライト アセンブリは、コードを含むわけでも、アプリケーションのメイン アセンブリでもないため、実行不可能です。したがって、サテライト アセンブリは DLL として保存する必要があります。

/embed:strings.de.resources

/embed オプションは、Al.exe がアセンブリをコンパイルするときに使用するソース ファイルの名前を指定します。1 つのサテライト アセンブリの中に複数の .resources ファイルを埋め込むことができます。ただし、ハブ アンド スポーク モデルに従う場合は、カルチャごとにサテライト アセンブリを 1 つずつコンパイルする必要があります。しかし、文字列およびオブジェクト用として、別個の .resources ファイルを作成できます。

/culture:de

/culture オプションは、コンパイルするリソースのカルチャを指定します。ランタイムは、指定されたカルチャ用のリソースを検索するときに、この情報を使用します。このオプションを省略しても Al.exe はリソースをコンパイルしますが、ランタイムでは、リソースが要求されても、そのリソースを検出できなくなります。

/out:MyApp.resources.dll

/out オプションは、出力ファイルの名前を指定します。この名前は、名前付け標準 baseName.resources.extension に従う必要があります。baseName はメイン アセンブリの名前で、extension は有効な拡張子 (たとえば .dll) です。ランタイムは、出力ファイル名からサテライト アセンブリのカルチャを判断することはできません。したがって、上記の /culture オプションによってカルチャを指定することが重要です。

/template: filename

/template オプションは、カルチャ フィールドを除くすべてのアセンブリ メタデータを継承する元となるアセンブリを指定します。サテライト アセンブリの継承元とするアセンブリは、厳密な名前を持つことが必要です。

有効な Al.exe のオプションの一覧については、「アセンブリ リンカ (Al.exe)」を参照してください。

厳密な名前を持つサテライト アセンブリのコンパイル

グローバル アセンブリ キャッシュ内にサテライト アセンブリをインストールする場合、アセンブリは厳密な名前を持っている必要があります。厳密な名前を持つアセンブリには、有効な公開/秘密キーのペアによる署名が付いています。厳密な名前の詳細については、「厳密な名前付きアセンブリ」を参照してください。

通常、アプリケーションの開発中に、最終的な公開/秘密キーのペアにアクセスすることはありません。サテライト アセンブリをグローバル アセンブリ キャッシュ内にインストールし、そのアセンブリが確実に予測どおりに機能するようにするために、遅延署名と呼ばれる技術を使用できます。アセンブリへの署名を遅延させる場合は、厳密な名前による署名用のスペースをビルド時にファイル内に予約しておいてください。実際の署名は、最終的な公開/秘密キーのペアが利用可能になるまで遅延されます。

公開キーの取得

アセンブリへの署名を遅延するには、公開キーにアクセスする必要があります。実際の公開キーを取得するには、最終的な署名を行う社内の組織から取得するか、厳密名ツール (Sn.exe) を使用して公開キーを作成します。

テスト用の公開キーと秘密キーのペアを作成し、ファイル TestKeyPair.snk に保存する Sn.exe コマンドを次に示します。–k オプションは、Sn.exe で新しいキー ペアを作成し、指定のファイルに保存することを指定します。

sn –k TestKeyPair.snk 

テスト用のキー ペアを含むファイルから公開キーを抽出できます。TestKeyPair.snk から公開キーを抽出し、PublicKey.snk に保存するコマンドを次に示します。

sn –p TestKeyPair.snk PublicKey.snk

アセンブリへの遅延署名

公開キーを取得または作成したら、アセンブリ リンカ (Al.exe) を使用してアセンブリをコンパイルし、署名を遅延することを指定します。

アプリケーション MyApp 用の厳密な名前付きサテライト アセンブリを strings.ja.resources ファイルから作成する Al.exe コマンドを次に示します。

al /t:lib /embed:strings.ja.resources /culture:ja /out:MyApp.resources.dll /delay+ /keyfile:PublicKey.snk

/delay+ オプションは、アセンブリへの署名を遅延することを指定します。/keyfile: オプションは、アセンブリへの署名を遅延するために使用する公開キーを含むキー ファイルの名前を指定します。

遅延署名の詳細については、「アセンブリへの遅延署名」を参照してください。

厳密な名前を持つアセンブリは、バインディング要件を満たすアセンブリを判断するためにランタイムが使用するバージョン情報を持っています。このトピックの詳細については、「アセンブリのバージョン管理」を参照してください。」

アセンブリへの再署名

後日、遅延署名されたサテライト アセンブリに対して、実際のキー ペアで再署名する必要があります。その作業は、Sn.exe を使用して実行できます。

MyApp.resources.dll に対して、ファイル RealKeyPair.snk に格納されている実際のキー ペアで署名する Sn.exe コマンドを次に示します。–R オプションは、以前に署名されたアセンブリ、または遅延署名されたアセンブリを Sn.exe で再署名することを指定します。

sn –R MyApp.resources.dll RealKeyPair.snk 

グローバル アセンブリ キャッシュへのサテライト アセンブリのインストール

リソース フォールバック プロセスでランタイムが最初にリソースを検索する場所はグローバル アセンブリ キャッシュです。詳細については、「リソースのパッケージ化と配置」の「リソース フォールバック プロセス」を参照してください。したがって、リソースをグローバル アセンブリ キャッシュにインストールする方法を知っておく必要があります。厳密な名前を付けてコンパイルしたサテライト アセンブリは、そのままグローバル アセンブリ キャッシュにインストールできます。グローバル アセンブリ キャッシュ ツール (Gacutil.exe) を使用すると、アセンブリをキャッシュ内にインストールできます。

MyApp.resources.dll をグローバル アセンブリ キャッシュにインストールする Gacutil.exe のコマンドを次に示します。

gacutil /i:MyApp.resources.dll

/i オプションは、指定したアセンブリをグローバル アセンブリ キャッシュにインストールすることを指定します。このコマンドの実行結果として、キャッシュ内にエントリが配置されます。これにより、この .resources ファイル内のエントリにアクセスできるようになります。指定したリソースをキャッシュ内にインストールすると、そのリソースを使用するようにデザインされたすべてのアプリケーションで、そのリソースを利用できるようになります。

グローバル アセンブリ キャッシュ内にインストールしないサテライト アセンブリ用のディレクトリの位置

サテライト アセンブリをコンパイルすると、それらのすべてに同じ名前が付けられます。ランタイムは、コンパイル時に Al.exe の /culture オプションで指定されたカルチャと、各アセンブリのディレクトリの位置に従って各サテライト アセンブリを区別します。そのため、サテライト アセンブリは、決められたディレクトリ位置に配置する必要があります。

グローバル アセンブリ キャッシュ内にインストールしないアプリケーションについて、サンプルのディレクトリ構造と位置に関する要件を次の図に示します。ファイル拡張子 .txt および .resources が付いたファイルは、最終的なアプリケーションには付属していません。それらは、最終的なサテライト リソース アセンブリを作成するまでの中間リソース ファイルです。この例では、.txt ファイルを .resx ファイルに置き換えることもできます。.resx ファイルは、唯一オブジェクトを含めることのできる種類の中間リソースです。

サテライト アセンブリ ディレクトリ

サテライト アセンブリ

Noteメモ :

アプリケーションにサブカルチャ用のリソースを含める場合は、各サブカルチャを専用のディレクトリ内に配置します。サブカルチャをそのメイン カルチャのディレクトリのサブディレクトリ内には配置しないでください。

参照

関連項目

アセンブリ リンカ (Al.exe)
厳密名ツール (Sn.exe)
グローバル アセンブリ キャッシュ ツール (Gacutil.exe)

概念

リソースのパッケージ化と配置
アセンブリへの遅延署名
アプリケーションのリソース