重写.Net DLL的方法

我有一个旧的.NET DLL,我丢失了源代码,我想看看我是否可以改变它的行为。

它有一个接收字符串并返回字符串的方法。

我想重写这个方法,以便我可以返回

startStr + " test"; 

我尝试了.NETreflection器,但它生成的项目有一堆奇怪的错误,所以我无法重新编译它。

然后我尝试了Reflexil,但它只提供了assembly级别的更改。

有什么办法可以在C#中重写方法并让DLL使用我的方法吗?

Reflexil应该能够为您处理 – 您需要在Reflector中切换到IL视图,然后您可以转到要更改的方法,拉出Reflexil并进行更改。 这避免了将程序集反编译为源代码的问题(这对我来说从来没有对我有效而没有错误)。

如果您只想将字符串附加到字符串变量,您可以执行以下操作:

 // 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可能不同。 如果您需要这些文件进行更改,请与我们联系。

你尝试过扩展方法吗? 只需在现有类中添加另一种方法即可。

你这样做:

 public static class Foo { public static String SomeMethod (this Bar bar) { return bar.OriginalMethod()+" test"; } } 

如果原来的class级是Bar

我从来没有使用.NETreflection器,但是你可以尝试使用ReSharper制造商JetBrains提供的免费反编译器,它从未让我失望过。 http://www.jetbrains.com/decompiler/

另外,既然你说dll很老了,那么Reflector生成项目中的编译错误是不是由不同版本的引用或目标框架产生的?