如何申报好友集会?

Hem*_*ant 110 c# assembly-signing visual-studio-2008

我的解决方案中有2个项目:

  1. 大会(基础图书馆)
  2. 测试组件(NUnit)

我在第一个项目中将测试程序集声明为朋友程序集:

[assembly: InternalsVisibleTo ("Company.Product.Tests")]
Run Code Online (Sandbox Code Playgroud)

一切都很好,直到我意识到我忘记设置解决方案来签署我的程序集.因此创建了一个snk文件并设置了visual studio项目来签署第一个程序集(Basic Library).现在当我编译第一个项目时,我收到以下错误:

朋友汇编参考'Company.Product.Tests'无效.强名称签名程序集必须在其InternalsVisibleTo声明中指定公钥.

我试图使用sn实用程序从我的snk文件中提取公钥,但它生成一个有线二进制文件,我不确定如何使用.我该如何解决这个问题?

Jon*_*eet 189

您需要对两个程序集进行签名,因为两个程序集都有效地相互引用.

您必须将公钥放在InternalsVisibleTo属性中.例如,在Protocol Buffers中我使用:

[assembly:InternalsVisibleTo("Google.ProtocolBuffers.Test,PublicKey="+
"00240000048000009400000006020000002400005253413100040000010001008179f2dd31a648"+
"2a2359dbe33e53701167a888e7c369a9ae3210b64f93861d8a7d286447e58bc167e3d99483beda"+
"72f738140072bb69990bc4f98a21365de2c105e848974a3d210e938b0a56103c0662901efd6b78"+
"0ee6dbe977923d46a8fda18fb25c65dd73b149a5cd9f3100668b56649932dadd8cf5be52eb1dce"+
"ad5cedbf")]
Run Code Online (Sandbox Code Playgroud)

通过运行检索公钥

sn -Tp path\to\test\assembly.dll
Run Code Online (Sandbox Code Playgroud)

或者,从.snk文件中获取它:

sn -p MyStrongnameKey.snk public.pk
sn -tp public.pk
Run Code Online (Sandbox Code Playgroud)

  • 看到MSDN文档(http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx)提到几乎看起来像公钥的荒谬的公钥,真是令人恼火啊令我**. (7认同)
  • 尽管这些答案和评论都很有用,但我需要进行一些实验来了解公钥是包含测试的程序集中的公钥,而不是包含"InternalsInvisibleTo"声明的程序集. (7认同)
  • 您可以直接从.snk文件中提取公钥:sn -k MyStrongnameKey.snk // sn -p MyStrongnameKey.snk public.pk // sn -tp public.pk // (3认同)
  • @Andreas:嗯,它与您命名的程序集一致 - 您在要进行信任的程序集中指定要信任的程序集的强名称. (2认同)