以编程方式更改DLL中的C#代码

以编程方式更改DLL中的C#代码,c#,compilation,roslyn,decompiling,intermediate-language,C#,Compilation,Roslyn,Decompiling,Intermediate Language,我得到了.NETDLL(最初是用C#编写的),它会不时更新/发布。这个dll中有一小部分代码需要修改,以满足我的使用需求 我可以每次使用dnSpy进行这些更改,但我不喜欢每次都手动进行 是否有可能在dll内自动执行代码更改过程,以及如何执行? 将dll转换为IL并更改IL指令然后将其编译回来更容易吗?还是应该将其完全反编译为C#,然后使用Roslyn重新编译回来 我更改的代码总是相同的,并且更改为相同的结果代码。对于您想要实现的目标,一个可能的解决方案是 使用Cecil,您可以加载现有托管程序集

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

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

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


我更改的代码总是相同的,并且更改为相同的结果代码。

对于您想要实现的目标,一个可能的解决方案是

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

该库正被一些工具使用,比如动态更改程序集以计算代码覆盖率的工具


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

一个可能的解决方案是

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

该库正被一些工具使用,比如动态更改程序集以计算代码覆盖率的工具


尽管如此,我非常同意Marc Gravell的评论,即乍一看,这似乎是错误的方法,对设计进行更改更合适。

您要修改的代码是否不属于公共虚拟方法?您只能扩展DLL代码。答案应该在其中。这听起来确实是错误的方法。任何好的方法都将涉及一个设计好的扩展点,它允许您在不需要反编译任何东西的情况下改进行为。你不能在这里这样做吗?有猴子补丁工具,但是。。。至于C#vs IL:将编译干净的C#逆向工程到适当的C#并不总是可靠或可能的。重点:我想不出有什么好的场景需要你去做。如果你想要改变这一点:它将是一个扩展点。我看到人们尝试的最常见的原因是:绕过许可检查您要修改的代码是否不属于公共虚拟方法?您只能扩展DLL codeAnswer应该在其中。这听起来确实是错误的方法。任何好的方法都将涉及一个设计好的扩展点,它允许您在不需要反编译任何东西的情况下改进行为。你不能在这里这样做吗?有猴子补丁工具,但是。。。至于C#vs IL:将编译干净的C#逆向工程到适当的C#并不总是可靠或可能的。重点:我想不出有什么好的场景需要你去做。如果你想要改变这一点:它将是一个扩展点。我看到人们尝试的最常见的原因是:绕过许可检查谢谢你提到Mono.Cecil,我认为它只能进行反编译,但如果它允许编译,那么它确实值得研究!关于设计更改,存在一个问题,因为作者不想合并我的更改,每次更新依赖项时我都必须手动添加这些更改。是的,您可以使用AssemblyDefinition.Write方法使更改保持不变。你可以在这里找到一个小例子:谢谢你提到Mono.Cecil,我认为它只能进行反编译,但如果它允许编译,那么它确实值得研究!关于设计更改,存在一个问题,因为作者不想合并我的更改,每次更新依赖项时我都必须手动添加这些更改。是的,您可以使用AssemblyDefinition.Write方法使更改保持不变。您可以在这里找到一个小示例: