如何申报朋友大会?
我在我的解决scheme中有2个项目:
- 大会(基础图书馆)
- testing程序集(NUnit)
我已经在第一个项目中宣布testing程序集为朋友程序集:
[assembly: InternalsVisibleTo ("Company.Product.Tests")]
一切工作正常,直到我意识到我忘了设置解决scheme签署我的程序集。 所以创build了一个snk文件并设置了visual studio项目来签署第一个程序集(Basic Library)。 现在,当我编译第一个项目,我得到以下错误:
朋友组件参考“Company.Product.Tests”无效。 强名称签名的程序集必须在其InternalsVisibleTo声明中指定一个公钥。
我尝试使用sn工具从我的snk文件提取公钥,但它生成一个有线的二进制文件,我不确定如何使用。 我该如何解决这个问题?
您需要签署两个程序集,因为两个程序集实际上是相互引用的。
您必须将公钥置于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
您可以直接从您感兴趣的程序集中获取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))));
我认为你需要input强大的名字,比如“Company.Product.Tests,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 17135d9fcba0119f”。 我假设Company.Product.Tests是您的程序集名称,17135d9fcba0119f是公钥。
解决这个问题的另一种方法是不使用单独的程序集。 我通常把源代码和testing代码放在同一个程序集中。 我不知道你是否有任何特别的关切,你必须把它们分开。