3

我有两个第三方程序集:

Foo.dll

ReferencesFoo.dll

如前所述,ReferencesFoo.dll是一个引用Foo.dll

对于我的应用程序,我需要退出这些程序集。我将 ildasm/ilasm 与签名密钥结合使用来对它们进行签名,但是,ReferencesFoo.dll仍然包含(在它的清单中?)对Foo.dll旧公钥和公钥令牌的引用。

那么,如何使用我的密钥对两个 dll 进行签名,并在ReferencesFoo.dll不获取源代码和重新编译的情况下更新引用?

4

3 回答 3

3

您可以使用Mono.Cecil轻松做到这一点。打开 Foo.dll,将其与新的 snk 一起保存,并将 ReferenceFoo.dll 中的引用更新为适当的公钥令牌。

于 2010-05-11T20:20:31.577 回答
2

您可以使用 SN.exe 工具对程序集进行签名(使用 -R 开关对已签名的程序集进行签名)。

但是您必须意识到修改第三方组件可能是非法的。因此,请确保在这样做之前没有任何法律问题。

而且我不知道有任何工具可以自动更改引用。您可以在元数据表 #35 中找到它们,其结构如下:

  • MajorVersion、MinorVersion、BuildNumber、RevisionNumber(2 字节常量)
  • 标志(AssemblyFlags 类型的 4 字节位掩码)
  • PublicKeyOrToken(索引到 Blob 堆 - 标识此程序集作者的公钥或令牌)
  • 名称(字符串堆的索引)
  • 文化(字符串堆的索引)
  • HashValue(Blob 堆的索引)
于 2010-05-11T19:29:32.620 回答
2

我发现这篇文章确切地演示了如何做到这一点。

它涉及使用 sn、ildasm、ilasm 和文本编辑器。

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

于 2012-05-24T21:29:04.453 回答