更新 : 2007 年 11 月
エラー メッセージ
コマンド ライン オプション "compiler_option" を使用するか、"attribute_name" 以外の適切なプロジェクト設定を使用してください。
アセンブリに署名するには、キー ファイルを指定する必要があります。Microsoft Visual C# 2005 より前は、ソース コードで CLR 属性を使用してキー ファイルを指定していました。これらの属性は使用されなくなりました。
Microsoft Visual C# 2005 からは、プロジェクト デザイナの [署名] ページまたはアセンブリ リンカを使用してキー ファイルを指定します。
プロジェクト デザイナの [署名] ページを使用することをお勧めします。詳細については、「[署名] ページ (プロジェクト デザイナ)」および「アセンブリおよびマニフェストへの署名の管理」を参照してください。
「方法 : 厳密な名前でアセンブリに署名する」では、次のコンパイラ オプションを使用します。
/keyfile (厳密名キー ファイルの指定) (C# コンパイラ オプション) (AssemblyKeyFileAttribute 属性の代わり)
/keycontainer (厳密名キー コンテナの指定) (C# コンパイラ オプション) (AssemblyKeyNameAttribute の代わり)
/delaysign (アセンブリの遅延署名) (C# コンパイラ オプション) (AssemblyDelaySignAttribute の代わり)
これらの属性が推奨されなくなった背景には、次のような経緯があります。
コンパイラによって生成されたバイナリ ファイルに属性が埋め込まれる、というセキュリティ上の問題がありました。第三者にバイナリ ファイルを配布すると、結果的に、そこに保存されているキーも一緒に配布されてしまいます。
属性に指定するパスの形式から生じる利便性の問題もありました。これまでは、現在の作業ディレクトリ (統合開発環境 (IDE) 内で変更される可能性がある)、つまり出力ディレクトリに対する相対パスが使用されていたため、キー ファイルは "..\\..\\mykey.snk" のように指定していました。また、属性で指定することは、プロジェクト システムが適切にサテライト アセンブリの署名を行うことへの障害となります。属性の代わりにコンパイラ オプションを使った場合、キーに絶対パスとファイル名を使用でき、出力ファイルには何も埋め込む必要がありません。プロジェクト システムおよびソース コード管理システムは、プロジェクトが移動されたとしても、その完全パスを適切に扱うことができます。プロジェクト システムは、プロジェクトとキー ファイルの位置関係を確実に維持でき、完全パスをコンパイラに渡すことができます。他のビルド プログラムは、正しい属性の指定されたソース ファイルを生成する代わりに、適切なパスを直接コンパイラに渡すことによって、容易に出力ファイルに署名できます。
フレンド アセンブリで属性を使用すると、コンパイラの効率に悪影響を及ぼすことがあります。属性を使用した場合、コンパイラは、フレンドシップを付与するかどうかの判断段階ではキーの存在を確認できず、推測に依存する必要がありました。コンパイルの最後に、キーの存在を知った段階で初めて、推測が正しかったかどうかを検証できます。キー ファイルをコンパイラ オプションで指定した場合、フレンドシップを付与する必要があるかどうかをコンパイラが直ちに判断できます。
使用例
次の例では CS1699 警告が生成されます。このエラーを解決するには、属性を削除し、/delaysign を使用してコンパイルします。
// CS1699.cs
// compile with: /target:library
[assembly:System.Reflection.AssemblyDelaySign(true)] // CS1699