如何修补已签名的 dll

Posted

技术标签:

【中文标题】如何修补已签名的 dll【英文标题】:how to patch a signed dll 【发布时间】:2019-08-07 07:16:38 【问题描述】:

我有一个 C# 项目,它使用依赖于旧版本 DevExpress 的第三方库。此版本 DevExpress 的一个 dll(DevExpress.Utils.v9.2.dll) 中有一个错误。我使用 .NET Reflector 和 Reflexil 来修补 dll 并使用修补后的 dll 替换旧的。然后当我重建解决方案时,Visual Studio 显示错误:

错误 CS0012 类型“XtraForm”在未引用的程序集中定义。您必须添加对程序集“DevExpress.Utils.v9.2, Version=9.2.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a”的引用。

似乎原始 dll 已签名导致问题。我试过删除强名称,但它不起作用。如何解决?

【问题讨论】:

你能从原始 XtraForm 派生一个类,修复那里的错误,并引用新的 dll(它引用 Devexpress 的 dll) 如果您在生成 DevExpress XtraEditors v9.2 程序集时拥有有效的许可证,您仍然可以下载它。可能有一个次要版本升级,您仍然可以访问它可能会修复您遇到的错误。在反编译后尝试重建已签名的程序集也可能违反 DevExpress 最终用户许可协议 (EULA):devexpress.com/Support/EULAs/winforms-controls.xml @Brendon,据此post,该错误已在版本 10.1.8 中修复。 坦率地说,我认为您唯一的选择是升级到该版本。如果您拥有包含源代码的 v9.2 许可证,您可以自己修改它并将其提供给 DevExpress,后者将为您进行数字签名。但是,我不相信他们会使用反编译的源代码来做到这一点。 【参考方案1】:

使用 ILSpy 和朋友的绝佳替代品:dnSpy。

【讨论】:

【参考方案2】:

问题是其他程序集引用了签名的 DevExpress.Utils.v9.2.dll。修补后,dll 被取消,因此它不起作用。我自己解决了这个问题,方法是添加引用程序集以更新和删除强名称,并使用与 Reflexil 捆绑的 Strong Name Remover 更新引用程序集。

【讨论】:

以上是关于如何修补已签名的 dll的主要内容,如果未能解决你的问题,请参考以下文章

如何创建 SharePoint 2010 wsp 并包含已构建为 DLL 和强签名的 Web 部件

在 VS2010 中分析签名的 WinForm dll

如何做插件xydii.dlld的数字签名

如何检查文件是不是在 C# 中签名? [关闭]

如果我有符号,如何在 DLL 中找到参数签名并调用未导出的方法?

求助,dll标记为系统必备组件,对其强制签名