我有一个使用第三方DLL的签名应用程序。这些DLL没有签名。 - 到目前为止第一步没有问题:我刚刚签名(使用ildasm.exe获取* .il,* .il中的publickeytoken,因为它们具有相互依赖关系,并使用ilasm.exe创建* .dll)< / p>
该项目现在编制好并且也启动了。
但是在我的代码中,第三方DLL的类构造函数被调用(或其他东西? - 这是我做的第一件事),我得到错误“强名称签名的程序集必须在其InternalsVisibleTo声明中指定一个公钥“
如果您拥有DLL的源代码并且可以通过设置
来调整AssemblyInfo.cs,那么似乎不会有问题[assembly: InternalsVisibleTo("MyProject.Domain.Tests, PublicKey=..."]
但是:如上所述,我有一个第三方DLL 不拥有源代码。所以无法解决这样的问题。
有任何关于让它运行的建议吗?
答案 0 :(得分:9)
我有完全相同的问题。
为什么会发生
InternalsVisibleTo
声明第三方程序集,使其成为其他程序集的“朋友”,例如InternalsVisibleTo("OtherAssembly")
InternalsVisibleTo
属性必须指定其他程序集的公钥,例如InternalsVisibleTo("OtherAssembly, PublicKey=[key]")
InternalsVisibleTo
,因此它会抛出异常。如何修复
如果程序执行不需要“朋友”程序集(例如,它是未在生产中部署的测试程序集),请按照下列步骤操作:
ildasm.exe ThirdParty.dll /OUTPUT=ThirdParty.il
InternalsVisibleTo
ilasm.exe ThirdParty.il /DLL /OUTPUT=ThirdParty.modified.dll /KEY=key.snk
sn.exe -k key.snk
如果程序执行需要“朋友”程序集,则必须对所有这些朋友程序集进行签名。然后按照上面的类似步骤进行操作,除了不删除InternalsVisibleTo
之外,您必须使用正确的公钥修改每个声明。