マネージ アプリケーションに対する厳密な名前による署名
更新 : 2007 年 11 月
厳密な名前による署名 (厳密な名前付けとも呼ばれます) は、第三者によって悪用される可能性のないグローバルで一意な Identity をソフトウェア コンポーネントに割り当てます。厳密な名前を使用すると、コンポーネントの依存関係と構成ステートメントが、適切なコンポーネントとコンポーネントのバージョンに確実に対応付けられます。
厳密な名前は、アセンブリの識別子 (単純テキスト名、バージョン番号、カルチャ情報)、公開キー トークン、およびデジタル署名で構成されます。
Visual C# および Visual Basic のプロジェクトの場合、Visual Studio では、プロジェクト デザイナの [署名] ペインで厳密な名前付けを有効にできます (「[署名] ページ (プロジェクト デザイナ)」を参照)。
Visual C++ のプロジェクトの場合、リンカ オプションを使用して、アセンブリに署名します (「厳密名アセンブリ (アセンブリ署名)」を参照)。
厳密な名前付けを使用する理由
厳密な名前付けは、他のソフトウェアがアプリケーションやコンポーネントを明示的に参照するために使用できる一意の Identity を、アプリケーションやコンポーネントに割り当てます。たとえば、アプリケーションの作成者と管理者は、厳密な名前を使用することで共有コンポーネントに使用する正確なサービス バージョンを指定できます。これにより、他のアプリケーションに影響を与えることなく、複数のアプリケーションが異なるバージョンを指定できます。また、コンポーネントの厳密な名前は、2 つのコンポーネント間の信頼関係を確立するためのセキュリティの証拠としても使用できます。
厳密な名前を付けることができるもの
.NET Framework アセンブリと XML マニフェストには、厳密な名前を付けることができます。次のコントールがあります。
アプリケーション アセンブリ (.exe)
アプリケーション マニフェスト (.exe.manifest)
配置マニフェスト (.application)
共有コンポーネント アセンブリ (.dll)
厳密な名前を付けることが推奨されるもの
共有 DLL には、厳密な名前を付ける必要があります。DLL がグローバル アセンブリ キャッシュに配置されるかどうかにかかわらず、DLL がアプリケーションのプライベートな実装詳細ではなく、複数のアプリケーションが使用する可能性のある一般のサービスである場合は、厳密な名前を付けることをお勧めします。
厳密な名前を付ける必要があるもの
次のものには、厳密な名前を付ける必要があります。
グローバル アセンブリ キャッシュ (GAC: Global Assembly Cache) に配置する DLL。
ClickOnce のアプリケーション マニフェストと配置マニフェスト。ClickOnce で配置されるアプリケーションについては、Visual Studio のプロジェクト システムが既定でこれを有効にします。
COM 相互運用のために使用されるプライマリ相互運用機能アセンブリ。TLBIMP ユーティリティは、COM タイプ ライブラリからプライマリ相互運用機能アセンブリを作成するときに、厳密な名前付けを強制的に適用します。
厳密な名前を付けないことが推奨されるもの
一般に、アプリケーションの EXE アセンブリには厳密な名前付けの使用を避ける必要があります。厳密な名前の付いたアプリケーションやコンポーネントは、厳密な名前を持たないコンポーネントを参照できません。このため、EXE に厳密な名前を付けると、アプリケーションと共に配置される厳密な名前を持たない DLL が、EXE から参照できなくなります。
このため、Visual Studio のプロジェクト システムはアプリケーション EXE に厳密な名前を付けません。その代わりに、厳密な名前を持たないアプリケーション EXE を内部的に指すアプリケーション マニフェストに厳密な名前を付けます。
また、アプリケーションに対してプライベートなコンポーネントも、厳密な名前の使用を避ける必要があります。この場合、厳密な名前を付けることによって依存関係の管理がいっそう困難になり、プライベート コンポーネントのために不必要なオーバーヘッドが生じる可能性があります。
厳密な名前を付ける方法
Visual Studio では、プロジェクト デザイナの [署名] ペインで、アプリケーションまたはコンポーネントに厳密な名前を付けることができます。[署名] ペインでは、厳密な名前を付ける方法として、厳密な名前のキー ファイルを使用する方法と、キー プロバイダを使用する方法の 2 つがサポートされています。マニフェストの署名の詳細については、「方法 : アプリケーション マニフェストおよび配置マニフェストに署名する」を参照してください。厳密な名前のキー (.snk) ファイルの作成の詳細については、「方法 : 公開キーと秘密キーのキー ペアを作成する」を参照してください。
キー ファイルを使用する方法の場合、既存のキー ファイルを使用するか、または新しいキー ファイルを作成できます。キー ファイルは常にパスワードで保護して、第三者が使用できないようにする必要があります。
キー プロバイダまたは証明書ストアは、別の方法で厳密な名前のキーを保護します。一部のキー プロバイダは、ID の検査とキーの盗難防止のための手段としてスマート カードを使用します。
厳密な名前を付けられたコンポーネントのアップデート
厳密な名前を付けられたコンポーネントは、古いバージョンに新しいバージョンをコピーしても、サービスを提供したりアップグレードしたりできません。
アプリケーション ディレクトリ内の厳密な名前を持たない DLL は、アプリケーション ディレクトリに新しいバージョンをコピーするだけでアップデートできます。共通言語ランタイム (CLR: Common Language Runtime) は、物理的に存在するバージョンを読み込みます。
厳密な名前を付けた DLL の場合は、すべてのアセンブリ参照が新しいバージョンを参照するようにアプリケーション全体を再コンパイルするか、または、アプリケーションの .config ファイルを更新して、ランタイムが古いバージョンではなく新しいバージョンを読み込むように命令する必要があります。
厳密な名前の付いたコンポーネントは少し保守の手間がかかりますが、アプリケーションに対して、実行時に必要な他のコンポーネントのバージョンを明示的に指定できるという利点があります。
参照
処理手順
方法 : アプリケーション マニフェストおよび配置マニフェストに署名する
方法 : アセンブリに署名する (Visual Studio)
方法 : アセンブリに遅延署名する (Visual Studio)