Share via


リフレクション出力による MSIL 命令の出力

ILGenerator クラスには、Microsoft Intermediate Language (MSIL) を出力するために使用できるメソッドが用意されています。 ConstructorBuilder.GetILGenerator メソッドは、コンストラクターの ILGenerator を戻します。 MethodBuilder.GetILGenerator メソッドは、メソッドの ILGenerator を戻します。

注意

動的なメソッドが実行されるときに、Just-In-Time (JIT) コンパイラが呼び出されて、MSIL がネイティブ コードに変換されます。この時点で例外をスローできます。たとえば、メソッド本体が最大許容サイズなどの内部の制限を超えた場合に、InvalidProgramException をスローできます。出力された MSIL を強制的に検査するために SkipVerification が拒否された場合には、内部 VerificationException 例外で TargetInvocationException をスローできます。開発中は、SkipVerification を拒否することをお勧めします。コードを検証することにより、プログラムの安定性および品質を向上させることができるためです。

ILGenerator クラスで提供されるサービスを次に示します。

  • さまざまな形式の ILGenerator.Emit メソッドを使用して各種の命令を出力します。 これらの命令は、命令の種類に応じてさまざまなオペランドをとります。

  • ラベルを宣言します。 命令ストリーム上のラベルの位置を指定するには、異なるメソッドを使用します。

  • MSIL ストリーム上の位置をラベルでマークします。

  • 例外をスローします。

  • 行をコンソールに出力します。

  • 例外ブロックを定義します。

    • ILGenerator.BeginExceptionBlock によって例外ブロックが開始されます。

    • ILGenerator.BeginExceptFilterBlock によってフィルター例外ハンドラーが開始されます。

    • ILGenerator.BeginCatchBlock によって型指定例外ハンドラーが開始されます。

    • ILGenerator.BeginFinallyBlock によって finally ハンドラーが開始されます。

    • ILGenerator.BeginFaultBlock によってフォールト ハンドラーが開始されます。

    • ILGenerator.EndExceptionBlock によって例外ブロックが終了します。

catch ハンドラーの場合、呼び出しシーケンスは次のテンプレートのようになります。

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

フィルター ハンドラーの場合、呼び出しシーケンスは次のテンプレートのようになります。

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

参照

その他の技術情報

リフレクション出力の使用