120

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

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

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

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

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

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

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

4

3 に答える 3

203

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

公開鍵を InternalsVisibleTo 属性に入れる必要があります。たとえば、Protocol Buffers では次のように使用します。

[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
于 2009-07-14T06:51:00.340 に答える
-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))));
于 2015-02-08T13:01:51.643 に答える
-7

「Company.Product.Tests、Version = 1.0.0.0、Culture = neutral、PublicKeyToken=17135d9fcba0119f」のような強い名前を付ける必要があると思います。Company.Product.Testsがアセンブリ名であり、17135d9fcba0119fが公開鍵であると想定しています。

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

于 2009-07-14T06:08:13.780 に答える