Compartir a través de


Emitir instrucciones MSIL con la emisión de la reflexión

Actualización: noviembre 2007

La clase ILGenerator proporciona métodos que se pueden utilizar para emitir el Lenguaje intermedio de Microsoft (MSIL). El método ConstructorBuilder.GetILGenerator devuelve un objeto ILGenerator para un constructor. El método MethodBuilder.GetILGenerator devuelve un objeto ILGenerator para un método.

Nota:

Cuando se ejecutan métodos dinámicos, se llama al compilador Just-In-Time (JIT) para convertir MSIL en código nativo. En ese momento, se pueden producir excepciones. Por ejemplo, se puede iniciar InvalidProgramException si el cuerpo del método supera una limitación interna, como el tamaño máximo permitido. Se puede iniciar TargetInvocationException, con una excepción VerificationException interna, si se rechaza SkipVerification para forzar la comprobación del MSIL emitido. Se recomienda rechazar SkipVerification durante el desarrollo porque al comprobar el código, se mejoran la estabilidad y la calidad del sistema.

La clase ILGenerator ofrece los siguientes servicios:

  • Emitir varias clases de instrucciones a través de distintas formas de los métodos ILGenerator.Emit. Estas instrucciones utilizan clases de operandos diferentes en función de cual sea el tipo de instrucción.

  • Declarar una etiqueta. La posición de la etiqueta en la secuencia de la instrucción se especifica con un método diferente.

  • Marcar una posición en la secuencia MSIL con una etiqueta.

  • Producir una excepción.

  • Escribir una línea en la consola.

  • Definir un bloque de excepción.

    • ILGenerator.BeginExceptionBlock inicia un bloque de excepción.

    • ILGenerator.BeginExceptFilterBlock inicia un controlador de excepciones filtradas.

    • ILGenerator.BeginCatchBlock inicia un controlador de excepciones con tipo.

    • ILGenerator.BeginFinallyBlock inicia un controlador finally.

    • ILGenerator.BeginFaultBlock inicia un controlador fault.

    • ILGenerator.EndExceptionBlock finaliza un bloque de excepción.

En el caso de los controladores catch, el orden de las llamadas debe ser similar a la siguiente plantilla:

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

En el caso de los controladores filtrados, el orden de las llamadas debe ser similar a la siguiente plantilla:

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

Vea también

Otros recursos

Utilizar Reflection Emit