OpCodes.Call 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 dal descrittore di metodo passato.
public: static initonly System::Reflection::Emit::OpCode Call;
public static readonly System.Reflection.Emit.OpCode Call;
staticval mutable Call : System.Reflection.Emit.OpCode
Public Shared ReadOnly Call As OpCode
Valore del campo
Commenti
La tabella seguente elenca il formato dell'assembly esadecimale e Microsoft Intermediate Language (MSIL), insieme a un breve riepilogo di riferimento:
Formato | Formato assembly | Descrizione |
---|---|---|
28 <T > |
call methodDesc |
Chiamare il metodo descritto da methodDesc . |
Il comportamento di transizione dello stack, in ordine sequenziale, è:
Gli argomenti del metodo tramite
argN
vengono inseritiarg1
nello stack.Gli
arg1
argN
argomenti del metodo tramite vengono visualizzati dallo stack. La chiamata al metodo viene eseguita con questi argomenti e il controllo viene trasferito al metodo a cui fa riferimento il descrittore del metodo. Al termine, un valore restituito viene generato dal metodo chiamante e inviato al chiamante.Il valore restituito viene eseguito il push nello stack.
L'istruzione call
chiama il metodo indicato dal descrittore del metodo passato con l'istruzione. Il descrittore del metodo è un token di metadati che indica il metodo da chiamare e il numero, il tipo e l'ordine degli argomenti inseriti nello stack da passare a tale metodo e alla convenzione chiamante da usare. L'istruzione call
può essere immediatamente preceduta da un'istruzione tail
prefisso (Tailcall) per specificare che lo stato del metodo corrente deve essere rilasciato prima del trasferimento del controllo. Se il controllo chiama trasferisce il controllo a un metodo di attendibilità superiore al metodo di origine, il frame dello stack non viene rilasciato. L'esecuzione continua invece in modo invisibile all'utente come se l'oggetto tail
non fosse stato fornito. Il token di metadati contiene informazioni sufficienti per determinare se la chiamata è a un metodo statico, un metodo di istanza, un metodo virtuale o una funzione globale. In tutti questi casi l'indirizzo di destinazione viene determinato interamente dal descrittore del metodo (a Callvirt differenza dell'istruzione per chiamare metodi virtuali, dove l'indirizzo di destinazione dipende anche dal tipo di runtime del riferimento dell'istanza push prima dell'oggetto Callvirt).
Gli argomenti vengono posizionati nello stack in ordine da sinistra a destra. Ovvero, 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 di sopra dello stack in ordine decrescente. Esistono tre casi speciali importanti:
Le chiamate a un metodo di istanza (o virtuale) devono eseguire il push di tale riferimento all'istanza prima di uno degli argomenti visibili dall'utente. Il riferimento all'istanza non deve essere un riferimento Null. La firma contenuta nei metadati non contiene una voce nell'elenco di parametri per il
this
puntatore, ma usa un bit per indicare se il metodo richiede il passaggio delthis
puntatore.È valido chiamare un metodo virtuale usando
call
(anzichécallvirt
); questo indica che il metodo deve essere risolto usando la classe specificata dal metodo anziché come specificato dinamicamente dall'oggetto richiamato.Si noti che il metodo di
Invoke
un delegato può essere chiamato con l'istruzionecall
ocallvirt
.
SecurityException può essere generato 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.
Nota
Quando si chiamano metodi di System.Object sui tipi di valore, è consigliabile usare il prefisso con l'istruzione constrained
anziché emettere un'istruzione callvirt
call
. In questo modo viene rimossa la necessità di generare un'applicazione diversa a seconda che il tipo di valore venga sottoposto a override del metodo, evitando un potenziale problema di controllo delle versioni. Prendere in considerazione l'uso del prefisso quando si richiamano metodi di interfaccia sui tipi di valore, poiché il metodo del tipo di valore che implementa il constrained
metodo di interfaccia può essere modificato usando un MethodImpl
oggetto . Questi problemi sono descritti in modo più dettagliato nel Constrained codice opcode.
Gli overload del metodo seguenti Emit possono usare il call
codice opcode:
Nota
Il EmitCall metodo viene fornito per varargs
le chiamate. Usare il Emit metodo per le chiamate normali.