Emissão de instruções emissão de MSIL com reflexão
O ILGenerator classe fornece métodos que podem ser usados para emitir Microsoft intermediário language (MSIL). O ConstructorBuilder.GetILGenerator método retorna um ILGenerator para um construtor. O MethodBuilder.GetILGenerator método retorna um ILGenerator para um método.
Observação
Quando os métodos dinâmicos são executados, o compilador just-in-time (JIT) é chamado para converter o MSIL para código nativo.Exceções podem ser geradas neste momento.Por exemplo, InvalidProgramException pode ser lançada se o corpo do método exceder uma limitação de interna, como o tamanho máximo permitido.TargetInvocationExceptionpode ser lançada, com uma inner VerificationException exceção, se SkipVerification for recusada para forçar a verificação do MSIL emitido.Recusando SkipVerification durante o desenvolvimento é recomendada, pois a verificação de código melhora a estabilidade do programa e qualidade.
Os seguintes serviços são fornecidos pelo ILGenerator classe:
Emitir vários tipos de formas diferentes de instruções ILGenerator.Emit métodos. Essas instruções levar a diferentes tipos de operandos dependendo do tipo de instrução.
Declare um rótulo. A posição do rótulo no fluxo de instrução é especificada usando um método diferente.
Marca uma posição no fluxo de MSIL com um rótulo.
Lança uma exceção.
Escreva uma linha para o console.
Defina um bloco de exceção.
ILGenerator.BeginExceptionBlock começa um bloco de exceção.
ILGenerator.BeginExceptFilterBlock começa um manipulador de exceção filtrada.
ILGenerator.BeginCatchBlock começa um manipulador de exceção digitado.
ILGenerator.BeginFinallyBlock começa um manipulador finally.
ILGenerator.BeginFaultBlock começa um manipulador de falhas.
ILGenerator.EndExceptionBlock Finaliza um bloco de exceção.
Para manipuladores catch, a seqüência de chamadas deve lembrar o seguinte modelo:
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
Para manipuladores filtrados, a seqüência de chamadas deverá ser semelhante a seguinte modelo:
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