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

jah*_*er1 4 .net dll strongname .net-assembly

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

该项目现在编译良好,也启动.

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

如果你有DLL的源代码似乎没有问题,并且可以通过设置调整AssemblyInfo.cs

[assembly: InternalsVisibleTo("MyProject.Domain.Tests, PublicKey=..."]
Run Code Online (Sandbox Code Playgroud)

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

有什么建议让这个运行?

Buu*_*yen 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,您必须使用正确的公钥修改每个声明.