Condividi tramite


Creazione di istruzioni MSIL tramite reflection emit

La classe ILGenerator fornisce metodi utilizzabili per la creazione di linguaggio Microsoft Intermediate Language (MSIL). Il metodo ConstructorBuilder.GetILGenerator restituisce un ILGenerator per un costruttore. Il metodo MethodBuilder.GetILGenerator restituisce un ILGenerator per un metodo.

NotaNota

Quando vengono eseguiti metodi dinamici, viene chiamato il compilatore JIT (Just-In-Time) per convertire il codice MSIL in codice nativo.A questo punto possono essere generate eccezioni.Ad esempio, può essere generata l'eccezione InvalidProgramException se il corpo del metodo supera una limitazione interna quale la massima dimensione consentita.Può essere generata l'eccezione TargetInvocationException, con un'eccezione VerificationException interna, se l'oggetto SkipVerification viene rifiutato per forzare la verifica del codice MSIL generato.È consigliabile rifiutare SkipVerification durante lo sviluppo, perché la verifica del codice migliora la stabilità e la qualità del programma.

La classe ILGenerator fornisce i seguenti servizi:

  • Creazione di vari tipi di istruzioni utilizzando diverse forme di metodi ILGenerator.Emit. In queste istruzioni è possibile utilizzare diversi tipi di operandi, a seconda del tipo dell'istruzione stessa.

  • Dichiarazione di un'etichetta. La posizione dell'etichetta nel flusso di istruzioni è specificata mediante un metodo differente.

  • Contrassegno di una posizione nel flusso MSIL tramite un'etichetta.

  • Generazione di un'eccezione.

  • Scrittura di una riga nella console.

  • Definizione di un blocco di eccezioni.

    • ILGenerator.BeginExceptionBlock inizia un blocco di eccezioni.

    • ILGenerator.BeginExceptFilterBlock inizia un gestore eccezioni filtrato.

    • ILGenerator.BeginCatchBlock inizia un gestore eccezioni tipizzato.

    • ILGenerator.BeginFinallyBlock inizia un gestore di tipo finally.

    • ILGenerator.BeginFaultBlock inizia un gestore di tipo fault.

    • ILGenerator.EndExceptionBlock termina un blocco di eccezioni.

Per i gestori di tipo catch è opportuno che la sequenza delle chiamate rispetti il seguente modello:

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

Per i gestori filtrati è opportuno che la sequenza delle chiamate rispetti il seguente modello:

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

Vedere anche

Altre risorse

Utilizzo della reflection emit