我有一个旧的.NET DLL,我丢失了源代码,我想看看是否可以改变它的行为。
它有一个接收字符串并返回字符串的方法。
我想重写这个方法,这样我就可以返回
startStr + " test";我尝试了.NET反射器,但是它生成的项目有很多奇怪的错误,所以我无法重新编译它。
然后,我尝试了Reflexil,但它只提供程序集级别的更改。
有没有办法用C#重写方法,让DLL使用我的方法?
发布于 2013-10-07 01:05:32
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和Reflil1.0来实现如果您需要这些文件来进行更改,请告诉我。
发布于 2013-10-07 01:05:05
你试过扩展方法吗?只需向现有类添加另一个方法即可。
你这样做是通过:
public static class Foo {
public static String SomeMethod (this Bar bar) {
return bar.OriginalMethod()+" test";
}
}如果最初的类是Bar。
发布于 2013-10-07 01:01:27
我从未使用过.NET反射器,但您可以尝试使用JetBrains ( ReSharper的制造者)提供的免费反编译器,它从未让我失望过。http://www.jetbrains.com/decompiler/
另外,既然您说dll很旧,那么Reflector生成的项目中的编译错误不能由不同版本的引用或目标框架生成吗?
https://stackoverflow.com/questions/19215670
复制相似问题