Émission d'instructions MSIL avec l'émission de réflexion
La classe ILGenerator fournit des méthodes qui permettent d'émettre du code en langage MSIL (Microsoft Intermediate Language). La méthode ConstructorBuilder.GetILGenerator retourne un ILGenerator pour un constructeur. La méthode MethodBuilder.GetILGenerator retourne un ILGenerator pour une méthode.
Remarque |
---|
Lorsque des méthodes dynamiques sont exécutées, le compilateur juste-à-temps (JIT) est appelé pour convertir le langage MSIL en code natif.À ce stade, des exceptions peuvent être levées.Par exemple, InvalidProgramException peut être levée si le corps de la méthode dépasse une limitation interne, telle que la taille maximale autorisée.TargetInvocationException peut être levée, avec une exception VerificationException interne, si SkipVerification est refusé pour forcer la vérification du MSIL émis.Il est recommandé de refuser SkipVerification pendant le développement, car la vérification du code améliore la stabilité et la qualité du programme. |
Les services suivants sont fournis par la classe ILGenerator :
Émission de plusieurs types d'instructions en utilisant différentes formes des méthodes ILGenerator.Emit. Ces instructions prennent plusieurs types d'opérandes en fonction du type d'instruction.
Déclaration d'une étiquette. La position de l'étiquette dans le flux d'instructions est spécifiée en utilisant une autre méthode.
Marquage d'une position dans le flux MSIL avec une étiquette.
Levée d'une exception.
Écriture d'une ligne sur la console.
Définition d'un bloc d'exception.
ILGenerator.BeginExceptionBlock commence un bloc d'exception.
ILGenerator.BeginExceptFilterBlock commence un gestionnaire d'exceptions filtré.
ILGenerator.BeginCatchBlock commence un gestionnaire d'exceptions typé.
ILGenerator.BeginFinallyBlock commence un gestionnaire finally.
ILGenerator.BeginFaultBlock commence un gestionnaire de pannes.
ILGenerator.EndExceptionBlock termine un bloc d'exception.
Pour les gestionnaires catch, la séquence d'appels devrait ressembler au modèle suivant :
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
Pour les gestionnaires filtrés, la séquence d'appels devrait ressembler au modèle suivant :
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