如何声明朋友集?


114

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

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

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

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

一切正常,直到我意识到我忘记设置解决方案来对我的程序集进行签名。因此,创建了一个snk文件并设置Visual Studio项目以签署第一个程序集(基本库)。现在,当我编译第一个项目时,出现以下错误:

朋友程序集引用“ Company.Product.Tests”无效。强名签名程序集必须在其InternalsVisibleTo声明中指定一个公钥。

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

Answers:


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 2010年

1
我正在使用中指定的“程序集标题” AssemblyInfo.cs。从那时起,从项目的“属性/应用程序”对话框中推断出要使用的正确名称是“程序集名称”(这又与Visual Studio解决方案资源管理器中的项目名称不同)。
上校恐慌

7
正如这些答案和评论一样有用,我需要进行一些实验才能认识到,公钥是包含测试的程序集中的公钥,而不是包含“ InternalsInvisibleTo”声明的程序集。
Andreas

3
@Andreas:好吧,它与您要命名的程序集一起使用-您在进行信任的程序集中指定要信任的程序集的强名称。
乔恩·斯基特

-3

您可以直接从所需的程序集中获取publicKey,而无需使用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))));

1
这不是这个问题的答案。它应该解决的答案
科尔·约翰逊

-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是不够的。您需要整个公钥:-(
肖恩·赖利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.