Frage

Ich versuche, eine Methode mit der Zerlegung Merkmale Reflector zu verstehen. Als jemand, der dieses Werkzeug verwendet werden wissen, bestimmter Code wird mit C # Etikett angezeigt, die (vermutlich) nicht in der Originalquelle verwendet wird.

In der Linie 110 Methode der Suche Ich bin an gibt es 11 Label-Anweisungen . Zufällige Snippet Beispiele:

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;

Was für eine Art von Code macht Reflector diese Etiketten angezeigt werden überall und warum kann es nicht sie zu zerlegen?

Gibt es eine gute Technik, sie zu entschlüsseln?

War es hilfreich?

Lösung

Sie befinden sich in Code suchen vom Compiler generiert. Der Compiler nicht respektiert Sie nicht. Nicht wirklich. Es ist nicht respektieren mich oder jemand anderes, auch nicht. Es sieht in unserem Code, spottet uns und schreibt es so effizient wie möglich zu laufen.

Verschachtelte if-Anweisungen, Rekursion, "Ausbeute" s, Case-Anweisungen und andere Code-Verknüpfungen werden in seltsam aussehenden Code führen. Und wenn Sie lambdas mit vielen Gehäusen mit, na ja, nicht erwarten, dass es schön zu sein.

Jeder, wo jede Chance der Compiler den Code neu schreiben kann, um es schneller laufen, es wird. So gibt es nicht eine „Art von Code“, die dies verursachen wird. Reflektor tut sein Bestes, auseinander zu nehmen, aber es kann der Autor der Original-Code von seiner neu geschriebene Version nicht göttlich. Es tut sein Bestes (was manchmal sogar falsch ist!) IL in irgendeiner Form von akzeptablen Code zu übersetzen.

Wenn Sie eine harte Zeit haben es zu entziffern, könnten Sie den Code inline GOTOs bearbeiten, dass nur ein einziges Mal und refactor GOTOs aufgerufen, die mehr als einmal in Methodenaufrufen aufgerufen werden. Eine weitere Alternative ist zu zerlegen in einer anderen Sprache. Der Code, der IL in höheren Sprachen übersetzt ist nicht das gleiche. Die C ++ / CLI -Decompiler für Sie einen besseren Job machen und immer noch ähnlich genug (Suchen / Ersetzen. -> mit) sein. Verständlich sein

Es gibt wirklich kein Allheilmittel für diese; zumindest nicht, bis jemand schreibt ein besseres Disassembler Plugin.

Andere Tipps

Eigentlich ist der C # -Compiler nicht viel von jeder Optimierung tun - es läßt, dass an den JIT-Compiler (oder ngen). Als solche erzeugt die IL ist es ziemlich konsistent und vorhersehbar, weshalb Tools wie Reflektor der Lage sind, IL zu dekompilieren so effektiv. Eine Situation, in der die Compiler Code tut Transformation ist in einer Iterator Methode. Das Verfahren Sie nach dem Vorbild der im wahrscheinlich enthalten etwas suchen:

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

Da die Iterator Transformation ziemlich komplex sein kann, kann Reflector wirklich nicht damit umgehen. Um sich mit, was zu suchen, schreiben Sie Ihre eigene Iteratormethoden und sie durch Reflektor laufen, um zu sehen, welche Art von IL basierend auf C # -Code generiert wird. Dann werden Sie wissen, was zu suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top