OpCodes.Calli Campo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
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.
public: static initonly System::Reflection::Emit::OpCode Calli;
public static readonly System.Reflection.Emit.OpCode Calli;
staticval mutable Calli : System.Reflection.Emit.OpCode
Public Shared ReadOnly Calli As OpCode
Valore del campo
Commenti
La tabella seguente elenca il formato di assembly Esadecimale e MSIL (Microsoft Intermediate Language), insieme a un breve riepilogo dei riferimenti:
Formato | Formato assembly | Descrizione |
---|---|---|
29 <T > |
calli callSiteDescr |
Chiama il metodo a cui punta con gli argomenti descritti dalla convenzione di chiamata. |
Il comportamento di transizione dello stack, in ordine sequenziale, è:
Gli argomenti del metodo tramite
argN
vengono inseritiarg1
nello stack.Il puntatore di ingresso del metodo viene inserito nello stack.
Gli argomenti del metodo tramite
argN
e il puntatore di ingresso del metodo vengono prelevatiarg1
dallo stack. Viene eseguita la chiamata al metodo . Al termine, un valore restituito viene generato dal metodo chiamato e inviato al chiamante.Il valore restituito viene inserito nello stack.
L'istruzione calli
chiama il puntatore di ingresso del metodo con gli arg1
argomenti tramite argN
. I tipi di questi argomenti sono descritti dalla convenzione di chiamata specifica (callSiteDesc
). L'istruzione calli
può essere immediatamente preceduta da un tail
prefisso (Tailcall) per specificare che lo stato del metodo corrente deve essere rilasciato prima del trasferimento del controllo. Se la chiamata trasferisce il controllo a un metodo con attendibilità superiore rispetto al metodo di origine, il frame dello stack non verrà rilasciato; L'esecuzione continuerà invece automaticamente come se non fosse stato fornito .tail
Si presuppone che il puntatore di ingresso del metodo sia un puntatore specifico al codice nativo (del computer di destinazione) che può essere chiamato legittimamente con gli argomenti descritti dalla convenzione di chiamata (un token di metadati per una firma autonoma). Un puntatore di questo tipo può essere creato usando le Ldftn istruzioni o o Ldvirtftn passato dal codice nativo.
La convenzione di chiamata non viene controllata dinamicamente, pertanto il codice che usa un'istruzione calli
non funziona correttamente se la destinazione non usa effettivamente la convenzione di chiamata specificata.
Gli argomenti vengono inseriti nello stack in ordine da sinistra a destra. Vale a dire, il primo argomento viene calcolato e posizionato nello stack, quindi il secondo argomento, quindi il terzo, fino a quando tutti gli argomenti necessari non sono al primo posto dello stack in ordine decrescente. La sequenza di codice di compilazione degli argomenti per un'istanza o un metodo virtuale deve eseguire il push del riferimento all'istanza (che non deve essere un riferimento Null) prima di uno degli argomenti visibili dall'utente.
SecurityException può essere generata se la sicurezza del sistema non concede al chiamante l'accesso al metodo chiamato. Il controllo di sicurezza può verificarsi quando le istruzioni MSIL (Microsoft Intermediate Language) vengono convertite in codice nativo anziché in fase di esecuzione.
Per eseguire un'istruzione calli
nello stack, è possibile usare i metodi seguentiEmitCalli. Si noti che calli
deve essere chiamato tramite i metodi seguenti anziché usare la Emit classe per inserire l'istruzione direttamente nello stack.
ILGenerator.EmitCalli(OpCode, CallingConventions, Type, Type[], Type[]) per le chiamate che usano una convenzione di chiamata gestita.
ILGenerator.EmitCalli(OpCode, CallingConvention, Type, Type[]) per le chiamate che usano una convenzione di chiamata non gestita.