C# 重写.Net DLL的方法

C# 重写.Net DLL的方法,c#,.net,decompiling,C#,.net,Decompiling,我有一个旧的.NETDLL,我已经丢失了源代码,我想看看是否可以改变它的行为 它有一个接收字符串并返回字符串的方法 我想重写这个方法,这样我就可以返回 startStr + " test"; 我尝试了.NETReflector,但它生成的项目有一系列奇怪的错误,因此我无法重新编译它 然后我尝试了Reflexil,但它只提供程序集级别的更改 我有没有办法用C#重写这个方法,让DLL使用我的方法呢?我从来没有使用过.NET reflector,但是你可以尝试使用ReSharper的制造商JetBr

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

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

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

startStr + " test";
我尝试了.NETReflector,但它生成的项目有一系列奇怪的错误,因此我无法重新编译它

然后我尝试了Reflexil,但它只提供程序集级别的更改


我有没有办法用C#重写这个方法,让DLL使用我的方法呢?

我从来没有使用过.NET reflector,但是你可以尝试使用ReSharper的制造商JetBrains提供的免费反编译器,它从来没有让我失望过


另一方面,由于您说dll非常旧,Reflector生成的项目中的编译错误难道不是由不同版本的引用或目标框架产生的吗?

您尝试过扩展方法吗?只需向现有类添加另一个方法

您可以通过以下方式执行此操作:

public static class Foo {

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

}

如果原始类是
Bar

Reflectil应该能够为您处理此问题-您需要在Reflector中切换到IL视图,然后您可以转到要更改的方法,拉动Reflectil并进行更改。这避免了将程序集反编译为源代码的问题(在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,因为(例如)从特定方法返回的字符串在同一程序集中使用,并且您需要该程序集中的其他函数来查看更改的返回值

注:我使用了反射器6.8.2.5和Reflectil 1.0进行此操作-当前反射器/Reflectil可能不同。如果您需要这些文件进行更改,请告诉我。

我也建议您这样做。这个网站有很多关于你正在尝试做什么的文章。事实上,《牧民法典》采访了乔恩·麦考伊·盖伊。Jon是这方面的专家。Reflexil现在支持C#/VB.NET代码注入。