如何声明好友集合?

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

  1. 汇编(基本库)
  2. 测试程序集(NUnit)

在第一个项目中,我将测试大会声明为朋友大会:

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

一切都运行良好,直到我意识到我忘了设置解决方案来签署我的程序集。因此,创建了一个 snk 文件并设置了可视化工作室项目来签署第一个程序集(基本库)。现在,当我编译第一个项目时,我得到以下错误:

朋友程序集引用 “公司、产品、测试”无效。 强名称已签名的程序集必须 中指定公钥 InternalsVisibleTo 声明。

我试图从我的 snk 文件提取公钥使用 sn 实用程序,但它生成一个有线二进制文件,我不知道如何使用。我怎样才能解决这个问题?

35761 次浏览

我觉得你应该起个强势的名字,就像“公司”。产品。测试,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = 17135d9fcba0119f”。我猜是公司。产品。测试是程序集名称,17135d9fcba0119f 是公钥。

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

您需要对 both程序集进行签名,因为这两个程序集实际上是相互引用的。

你必须把公钥放在 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

您可以直接从您感兴趣的程序集中获取 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))));