9

以下を使用して、いくつかの内部を単体テスト プロジェクトに公開しようとしています。

[assembly: InternalsVisibleTo("MyTest")]

しかし、私はエラーが発生しています:

エラー 1 フレンド アセンブリ参照 MyTest' が無効です。厳密な名前で署名されたアセンブリは、InternalsVisibleTo 宣言で公開キーを指定する必要があります。.../MyClass.cs...

PublicTokenKey を手動で割り当てる場合:

[assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")]

ソリューションはエラーなしでビルドされます。

  1. 公開鍵トークンを含める必要があるのはなぜですか?
  2. 公開鍵トークンを含めることで本番環境で何かが壊れるかどうかはわかりません。

では、テスト プロジェクトに公開鍵を割り当てる最も安全な方法は何ですか?

4

1 に答える 1

7

動作することにも驚いてPublicKeyTokenいます-私のマシンでは、強制的に使用する必要がありますPublicKey

  1. 公開キー トークンが必要な理由は、厳密に名前が付けられたアセンブリを GAC に入れることができるためです。GAC の信頼性は高くなります。「MyTest」と呼ばれるアセンブリ (ブラウザーのコントロールなど、信頼されていない可能性があるもの) が GAC アセンブリの内部を呼び出すことができると、セキュリティ ホールになります。このタイプのハッキングを防ぐために公開鍵が必要です。

  2. これにより、アセンブリが見つからない場合でも、運用環境が損なわれることはありません。この属性は、実行時ではなくコンパイル時に使用されます。

最も安全な方法は何ですか?

実稼働コードを破壊することが本当に心配な場合は、リリース ビルド中に属性を削除してください。

#if (DEBUG || TEST)
[assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")] 
#endif

公開鍵トークンを必要とするプロジェクトがいくつかある場合 (そして、必要な鍵ペアが 1 つしかない場合) のようなファイルを定義し、AssemblyInfo.global.csそれをリンクされたファイルとしてすべてのプロジェクトに追加することもできます。

class KeyTokens
{
   public const string Global = ", PublicKeyToken=XxxxxYysakf";
}

これにより、物事が単純化されます(特に、本当に長いを使用する必要がある場合PublicKey) :

#if (DEBUG || TEST)
[assembly: InternalsVisibleTo("MyTest" + KeyTokens.Global)] 
[assembly: InternalsVisibleTo("HisTest" + KeyTokens.Global)] 
[assembly: InternalsVisibleTo("TheirTest" + KeyTokens.Global)] 
#endif
于 2011-08-25T14:07:38.723 に答える