使用反映發出以發出 MSIL 指令

ILGenerator 類別提供可用來發出 Microsoft Intermediate Language (MSIL) 的方法。 ConstructorBuilder.GetILGenerator 方法會傳回建構函式的 ILGeneratorMethodBuilder.GetILGenerator 方法會傳回方法的 ILGenerator

注意事項注意事項

在執行動態方法後會呼叫 Just-in-Time (JIT) 編譯器,將 MSIL 轉換為機器碼,此時可能會擲回例外狀況 (Exception)。例如,如果方法主體超出內部限制 (例如允許的大小上限),則可能會擲回 InvalidProgramException。如果為了強制驗證發出的 MSIL 而拒絕 SkipVerification 則可能會擲回 TargetInvocationException,包括內部的 VerificationException 例外狀況。由於驗證程式碼會改善程式的穩定性和品質,因此建議您在開發期間拒絕 SkipVerification

下列服務為 ILGenerator 類別所提供:

  • 使用 ILGenerator.Emit 方法的各種格式來發出不同指令。 這些指令根據指令的型別,接受各種運算元。

  • 宣告標記。 指令資料流中的標記位置使用不同方法來指定。

  • 以標記來標示 MSIL 資料流中的位置。

  • 擲回例外狀況。

  • 寫入一行至主控台 (Console)。

  • 定義例外狀況區塊。

    • ILGenerator.BeginExceptionBlock 啟動例外狀況區塊。

    • ILGenerator.BeginExceptFilterBlock 啟動篩選的例外狀況處理常式 (Exception Handler)。

    • ILGenerator.BeginCatchBlock 啟動型別例外狀況處理常式。

    • ILGenerator.BeginFinallyBlock 啟動 Finally 處理常式。

    • ILGenerator.BeginFaultBlock 啟動錯誤處理常式。

    • ILGenerator.EndExceptionBlock 結束例外狀況區塊。

對於 Catch 處理常式,呼叫的順序應該像下列樣板 (Template):

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

請參閱

其他資源

使用反映發出