我有一个旧的 .NET DLL,我丢失了它的源代码,我想看看我是否可以改变它的行为。
它有一个接收字符串并返回字符串的方法。
我想重写这个方法,以便我可以返回
startStr + " test";
我尝试了 .NET 反射器,但它产生的项目有一堆奇怪的错误,所以我无法重新编译它。
然后我尝试了 Reflexil,但它只提供装配级别的更改。
有什么方法可以重写 C# 中的方法并让 DLL 使用我的方法吗?
我有一个旧的 .NET DLL,我丢失了它的源代码,我想看看我是否可以改变它的行为。
它有一个接收字符串并返回字符串的方法。
我想重写这个方法,以便我可以返回
startStr + " test";
我尝试了 .NET 反射器,但它产生的项目有一堆奇怪的错误,所以我无法重新编译它。
然后我尝试了 Reflexil,但它只提供装配级别的更改。
有什么方法可以重写 C# 中的方法并让 DLL 使用我的方法吗?
您是否尝试过扩展方法?只需将另一个方法添加到现有类。
您可以通过以下方式执行此操作:
public static class Foo {
public static String SomeMethod (this Bar bar) {
return bar.OriginalMethod()+" test";
}
}
如果原来的类是Bar
.
Reflexil 应该能够为您处理这个问题——您需要在 Reflector 中切换到 IL 视图,然后您可以转到您想要更改的方法,拉起 Reflexil 并进行更改。这避免了将程序集反编译为源代码的问题(这对我来说从来没有在 Reflector 中出现错误)。
如果您只想将字符串附加到字符串变量,则可以执行以下操作:
// assuming your original string is already on the stack
ldstr " test"
call System.String System.String::Concat ( System.String, System.String )
这将在堆栈上创建一个test
附加的新字符串。完成编辑后,您可以将程序集保存回磁盘。
如果你需要更复杂的东西(比如附加一个函数调用返回的字符串),你只需要调用正确的方法,然后调用Concat()
堆栈上的两个字符串。
但是,如果您的原始方法返回一个字符串,那么将其包装在新程序集中的新函数中可能是一个更好的解决方案。如果您确实需要更改原始程序集,我只会编辑 IL,因为 - 例如 - 从特定方法返回的字符串在同一个程序集中使用,并且您需要该程序集中的其他函数才能查看更改的返回值。
注意:我为此使用了 Reflector 6.8.2.5 和 Reflexil 1.0 - 当前的 Reflector / Reflexil 可能不同。如果您需要这些文件进行更改,请告诉我。
我从未使用过 .NET 反射器,但您可以尝试使用 ReSharper 的制造商 JetBrains 提供的免费反编译器,它从未让我失望。http://www.jetbrains.com/decompiler/
顺便说一句,既然你说这个dll很旧,那么Reflector生成的项目中的编译错误难道不是由不同版本的引用或目标框架产生的吗?