【问题标题】:Change C# code inside DLL programmatically以编程方式更改 DLL 中的 C# 代码
【发布时间】:2020-06-28 09:24:51
【问题描述】:

我得到了不时更新/发布的 .net dll(最初是用 C# 编写的)。我需要在这个 dll 中修改一小部分代码,以满足我的使用需求。

我每次都可以使用 dnSpy 进行这些更改,但我不喜欢每次都手动进行。

是否有可能实现 dll 内代码更改过程的自动化以及如何实现?
将 dll 转换为 IL 并更改 IL 指令然后再编译回来是否更容易,还是我应该完全反编译为 C# 然后使用 Roslyn 重新编译回来?

我更改的代码始终相同,并更改为相同的结果代码。

【问题讨论】:

  • 你要修改的代码不属于公共虚方法吗?
  • 只能扩展DLL代码
  • 答案应该在bing.com/…之间。
  • 这听起来确实像这里的错误方法。任何 good 方法都将涉及一个设计好的扩展点,它允许您在不需要反编译任何东西的情况下影响行为。你不能在这里做吗? 猴子补丁工具,但是... 至于 C# 与 IL:逆向工程到正确编译的正确 C# 并不总是可靠或可能的。重点:我想不出任何需要您尝试做的事情的好场景。如果您打算能够改变这一点:这将是一个扩展点。我看到人们尝试的最常见原因:绕过许可检查

标签: c# compilation roslyn decompiling intermediate-language


【解决方案1】:

您想要实现的可能解决方案是Mono.Cecil

使用 Cecil,您可以加载现有的托管程序集,浏览所有 包含的类型,即时修改它们并保存回磁盘 修改程序集。

coverlet 等工具正在使用此库,这些工具会动态更改程序集以便能够计算代码覆盖率。

话虽如此,我非常同意 Marc Gravell 的评论,即乍一看这似乎是错误的方法,而改变设计会更合适。

【讨论】:

  • 感谢您提到 Mono.Cecil,我认为它只进行反编译,但如果它允许重新编译,那么它肯定值得研究!关于设计更改,存在一个问题,因为作者不想合并我的更改,并且每次更新依赖项时都必须手动添加它们。
  • 是的,您可以使用 AssemblyDefinition.Write 方法使更改持久化。你可以在这里找到一个小例子:mono-project.com/docs/tools+libraries/libraries/Mono.Cecil/faq/…
猜你喜欢
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多