我正在尝试了解使用Reflector的反汇编功能的方法。正如使用该工具的任何人所知道的那样,某些代码显示(可能)在原始源代码中未使用的C#标签。

在110行方法中,我查看了11条标签语句。随机摘要示例:

Label_0076:
    if (enumerator.MoveNext())
    {
        goto Label_008F;
    }
    if (!base.IsValid)
    {
        return;
    }
    goto Label_0219;
Label_0087:
    num = 0;
    goto Label_01CB;
Label_01CB:
    if (num < entityArray.Length)
    {
        goto Label_0194;
    }
    goto Label_01AE;
Label_01F3:
    num++;
    goto Label_01CB;


什么样的代码可使Reflector到处显示这些标签,为什么不能反汇编它们?

有破解它们的好技术吗?

最佳答案

您正在查看由编译器生成的代码。编译器不尊重您。不完全是。它也不尊重我或其他任何人。它查看我们的代码,嘲笑我们,然后重写它以使其尽可能高效地运行。

嵌套的if语句,递归,“ yield”,case语句和其他代码快捷方式将导致看起来很奇怪的代码。而且,如果您使用的Lambda包含很多外壳,那么不要指望它很漂亮。

在任何地方,编译器都可以重写您的代码以使其运行得更快。因此,没有任何一种“代码”会导致这种情况。 Reflector会尽力进行反汇编,但是无法从改写的版本中分辨出作者的原始代码。它尽最大努力(有时甚至是不正确的!)将IL转换为某种形式的可接受代码。

如果您难以解读它,则可以手动编辑代码以内联仅调用一次的goto,并将重构多次调用的goto重构为方法调用。另一种选择是将其分解为另一种语言。将IL转换为高级语言的代码并不相同。 C ++ / CLI反编译器可能会为您做得更好,但仍然足够相似(使用。查找/替换->)。

确实并没有万灵丹。至少直到有人编写一个更好的反汇编程序插件为止。

09-09 22:23