重写 .Net DLL 的方法

jma*_*erx 5 .net c# decompiling

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

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

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

startStr + " test";
Run Code Online (Sandbox Code Playgroud)

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

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

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

xxb*_*bcc 5

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 )
Run Code Online (Sandbox Code Playgroud)

这将在堆栈上创建一个新字符串并附test加到它后面。完成编辑后,您可以将程序集保存回磁盘。

如果您需要更复杂的东西(例如附加函数调用返回的字符串),您只需调用正确的方法,然后调用Concat()堆栈上的两个字符串即可。

如果您的原始方法返回一个字符串,那么将其包装在新程序集中的新函数中可能是更好的解决方案。如果您确实需要更改原始程序集,我只会编辑 IL,因为 - 例如 - 从特定方法返回的字符串在同一程序集中使用,并且您需要该程序集中的其他函数来查看更改后的返回值。

注意:我为此使用了 Reflector 6.8.2.5 和 Reflexil 1.0 - 当前的 Reflector / Reflexil 可能有所不同。如果您需要这些文件进行更改,请告诉我。