签名C#应用使用IdentityServer3遇强名称程序集InternalsVisibleTo公钥错误求助
这个错误的核心原因很明确:当你给程序集加上强名称签名后,InternalsVisibleTo特性不能只写目标程序集的名称,必须明确指定对方的公钥——这是强签名程序集之间共享内部成员的硬性要求。IdentityServer3的原生代码里的InternalsVisibleTo声明大概率是没有带公钥的,所以你重新签名它的dll后就触发了这个错误。
下面是具体的解决步骤:
提取你的签名公钥
打开Visual Studio开发者命令提示符,用sn.exe工具从你的keypairXXXX.snk文件里提取公钥:- 先导出公钥到文件:
sn -p keypairXXXX.snk publickey.pub - 然后查看完整的公钥字符串:
sn -tp publickey.pub
复制输出里的长十六进制公钥字符串(不是短的公钥令牌),后面要用到。
- 先导出公钥到文件:
修改IdentityServer3源码的InternalsVisibleTo声明
你需要获取IdentityServer3 2.0.0.0版本的源码,找到所有带有[InternalsVisibleTo]特性的地方(一般在AssemblyInfo.cs或者项目根的特性声明里),把原来的声明比如:[InternalsVisibleTo("IdentityServer3.Localization")]修改为包含公钥的形式,比如:
[InternalsVisibleTo("IdentityServer3.Localization, PublicKey=你的公钥字符串")]注意:所有涉及内部可见性的程序集都要这么改,包括IdentityServer3本身和它的Localization模块相互之间的声明,以及如果你的应用程序集需要访问IdentityServer3内部成员的话,也要在IdentityServer3的源码里添加对应的带公钥的
InternalsVisibleTo声明。重新编译并签名IdentityServer3的dll
用你的keypairXXXX.snk文件重新编译IdentityServer3的源码,确保编译后的dll都正确带上了强名称签名。编译时可以在项目属性的"签名"选项里选择你的snk文件,或者用sn.exe命令行签名。检查你的应用程序集的InternalsVisibleTo(如果有的话)
如果你的MVC应用或者资源服务器的程序集里有指向IdentityServer3的InternalsVisibleTo声明,也要更新为带公钥的版本,比如:[InternalsVisibleTo("IdentityServer3, PublicKey=你的公钥字符串")]
做完这些步骤后,重新部署你的应用,这个错误应该就能解决了。
内容的提问来源于stack exchange,提问作者vishak os

