用反射发出来发出 MSIL 指令

ILGenerator 类提供可用于发出 Microsoft 中间语言 (MSIL) 的方法。 ConstructorBuilder.GetILGenerator 方法为构造函数返回 ILGeneratorMethodBuilder.GetILGenerator 方法为方法返回 ILGenerator

注意注意

执行动态方法时,会调用实时 (JIT) 编译器将 MSIL 转换为本机代码。此时可引发异常。例如,如果方法体超出了内部限制(如允许的最大大小),则会引发 InvalidProgramException。如果为了强制验证发出的 MSIL 而拒绝了 SkipVerification,则会引发 TargetInvocationException,同时会出现内部 VerificationException 异常。建议在开发过程中拒绝 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

请参见

其他资源

使用反射发出