Label_标记来自Reflector,以及如何解密它们?

Ale*_*gas 3 .net c# reflector disassembly

我正在尝试使用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;
Run Code Online (Sandbox Code Playgroud)

什么样的代码使Reflector在任何地方都显示这些标签,为什么不能将它们拆开呢?

是否有一种很好的解密技术?

Ste*_*nis 7

实际上,C#编译器没有做任何优化 - 它将它留给JIT编译器(或ngen).因此,它生成的IL非常一致且可预测,这就是为什么像Reflector这样的工具能够如此有效地反编译IL的原因.编译器转换代码的一种情况是迭代器方法.您正在查看的方法可能包含以下内容:

foreach(var x in something)
  if(x.IsValid)
    yield return x;
Run Code Online (Sandbox Code Playgroud)

由于迭代器转换可能非常复杂,因此Reflector无法真正处理它.要熟悉要查找的内容,请编写自己的迭代器方法并通过Reflector运行它们,以查看基于C#代码生成的IL类型.然后你会知道要寻找什么.