我试图了解使用反射的拆卸特征的方法。因为这是使用该工具的人会知道,某些代码将显示与该人(大概)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;

什么样的代码,使反射显示这些标签随处可见,为什么不能把它拆开呢?

有一个很好的技术破译呢?

有帮助吗?

解决方案

您正在浏览由编译器生成的代码。编译器不尊重你。不完全是。它不尊重我或者其他人,无论是。它着眼于我们的代码,在我们嘲笑,并重写它尽可能高效地运行。

嵌套的IF语句,递归,“产量” S,case语句,和其他代码的快捷方式将导致怪异的代码。如果你正在使用的lambda表达式有很多机箱,好了,不希望它是漂亮。

在任何地方,任何机会编译器可以重写代码,使其运行速度就越快。所以没有任何一个“之类的代码”,将导致此。反射会尽力拆卸,但它不能从它的重写版本神圣作者的原代码。它最好(有时甚至是不正确!)到IL翻译成某种形式的可接受的代码。

如果你有一个很难破译它,你可以手动编辑代码内联跳转的,只有被调用一次,重构后藤的被调用一次以上到方法调用。另一种方法是拆卸成另一种语言。这转化成IL高级语言的代码是不一样的。在C ++ / CLI反编译可以为你做一个更好的工作,仍然是足够相似(查找/替换 - >用)。是可以理解的。

有确实不是此银子弹;至少直到有人写入一个更好的反汇编器插件。

其他提示

事实上,C#编译器并没有做太多任何优化的 - 它的叶子,为JIT编译器(或NGEN)。因此,它产生的IL是相当一致的和可预测的,这就是为什么像反射工具能够如此有效地反编译IL。其中,编译器会改变你的代码的一种情况是在迭代方法。你在寻找可能的方法包含沿着线的东西:

foreach(var x in something)
  if(x.IsValid)
    yield return x;

由于迭代器转换可以是相当复杂的,反光不能真正处理它。要熟悉要寻找什么,写你自己的迭代方法和运行它们通过反射来看看根据你的C#代码被产生什么样的IL。然后,你就会知道要寻找什么。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top