Questa documentazione è stata archiviata e non viene gestita.

Campo OpCodes.Calli

Chiama il metodo indicato nello stack di valutazione, come un puntatore a un punto di ingresso, con gli argomenti descritti da una convenzione di chiamata.

Spazio dei nomi: System.Reflection.Emit
Assembly: mscorlib (in mscorlib.dll)

public static readonly OpCode Calli
public static final OpCode Calli
public static final var Calli : OpCode

Nella tabella che segue vengono indicati il formato esadecimale e il formato dell'assembly MSIL (Microsoft Intermediate Language) dell'istruzione, insieme a un breve riepilogo di riferimento:

Formato

Formato dell'assembly

Descrizione

29 < T >

calli callSiteDescr

Chiama il metodo cui viene fatto riferimento con gli argomenti descritti dalla convenzione di chiamata.

Di seguito viene riportato il comportamento di transizione dello stack, in ordine sequenziale.

  1. Gli argomenti del metodo da arg1 a argN vengono inseriti nello stack.

  2. Il puntatore di ingresso del metodo viene inserito nello stack.

  3. Gli argomenti del metodo da arg1 a argN e il puntatore di ingresso del metodo vengono estratti dallo stack; viene eseguita la chiamata del metodo. Al termine, un valore restituito viene generato dal metodo chiamato e inviato al chiamante.

  4. Il valore restituito viene inserito nello stack.

L'istruzione calli chiama il puntatore di ingresso del metodo con gli argomenti da arg1 a argN. I tipi di questi argomenti sono descritti dalla specifica convenzione di chiamata (callSiteDesc). L'istruzione calli può essere immediatamente preceduta da un prefisso tail (Tailcall) per specificare che lo stato del metodo corrente deve essere liberato prima di trasferire il controllo. Se la chiamata trasferisse il controllo a un metodo più attendibile di quello di origine, lo stack frame non verrebbe liberato; l'esecuzione continuerebbe invece senza generare errori, come se tail non fosse stato fornito.

Si suppone che il puntatore di ingresso del metodo sia un puntatore specifico al codice nativo del computer di destinazione che può essere chiamato in modo valido con gli argomenti descritti dalla convenzione di chiamata, ovvero un token di metadati per una firma autonoma. Tale puntatore può essere creato utilizzando le istruzioni Ldftn o Ldvirtftn oppure passato dal codice nativo.

La convenzione di chiamata non viene controllata in modo dinamico, perciò il codice che utilizza un'istruzione calli non funziona correttamente se la destinazione non utilizza effettivamente la convenzione di chiamata specificata.

Gli argomenti vengono inseriti nello stack da sinistra a destra. In questo modo, il primo argomento viene calcolato e inserito nello stack, seguito dal secondo e dal terzo, finché tutti gli argomenti necessari si trovano nella parte superiore dello stack, in ordine decrescente. La sequenza di codice per la generazione dell'argomento per un'istanza o un metodo virtual deve inserire il riferimento all'istanza in questione, che non deve essere un riferimento null, prima di eventuali argomenti visibili all'utente.

L'eccezione SecurityException può essere generata se la protezione del sistema non consente al chiamante di accedere al metodo chiamato. Il controllo di protezione può verificarsi quando le istruzioni MSIL (Microsoft Intermediate Language) vengono convertite in codice nativo, anziché in fase di esecuzione.

I metodi EmitCalli che seguono possono essere utilizzati per eseguire un'istruzione calli sullo stack. Si noti che calli deve essere chiamato mediante i metodi che seguono anziché utilizzando la classe Emit per collocare l'istruzione direttamente sullo stack.

  • ILGenerator.EmitCalli(Opcode, CallingConventions, Type, Type[], Type[]) per chiamate che utilizzano una convenzione di chiamata gestita.

  • ILGenerator.EmitCalli(Opcode, CallingConvention, Type, Type[]) per chiamate che utilizzano una convenzione di chiamata non gestita.

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema.

.NET Framework

Supportato in: 2.0 1.1 1.0
Mostra: