Ausgeben von MSIL-Anweisungen mittels Reflektionsausgabe

Die ILGenerator-Klasse stellt Methoden zur Ausgabe von MSIL (Microsoft Intermediate Language) zur Verfügung. Die ConstructorBuilder.GetILGenerator-Methode gibt einen ILGenerator für einen Konstruktor zurück. Die MethodBuilder.GetILGenerator-Methode gibt einen ILGenerator für eine Methode zurück.

Hinweis

Wenn dynamische Methoden ausgeführt werden, wird der JIT-Compiler (Just-In-Time) aufgerufen, um MSIL in systemeigenen Code zu konvertieren. Ausnahmen können an diesem Punkt ausgelöst werden. Zum Beispiel kann InvalidProgramException ausgelöst werden, wenn der Methodentext eine interne Begrenzung überschreitet, etwa die maximal erlaubte Größe. TargetInvocationException kann mit einer inneren VerificationException-Ausnahme ausgelöst werden, wenn SkipVerification abgelehnt wird, um die Überprüfung der Ausgabe von MSIL zu erzwingen. Die Ablehnung von SkipVerification wird während der Entwicklung empfohlen, da die Codeüberprüfung Programmstabilität und Qualität verbessert.

Folgende Dienste werden über die ILGenerator-Klasse zur Verfügung gestellt:

  • Ausgabe verschiedener Arten von Anweisungen mithilfe verschiedener ILGenerator.Emit-Methoden. Diese Anweisungen erfordern, je nach Typ, verschiedene Arten von Operanden.

  • Deklarieren einer Bezeichnung Die Position einer Bezeichnung im Anweisungsstream wird mithilfe verschiedener Methoden angegeben.

  • Markieren einer Position im MSIL-Stream mit einer Bezeichnung.

  • Auslösen einer Ausnahme.

  • Ausgabe einer Zeile auf der Konsole.

  • Definieren eines Ausnahmeblocks.

    • ILGenerator.BeginExceptionBlock startet einen Ausnahmeblock.

    • ILGenerator.BeginExceptFilterBlock startet einen gefilterten Ausnahmehandler.

    • ILGenerator.BeginExceptFilterBlock startet einen typisierten Ausnahmehandler.

    • ILGenerator.BeginFinallyBlock startet einen abschließenden Handler.

    • ILGenerator.BeginFaultBlock startet einen fault-Handler.

    • ILGenerator.BeginExceptionBlock beendet einen Ausnahmeblock.

Für catch-Handler sollte die Reihenfolge der Aufrufe folgender Vorlage entsprechen:

Emit some MSIL.
BeginExceptionBlock
Emit the MSIL for the try block.
BeginCatchBlock
Emit the MSIL for the handler.
BeginCatchBlock
Emit the MSIL for the handler.
BeginFaultBlock
Emit the MSIL for the fault block.
BeginFinallyBlock
Emit the MSIL for the finally block.
EndExceptionBlock

Für gefilterte Handler sollte die Reihenfolge der Aufrufe folgender Vorlage entsprechen:

Emit some MSIL.
BeginExceptionBlock
Emit the MSIL for the try block.
BeginExceptFilterBlock
Emit the MSIL for the filtered exception handler.
BeginCatchBlock
Emit the MSIL for the catch block. The catch handler should be supplied with a null type.
BeginFaultBlock
Emit the MSIL for the fault block.
BeginFinallyBlock
Emit the MSIL for the finally block.
EndExceptionBlock

Siehe auch

Weitere Ressourcen

Verwenden der Reflektionsausgabe