2012-04-21 13 views
19

Da diese IL-Codes, was ich mehr sehe, ich mag lernen, sie richtig zu interpretieren.Wie lerne ich IL auf der CLR

ich keine Dokumentation wie C# Compiler oder andere so denke ich, ich kann ziemlich viel kümmern uns um den Rest finden konnte, nachdem ich dieses gewöhnlichsten lernen:

Im Folgenden sind einige IL Beispielcodes enthält, was ich brauche zu wissen:

Probe 1:

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  15 (0xf) 
    .maxstack 1 
    .locals init ([0] class EnumReflection.DerivedClass derivedClass) 
    IL_0000: nop 
    IL_0001: newobj  instance void EnumReflection.DerivedClass::.ctor() 
    IL_0006: stloc.0 
    IL_0007: ldloc.0 
    IL_0008: callvirt instance void EnumReflection.DerivedClass::WriteOutput() 
    IL_000d: nop 
    IL_000e: ret 
} // end of method Program::Main 

Probe 2:

.method public hidebysig specialname rtspecialname 
     instance void .ctor() cil managed 
{ 
    // Code size  38 (0x26) 
    .maxstack 8 
    IL_0000: ldarg.0 
    IL_0001: ldstr  "Hello" 
    IL_0006: stfld  string EnumReflection.DerivedClass::hello 
    IL_000b: ldarg.0 
    IL_000c: ldstr  "World" 
    IL_0011: stfld  string EnumReflection.DerivedClass::world 
    IL_0016: ldarg.0 
    IL_0017: ldc.i4.s 123 
    IL_0019: stfld  int32 EnumReflection.DerivedClass::age 
    IL_001e: ldarg.0 
    IL_001f: call  instance void EnumReflection.BaseClass::.ctor() 
    IL_0024: nop 
    IL_0025: ret 
} // end of method DerivedClass::.ctor 

Ich weiß, was diese Codes tun, seit ich sie produziert habe :-), aber ich würde gerne mehr über entsprechende IL-Code erfahren.

Diese Beispiele enthalten IL-Codes wie, und könnten Sie bitte Befehl mit Fragezeichen erklären? Und wofür stehen diese Befehle? So können wir sie uns leicht merken.

  • nop (für Debugging - kein Betrieb)
  • NEWOBJ (es scheint, es neues Objekt in Haufen schafft)
  • stloc.0?
  • ldloc.0?
  • ret?
  • ldarg.0?
  • ldstr?
  • stfld?
  • ldc.i4.s?
  • .ctor - Konstruktor

IL zu verstehen, ist wichtig, da es, wie bestimmte Compiler macht Codes und wirken in bestimmten Fällen erzeugt.

Allerdings konnte ich keine schöne Dokumentation finden, die auch Beispiele über IL enthält. CLR mit C# 3.0 ist ein gutes Buch, aber schließlich ist es kein IL-Buch, also erklärt es nicht alles über IL.

EDIT:

Ich habe die Spezifikationen gefunden und sie sagen diese: Dank @usr.

  • nop (für Debugging - kein Betrieb)
  • NEWOBJ - erstellen Sie ein neues Objekt
  • stloc.0 - pop Wert von Stapel zu lokalen Variablen
  • ldloc.0? - lokale Variable auf den Stack laden
  • ret - von der Methode
  • ldarg.0 zurückladen - Lade Argument 0 auf den Stack.
  • ldstr - Ein Literal Zeichenfolge
  • stfld laden - Laden in ein Feld eines Objekts
  • ldc.i4.s - Push-num auf dem Stapel als int32, Kurzform.
  • .ctor - Konstruktor
+1

die engen Wähler zu lernen.. I edited meine Frage ... – Tarik

+0

änderte ich den Titel, den ich. denke das ist eine absolut gültige Frage – usr

+0

@usr: Danke für den Titelwechsel, es su Das sieht jetzt gut aus. – Tarik

Antwort

7

Microsoft standardized the CLR and published those standards. Partition III enthält eine Fülle von Informationen über IL/CIL und eignet sich zum Lernen. Es ist ein ausgezeichnetes Dokument.

Sie können IL auch anhand von Beispielen lernen. Kompiliere ein paar einfache Methoden in C# und betrachte die IL im Reflektor (sie hat einen IL-Modus).

+0

Das habe ich gemacht, aber ich würde lieben, wofür diese Befehle auch stehen. – Tarik

+0

Ja, ich empfehle Ihnen, dann in die Spezifikation zu schauen. Partition III sieht tatsächlich ziemlich gut und verständlich aus. – usr

+0

Ich habe gefunden, was ich eigentlich in den Spezifikationen hier in dieser pdf-Akte suche: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-335.pdf – Tarik

7

Wenn Sie eine kurze Übersicht über jeden Opcode wünschen, können Sie schlechter vorgehen, als den System.Reflection.Emit Namensraum zu untersuchen. Beispielsweise gibt es eine OpCodes Klasse, die für jeden Opcode ein statisches Feld aufweist. Jeder einzelne davon wird dann im Hinblick auf sein Stack-Verhalten detaillierter beschrieben. Z.B. Ldarg_0:

Die ldarg.0 Anweisung drückt das Argument bei 0 in den Auswertungsstapel indexiert. Die ldarg.0-Anweisung kann verwendet werden, um einen Werttyp oder einen primitiven Wert in den Stapel zu laden, indem sie von einem eingehenden Argument kopiert wird.

8
  • NOP - no-op
  • NEWOBJ - ein Objekt erstellen und dessen Konstruktor aufrufen.
  • stloc.0 - Pop einen Wert aus dem Stapel, und speichern sie in den ersten lokalen Variablen
  • ldloc.0 - drücken Sie den ersten lokalen Variable auf den Stapel
  • RET - Rückkehr
  • ldarg.0 - drücken Sie das erste Argument (this in Instanzmethoden) auf den Stapel
  • ldstr - drücken Sie eine Zeichenfolge auf den Stapel
  • stfld - das Feld gesetzt, unter Verwendung von Daten auf dem Stapel.
  • ldc.i4.s - Drücken Sie die angegebene Nummer als Int.
  • .ctor - Konstruktor

Ich empfehle, dass Sie eine gute Quelle der Dokumentation zu diesen Opcodes finden (Wikipedia kann das Beste sein, obwohl :() Die Dokumentation für System.Reflection.Emit ziemlich detaillierte Dokumentation hat. . für Opcodes

und vor allem kleine Programme bauen und den IL-Ausgang prüfen, dass der beste Weg ist,