是否有任何C#反编译器可以显示与编写代码几乎相同的代码?

是否有任何C#反编译器可以显示与编写代码几乎相同的代码?,c#,decompiling,C#,Decompiling,我一直在使用reflector对几个简单的c#应用程序进行反编译,但我注意到,虽然代码正在反编译,但我仍然看不到它们在VS上编写的内容。我认为这就是编译器用机器代码代替人工指令的方式。不过我想我会试试,在这里问一下。也许有一个反编译器可以反编译并显示与原始代码几乎相同的代码。有几种。我目前正在使用这里找到的JustDecompile [编辑] 另一种方法是在此处找到.NET Reflector: 我相信它有一个免费版本,但没有花时间去看。现有的.Net反编译器通常会尽其所能进行反编译 您似乎要求

我一直在使用reflector对几个简单的c#应用程序进行反编译,但我注意到,虽然代码正在反编译,但我仍然看不到它们在VS上编写的内容。我认为这就是编译器用机器代码代替人工指令的方式。不过我想我会试试,在这里问一下。也许有一个反编译器可以反编译并显示与原始代码几乎相同的代码。

有几种。我目前正在使用这里找到的JustDecompile

[编辑]
另一种方法是在此处找到.NET Reflector:

我相信它有一个免费版本,但没有花时间去看。

现有的.Net反编译器通常会尽其所能进行反编译


您似乎要求提供变量名和行格式,但由于明显的原因,它们没有编译成IL。

基本上没有。通常有许多方法可以获得相同的IL代码,反编译器根本无法知道使用了哪种代码。

没有,也不应该有。像注释和不可访问的代码这样的东西只会增加膨胀,而绝对没有任何好处。您所能做的最好的事情就是对编译后的代码进行近似计算。

这是不可能的,因为有很多方法可以从不同的代码中获得相同的IL。例如,无法知道在声明类型上是否调用了fluent style vs explicit扩展方法。无法知道是否使用了LINQ与常规代码。所有形式的隐式操作可能存在,也可能不存在。删除的代码可能存在,也可能不存在。许多小于等于4个字节的原语(包括枚举)在使用IL时无法区分


如果您想要实际代码,请合法获取原始代码。

reflector不再免费。有一个旧版本是免费的,那是在产品被redgate收购之前。有一个免费版本——只有你有旧版本的副本,你现在才能得到它。我仍然有一份副本,但我认为他们不想让我分发它,哈哈(不确定它是否违反许可证,因为它过去是免费的。)“几乎”在马蹄铁和手榴弹中计算。反编译器在尝试反编译迭代器、匿名方法和lambda表达式时会崩溃。还有一些:反编译代码注释也不起作用。“…没有编译成IL”-实际上它们通常都是,需要主动模糊以消除变量名。(在某些情况下,变量名丢失,可能是由于发布模式优化和/或编译器生成的变量/代码)。@Todd:我认为这不是真的,除了PDB文件。我可能错了,可能只有类、方法(和参数名保存在dll中)-但是我记得在没有PDB文件的情况下找到要反编译的变量。出于同样的原因,我还反编译并找到了由变量名组成的反编译器,如“test”和“string”。可能这是一个调试dll,也可能我完全错了。@Todd局部变量名不会持久化-但反编译器在某些情况下可以很好地猜测名称(例如,方法的返回值)。参数、类和成员名称、常量。。。所有这些都仍然存在于IL中,因为.NET是为方便互操作而设计的-命名的局部变量对此没有任何帮助。此外,提升到闭包类(对于异步、lambdas或迭代器)的局部变量成为字段,因此它们的名称被持久化。