【问题标题】:Accessing newly signed third party DLL gives error访问新签名的第三方 DLL 会出错
【发布时间】:2012-05-24 13:01:48
【问题描述】:

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

项目现在可以正常编译并启动了。

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

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

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

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

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

【问题讨论】:

    标签: .net dll .net-assembly strongname


    【解决方案1】:

    我遇到了完全相同的问题。

    为什么会发生

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

    【讨论】:

    • 使用 ilasm.exe 而不是用于反汇编的 ildasm.exe 来组装和签署 IL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多