我有一个旧的.NET DLL,我丢失了源代码,我想知道是否可以改变它的行为。
它有一个接收字符串并返回字符串的方法。
我想重写这个方法,以便我可以返回
startStr + " test";
我尝试使用.NET反射器,但它生成的项目有一堆奇怪的错误,所以我无法重新编译它。
然后我尝试了Reflexil,但它只提供了装配级别的更改。
有什么方法可以在C#中重写方法并让DLL使用我的方法吗?
答案 0 :(得分:4)
您是否尝试过扩展方法?只需在现有类中添加另一种方法即可。
你这样做:
public static class Foo {
public static String SomeMethod (this Bar bar) {
return bar.OriginalMethod()+" test";
}
}
如果原始课程为Bar
。
答案 1 :(得分:4)
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,因为 - 例如 - 从特定方法返回的字符串在同一个程序集中使用,你需要该程序集中的其他函数来查看更改的返回值。 / p>
注意:我使用了Reflector 6.8.2.5和Reflexil 1.0 - 当前的Reflector / Reflexil可能不同。如果您需要这些文件进行更改,请与我们联系。
答案 2 :(得分:0)
我从未使用过.NET反射器,但你可以尝试使用ReSharper制造商JetBrains提供的免费反编译器,它从来没有让我失望过。 http://www.jetbrains.com/decompiler/
另一方面,既然你说dll很老了,那么Reflector生成的项目中的编译错误是不是由不同版本的引用或目标框架产生的?