如何申报好友集会?

时间:2009-07-14 06:01:42

标签: c# visual-studio-2008 assembly-signing

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

  1. 装配(基本库)
  2. 测试装配(NUnit)
  3. 我在第一个项目中将测试程序集声明为朋友程序集:

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

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

      

    朋友大会参考   'Company.Product.Tests'无效。   强名称签名的程序集必须   在其中指定一个公钥   InternalsVisibleTo声明。

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

3 个答案:

答案 0 :(得分:186)

您需要签署两个程序集,因为两个程序集都会相互引用。

您必须将公钥放在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

答案 1 :(得分:-4)

您可以直接从您感兴趣的程序集中获取公钥 没有魔法与sn.exe

<!-- 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))));

答案 2 :(得分:-6)

我认为您需要输入强名称,例如“Company.Product.Tests,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 17135d9fcba0119f”。我假设Company.Product.Tests是您的程序集名称,17135d9fcba0119f是公钥。

解决此问题的另一种方法是不使用单独的程序集。我通常将源代码和测试代码放在同一个程序集中。我不知道你是否有任何特别关注你必须将它们分开。