当我打开像ILSpy或dotPeek这样的工具时,我可以选择查看反编译的C#或IL。
当您查看反编译源时,反编译器是否将IL反向工程成反编译的C#?
如果是这样的话,那么反编译者将如何推断像下面这样的IL?(请注意,这是第一语言构造的一个微不足道的例子,它很难从IL中推断出来,而不是反编译器的实际输出):
IL_0000: nop // Do nothing (No operation)
IL_0001: ldstr "C" // Push a string object for the literal string
IL_0006: stloc.0 // Pop a value from stack into local variable 0
IL_0007: ret 翻译为:
public class C {
public void M() {
string foo = nameof(C);
}
}发布于 2017-04-12 08:41:17
是的,反编译工具必须从IL逆向工程。
这就是为什么需要为C#/VB的每个版本更新这些工具,如果您想让它们反编译新引入的语言特性。否则,如果该工具没有更新,它要么放弃对其进行反编译,要么会产生非常复杂的代码,而这个代码可能是疯子用该语言的早期版本编写的,但很可能没有。
一些反编译工具还将尝试定位实际的源代码(通过PDB和source服务器),如果它们在这方面取得了成功,那么您将看到实际的源代码,当然在这种情况下不会进行反编译工作。
发布于 2017-04-12 08:49:14
当然,这些工具将尝试从MSIL逆向工程,但是说到您的特定示例,不可能将MSIL反向工程到
public class C {
public void M() {
string foo = nameof(C);
}
}没有扩展指导,比如符号(.pdb)文件。尝试在库中编译上述语句,然后删除".pdb“文件并将.dll放入dotPeek中。您将看到它将像预期的那样解压缩:
public void M()
{
string foo = "C";
}现在,将.pdb文件放回,您将看到您的nameof(C)表达式返回。
现在将.pbd文件放回原处,但是更改用于编译.dll的源代码的位置(例如,重命名项目文件夹,完全删除它,或者将.dll与.pdb一起移动到不同的机器)。在dotPeek中再次加载它,您将再次看到string foo = "C";。这是因为.pdb符号可能包含指向实际源代码的路径(例如,您可能在异常堆栈跟踪中看到这些路径),然后反编译工具使用这些路径直接显示它,而不需要任何反编译。
https://stackoverflow.com/questions/43364450
复制相似问题