web-dev-qa-db-ja.com

フレンドアセンブリを宣言する方法は?

私のソリューションには2つのプロジェクトがあります。

  1. アセンブリ(基本ライブラリ)
  2. テストアセンブリ(NUnit)

最初のプロジェクトで、テストアセンブリをフレンドアセンブリとして宣言しました。

[Assembly: InternalsVisibleTo ("Company.Product.Tests")]

アセンブリに署名するためのソリューションをセットアップするのを忘れたことに気付くまで、すべてが正常に機能していました。したがって、snkファイルを作成し、最初のアセンブリ(基本ライブラリ)に署名するようにVisual Studioプロジェクトをセットアップしました。最初のプロジェクトをコンパイルすると、次のエラーが表示されます。

フレンドアセンブリ参照 'Company.Product.Tests'は無効です。厳密な名前の署名済みアセンブリは、InternalsVisibleTo宣言で公開キーを指定する必要があります。

Snユーティリティを使用してsnkファイルから公開キーを抽出しようとしましたが、使用方法が不明なワイヤードバイナリファイルが生成されます。どうすれば問題を修正できますか?

108
Hemant

実質的に両方のアセンブリが相互に参照するため、bothアセンブリに署名する必要があります。

InternalsVisibleTo属性に公開キーを配置する必要があります。たとえば、私が使用するプロトコルバッファでは:

[Assembly:InternalsVisibleTo("Google.ProtocolBuffers.Test,PublicKey="+
"00240000048000009400000006020000002400005253413100040000010001008179f2dd31a648"+
"2a2359dbe33e53701167a888e7c369a9ae3210b64f93861d8a7d286447e58bc167e3d99483beda"+
"72f738140072bb69990bc4f98a21365de2c105e848974a3d210e938b0a56103c0662901efd6b78"+
"0ee6dbe977923d46a8fda18fb25c65dd73b149a5cd9f3100668b56649932dadd8cf5be52eb1dce"+
"ad5cedbf")]

公開キーは、次を実行して取得されます

sn -Tp path\to\test\Assembly.dll

または、.snkファイルから取得します。

sn -p MyStrongnameKey.snk public.pk
sn -tp public.pk
187
Jon Skeet