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


114

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

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

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

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

アセンブリに署名するためのソリューションをセットアップするのを忘れていることに気づくまで、すべてがうまくいきました。そこで、snkファイルを作成し、最初のアセンブリ(基本ライブラリ)に署名するようにVisual Studioプロジェクトを設定しました。最初のプロジェクトをコンパイルすると、次のエラーが発生します。

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

snユーティリティを使用してsnkファイルから公開鍵を抽出しようとしましたが、使用方法がわからない有線バイナリファイルが生成されます。どうすれば問題を解決できますか?

回答:


194

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

公開キーを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

7
そして、MSDNのドキュメント(msdn.microsoft.com/en-us/library/…)で、私には公開キートークンのように見える、とんでもなく短い公開キーについて言及しているのを見て、いらいらさせられます。
Hemant

3
公開鍵は.snkファイルから直接抽出できます。sn -k MyStrongnameKey.snk // sn -p MyStrongnameKey.snk public.pk // sn -tp public.pk //
Tim Long

1
で指定された「アセンブリタイトル」を使用していましたAssemblyInfo.cs。それ以来、使用する正しい名前は、プロジェクトの[プロパティ/アプリケーション]ダイアログ(Visual Studioのソリューションエクスプローラーでのプロジェクトの名前とは異なります)からの「アセンブリ名」です。
大佐パニック

7
これらの回答やコメントと同様に、公開鍵は 'InternalsInvisibleTo'宣言を含むアセンブリではなく、テストを含むアセンブリからのものであることを理解するための実験が必要でした。
Andreas

3
@Andreas:まあそれはあなたが命名しているアセンブリと一緒です-信頼しているアセンブリ内で、信頼するアセンブリの厳密な名前を指定しています。
Jon Skeet

-3

sn.exeを使用すれば、手間をかけずに、目的のアセンブリからpublicKeyを直接取得できます。

<!-- language: c# -->
var assemblyName = Assembly.GetExecutingAssembly().GetName();
Console.WriteLine("{0}, PublicKey={1}",
    assemblyName.Name,
string.Join("", assemblyName.GetPublicKey().Select(m => string.Format("{0:x2}", m))));

1
これはこの質問に対する答えではありません。対処する答え
Cole Johnson

-7

「Company.Product.Tests、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = 17135d9fcba0119f」のような厳密な名前を入力する必要があると思います。Company.Product.Testsがアセンブリ名で、17135d9fcba0119fが公開キーだと思います。

この問題を解決する別の方法は、個別のアセンブリを使用しないことです。私は通常、ソースコードとテストコードを同じアセンブリに配置します。それらを分離しなければならないという特別な懸念があるかどうかはわかりません。


バージョン番号とカルチャを指定する必要があるとは思いませんmsdn.microsoft.com/en-us/library/…を参照)。私は実際にテストコードをアセンブリ自体に配置しようとしませんでした。どのように機能するか試してみます(ヒントは+1)。
Hemant

4
InternalsVisibleToの場合、PublicKeTokenでは不十分です。公開鍵全体が必要です:-(
Sean Reilly
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.