如果将整个 c# 代码转换为一行并编译,它将反编译为 1 行

本文关键字:编译 一行 代码 转换 如果 | 更新日期: 2023-09-27 18:35:41

所以是的,我只是想知道,如果将某些 c# 代码转换为一行并对其进行编译,转换为 1 行的代码会反编译为一行吗?

例如原始代码:

if(blahblah=="123")
{
    //do something
}

例如,代码转换为一行:

if(blahblah=="123")
{
    //do something
    //if this is compiled; would it decompile to one line or would it 
    //Decompile to the Original code shown above?
}

如果将整个 c# 代码转换为一行并编译,它将反编译为 1 行

c#.net 编译为 MSIL。在 MSIL 中,这两个示例的表示方式完全相同。类似的东西

load variable blahblah
load constant 123
compare for equality

MSIL 不关心空格。反编译器只是将 MSIL 转换回 C#。这两个示例将反编译相同,因为它们都生成相同的 MSIL

由于编译

生成的 CIL 中没有记录"行"这样的东西,因此像 ILSpy 等这样的反编译器不会与原始中的行数匹配。

它还会在间距、局部变量名称、模式(switch 有时被编译为 if-else 链,因此反编译器充其量只能猜测是否应该反编译器来切换或 if)、不使用的常见习语(如果你编写一个显式混合使用、GetEnumerator、MoveNext 和 Current,反编译器怎么知道你没有使用正常的 foreach?), 甚至是代码的存在,因为如果编译器跳过一个死分支,那么它在 CIL 中不存在反编译回来)。

调试信息将使反编译更加忠实(如果存在并且反编译器使用它)。