【问题标题】:using unsigned assemblies in signed ones在签名的程序集中使用未签名的程序集
【发布时间】:2011-12-20 02:42:39
【问题描述】:

发现这些有用的链接是对 SO 的约束。

http://buffered.io/posts/net-fu-signing-an-unsigned-assembly-without-delay-signing/

How to fix "Referenced assembly does not have a strong name" error?

我遵循流程。这似乎很容易做到。只是想知道是否有一个点击式自动化工具可以为我执行此操作 - 特别是对于未签名的第 3 方 A.dll 引用未签名的 B.dll 而引用未签名的 C.dll 的情况。

【问题讨论】:

  • 请注意,您最终应该考虑签署它。延迟签名应该就是这样。在开发过程中延迟签名程序。你不应该在没有签名的情况下真正部署延迟签名的程序集。
  • IDE、Project + Properties、Signing 选项卡支持此功能。这就像点击一样。在构建之后执行它不是很有用或生产力。
  • @Hans Passant:这个问题是针对你无法控制的程序集。
  • 更改您无法控制的程序集是一个兔子洞。第三方运送未签名的程序集是犯罪行为,特别是考虑到签署它们是多么容易。行使您的支持选项,请他们签署。

标签: c# .net


【解决方案1】:

您可以自己对程序集进行签名,以便在您无法让作者为您强签名的项目中引用它们。

通过将程序集反汇编到 IL 中,然后使用您自己的强名称密钥文件重新组装它。

打开 Visual Studio 命令提示符 并浏览到包含未签名程序集的目录。从命令提示符运行以下命令。

ildasm.exe /all /typelist /out=My.Unsigned.Assemby.il My.Unsigned.Assemby.dll

这将创建名为 My.Unsigned.Assemby.il

的程序集的 IL 版本

接下来,您需要使用您的强名称密钥在不修改的情况下重新组装它。

ilasm.exe /dll /optimize /key=MyKeyFile.snk My.Unsigned.Assemby.il

您现在将得到相同的程序集,只是它的签名版本。您可以阅读有关 strong name key generation 的更多信息,但我假设您已经知道如何根据问题执行此操作。

更新:我编写了一个应用程序,可以从 UI、命令行或通过 API 以编程方式自动执行此操作。它处理所有边缘情况,以及使用正确的标志组装回正确的版本。您可以在此处阅读更多信息并下载该工具:http://brutaldev.com/post/2013/10/18/NET-Assembly-Strong-Name-Signer

【讨论】:

  • 你救了我!我想合并到我的项目中的开源项目没有签名,但是太复杂了,无法简单地重建为签名。你的工具是救命稻草!
  • 如果要签名的程序集依赖于另一个未签名的程序集,这两个程序集都必须在主项目中引用,您知道如何做到这一点吗?如果我只是使用此方法分别对两个程序集进行签名,则似乎第一个程序集在构建时不再识别第二个程序集,即使我新引用了 2,我也会收到“您必须添加引用...”错误已签名的程序集。
  • @GabrielS。您需要同时对它们进行签名,这样每个程序集都会检查它们是否引用了任何新签名的程序集并更新引用以使用强名称引用。如有必要,InternalsVisibleTo 也会更新。手册中都有:github.com/brutaldev/StrongNameSigner#dealing-with-dependencies
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
相关资源
最近更新 更多