4

我有一个使用第三方 DLL 的签名应用程序。这些 DLL 未签名。- 到目前为止,第一步没有问题:我刚刚签署了它们(使用 ildasm.exe 获取 *.il,在 *.il 中获取 publickeytoken,因为它们具有相互依赖性,并使用 ilasm.exe 生成 *.dll)

该项目现在可以正常编译并且也可以启动。

但是,当在我的代码中,调用 3rd-party-DLL 的类构造函数(或其他什么? - 只是我做的第一件事),我收到错误“强名称签名的程序集必须在它们的InternalsVisibleTo 声明”

如果您有 DLL 的源并且可以通过设置在 AssemblyInfo.cs 中进行调整,似乎不会有问题

[assembly: InternalsVisibleTo("MyProject.Domain.Tests, PublicKey=..."]

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

有什么建议可以让它运行吗?

4

1 回答 1

9

我有完全相同的问题。

为什么会发生

  • 声明第 3 方程序集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,您必须使用正确的公钥修改每个声明。

于 2012-08-30T17:47:35.360 回答