Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何声明好友程序集?_C#_Visual Studio 2008_Assembly Signing - Fatal编程技术网

C# 如何声明好友程序集?

C# 如何声明好友程序集?,c#,visual-studio-2008,assembly-signing,C#,Visual Studio 2008,Assembly Signing,我的解决方案中有两个项目: 汇编(基本库) 测试组件(NUnit) 我在第一个项目中将测试程序集声明为friends程序集: [assembly: InternalsVisibleTo ("Company.Product.Tests")] 一切都很顺利,直到我意识到我忘记设置解决方案来签署我的程序集。因此,创建了一个snk文件,并设置VisualStudio项目来签署第一个程序集(基本库)。现在,当我编译第一个项目时,我得到以下错误: 朋友程序集引用 “Company.Product.Test

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

  • 汇编(基本库)
  • 测试组件(NUnit)
  • 我在第一个项目中将测试程序集声明为friends程序集:

    [assembly: InternalsVisibleTo ("Company.Product.Tests")]
    
    一切都很顺利,直到我意识到我忘记设置解决方案来签署我的程序集。因此,创建了一个snk文件,并设置VisualStudio项目来签署第一个程序集(基本库)。现在,当我编译第一个项目时,我得到以下错误:

    朋友程序集引用 “Company.Product.Tests”无效。 必须使用强名称签名的程序集 在其密钥中指定公钥 对声明的内部可视性


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

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

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

    您需要在两个程序集上签名,因为实际上两个程序集都相互引用

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

    您可以直接从感兴趣的程序集中获取公钥, 使用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))));
    
    
    var assemblyName=Assembly.getExecutionGassembly().GetName();
    Console.WriteLine(“{0},PublicKey={1}”,
    名字,名字,
    Join(“,assemblyName.GetPublicKey().Select(m=>string.Format(“{0:x2}”,m)));
    
    我认为我们不需要指定版本号和区域性(请参阅)。我还没有真正尝试将测试代码放入程序集本身。将尝试看看它是如何工作的(+1为提示)。对于InternalsVisibleTo,PublicKeToken是不够的。您需要完整的公钥:-(看到MSDN文档()提到短得离谱的公钥,它对我来说几乎像公钥令牌。你可以直接从.snk文件中提取公钥:sn-k MyStrongnameKey.snk//sn-p MyStrongnameKey.snk public.pk//sn-tp public.pk//我使用了
    AssemblyInfo.cs
    中指定的“程序集标题”。从那时起,我就推断出了正确的名称use是项目的“属性/应用程序”对话框中的“程序集名称”(它与Visual Studio的解决方案资源管理器中的项目名称再次不同)。尽管这些回答和评论很有帮助,但我需要一些实验来认识到公钥是来自包含测试的程序集的公钥,而不是来自包含“InternalsInvisibleTo”声明的程序集。@Andreas:它与您命名的程序集一起使用-您指定的是程序集的强名称to信任,在执行信任的程序集中。这不是对这个问题的回答。它应该是对