厳密な名前
前述の問題を解決する方法は、コンポーネント アセンブリの個々のビルドとクライアント アプリケーションをより厳密に関連付けることです。この個々のビルドは、バージョン番号とオリジネータと呼ばれる特別な値の組み合わせによって識別されます。これにより、システムはこれらのコンポーネント アセンブリを分離でき、複数のクライアント アプリケーションに対応した複数のバージョンを同時に実行できます。これは、従来は実現できなかった機能です。この保護システムは、アプリケーションをそのアプリケーションの別のバージョンと同時に、それぞれの実行環境に影響を与えることなく実行できるため、下位互換性のある実行と対比して、side-by-side 実行と呼ぶことがあります。
これらのビルド属性を追加し、保護された共有可能なコンポーネントを作成するコードは、4_Shared サブディレクトリにあります。3_SimplePath にあるコードのビルドについては、この手順は、文字列の配列を反転させる 2 番目の共有可能なコンポーネントを追加します。
まず、この新しいコンポーネント アセンブリをビルドします。このアセンブリを共有を可能にするためのオプションは指定しません。たとえば、\4_Shared\ サブディレクトリにある BuildNoShare.bat を使用して新しい Reverser.dll コンポーネントをコンパイルするだけの場合は、Ildasm.exe を使用してメタデータを調べることができます。メタデータを調べると、そのアセンブリにオリジネータがないことと、バージョン番号が設定されていないことがわかります。
.assembly Reverser
{ ...
.hash algorithm 0x00008004
.ver 0:0:0:0
}
アセンブリを共有可能としてマークするには、そのアセンブリを秘密キーを使用してコンパイルする必要があります。公開キーは検証時に使用します。したがって、コンパイルの前に、公開キーと秘密キーのペアを生成しておく必要があります。厳密名ツール (Sn.exe) を使用して新しいキー ペアを生成し、生成したキー ペアを \4_Shared\Reverser サブディレクトリにあるファイルに格納します。
sn k orgKey.snk
秘密キーを生成したら、キー ファイルと割り当てるバージョン番号を指定して、いつでもコンポーネントをコンパイルできます。そのためには、STRONG 条件付きコンパイル シンボルを使用して、Reverser.cs ファイルに AssemblyVersion 属性と AssemblyKeyFile 属性を指定します。
#if STRONG
[assembly: System.Reflection.AssemblyVersion("1.0.0.0")]
[assembly: System.Reflection.AssemblyKeyFile("orgKey.snk")]
#endif
次に、コンパイル プロセスで STRONG を定義する必要があります。
csc.exe /define:STRONG ... Reverser.cs
Reverser.dll に対して Ildasm.exe を再び実行すると、アセンブリが共有可能になったことが、.publickey プロパティと既定値 1.0.0.0 が含まれていない .ver プロパティから確認できます。
.assembly Reverser
{ ...
.publickey = (00 ... FC 4A DC 9B 9C)
.hash algorithm 0x00008004
.ver 1:0:0:0
}
厳密名ツール (SN.exe) の詳細については、このチュートリアルの「付録 B: パッケージ化および配置用のツール」で示す該当セクションを参照してください。
参照
共有コンポーネントの配置 | (5) コンポーネントのバージョン管理 | パッケージ化と配置の要約 | 付録 A: パッケージ化および配置の追加情報 | 付録 B: パッケージ化および配置用のツール