强签名和更新引用程序集

时间:2010-05-11 19:22:36

标签: .net assemblies code-signing strongname

我有两个第三方集会:

Foo.dll

ReferencesFoo.dll

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

的程序集

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

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

3 个答案:

答案 0 :(得分:3)

您可以使用Mono.Cecil轻松完成此操作。打开Foo.dll和save it with your new snk,并将其在ReferenceFoo.dll中的引用更新为相应的公钥令牌。

答案 1 :(得分:2)

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

但是你必须要知道修改第三方组件可能是非法的。所以在这之前确保没有法律问题。

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

  • MajorVersion,MinorVersion, BuildNumber,RevisionNumber(2字节 常数)
  • 标志(类型为4字节的位掩码 AssemblyFlags)
  • PublicKeyOrToken(Blob的索引 heap - 公钥或令牌 确定了这一点的作者 组件)
  • 名称(索引到字符串堆中)
  • Culture(索引到String堆)
  • HashValue(Blob堆的索引)

答案 2 :(得分:2)

我发现这篇文章准确地说明了如何做到这一点。

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

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