如何使用强名称程序集的"InternalsVisibleTo"属性?

Dav*_*ave 30 c# .net-assembly

我使用"InternalsVisibleTo"属性和程序集将内部方法/类公开给我的单元测试项目.

我现在需要将该程序集安装到GAC中,因此我需要给它一个强名称.当我尝试这样做时,我在Visual Studio中收到以下错误.

强名称签名程序集必须在其InternalsVisibleTo声明中指定公钥

一点谷歌搜索带我到下面的文章:

https://msdn.microsoft.com/en-us/library/bb763089.aspx

本文指出:

"确定强名友人集会的公钥."

本文未说明如何确定公钥.我在哪里可以找到装配的公钥?此外,一旦我有公钥,这是否是声明属性的正确方法?

[assembly: InternalsVisibleTo("Namespace.Assembly.Example.Name, PublicKey=ThePublicKey")]
Run Code Online (Sandbox Code Playgroud)

Inv*_*ard 52

对于使用Visual Studio 2017的任何人,都有最新的方法:

从我们心爱的IDE中,转到" 工具>外部工具... "和" 添加 "带有这些设置的新工具:

  • 标题:获取PublicKey
  • 命令:" C:\ Program Files(x86)\ Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools\sn.exe "(/!\选择与您的程序集NETFX版本匹配的NETFX工具版本,这里这是4.6.2)
  • 参数:-Tp $(TargetPath)
  • 选中"使用输出窗口"复选框

应用/确定这些更改.

在"解决方案资源管理器"中,单击项目程序集名称,然后转到" 工具>获取公钥 "."输出"窗口应显示(很长)公钥以及公共令牌密钥.

最后,在包含要公开的内部类(即测试项目)的项目中,打开" AssemblyInfo.cs "文件并添加以下行:

[assembly:InternalsVisibleTo("MyCompany.SolutionName.ProjectName,PublicKey = 在这里粘贴您的公钥 ")]

/!\您必须从公钥中删除换行符.

它对我来说非常有用,所以希望它也可以帮到你!

  • 工作得很好,但我必须至少成功地首先构建解决方案 (2认同)

Ale*_*kov 19

要使用InternalsVisibleTo强签名程序集,您的"朋友"程序集也必须进行强签名.需要将测试程序集的公共标记指定为InternalsVisibleTo值的一部分.

请注意,该属性在编译时不用于实际的程序集验证 - 它只指定运行时检查(以及朋友程序集的编译时检查)应验证该标识.因此,如果您需要编译主程序集,则可以指定任何公钥标记(例如,在Web.Config中的所有程序集引用中找到的Microsoft程序集中的一个).

通常,因为您将签署程序集,您将知道公钥.即如果你有snk文件而不是sn -t youSnk.snk显示公钥.或者,您可以按照在Visual Studio获取程序集的公钥标记中的步骤来配置VS,以显示用于sn -Tp {path to assembly}从程序集中获取公钥的任何程序集的公共标记.(如果文档已经过去,则将步骤复制到此问题其他答案)