访问新签名的第三方DLL会出错

时间:2012-05-24 13:01:49

标签: .net dll .net-assembly strongname

我有一个使用第三方DLL的签名应用程序。这些DLL没有签名。 - 到目前为止第一步没有问题:我刚刚签名(使用ildasm.exe获取* .il,* .il中的publickeytoken,因为它们具有相互依赖关系,并使用ilasm.exe创建* .dll)< / p>

该项目现在编制好并且也启动了。

但是在我的代码中,第三方DLL的类构造函数被调用(或其他东西? - 这是我做的第一件事),我得到错误“强名称签名的程序集必须在其InternalsVisibleTo声明中指定一个公钥“

如果您拥有DLL的源代码并且可以通过设置

来调整AssemblyInfo.cs,那么似乎不会有问题
[assembly: InternalsVisibleTo("MyProject.Domain.Tests, PublicKey=..."]

但是:如上所述,我有一个第三方DLL 拥有源代码。所以无法解决这样的问题。

有任何关于让它运行的建议吗?

1 个答案:

答案 0 :(得分:9)

我有完全相同的问题。

为什么会发生

  • 使用InternalsVisibleTo声明第三方程序集,使其成为其他程序集的“朋友”,例如InternalsVisibleTo("OtherAssembly")
  • .NET要求强名称程序集只能与其他强名称程序集“友好”,在这种情况下,InternalsVisibleTo属性必须指定其他程序集的公钥,例如InternalsVisibleTo("OtherAssembly, PublicKey=[key]")
  • 在运行时,CLR发现没有为相关程序集正确声明InternalsVisibleTo,因此它会抛出异常。

如何修复

如果程序执行不需要“朋友”程序集(例如,它是未在生产中部署的测试程序集),请按照下列步骤操作:

  • 反汇编有问题的程序集:ildasm.exe ThirdParty.dll /OUTPUT=ThirdParty.il
  • 使用文本编辑器编辑IL文件,删除InternalsVisibleTo
  • 的任何声明
  • 汇编并签署IL:ilasm.exe ThirdParty.il /DLL /OUTPUT=ThirdParty.modified.dll /KEY=key.snk
  • 注意:按以下方式生成密钥:sn.exe -k key.snk

如果程序执行需要“朋友”程序集,则必须对所有这些朋友程序集进行签名。然后按照上面的类似步骤进行操作,除了不删除InternalsVisibleTo之外,您必须使用正确的公钥修改每个声明。