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 del 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 di assembly MSIL (Intermediate Language) esadecimale e Microsoft istruzione, insieme a un breve riepilogo di riferimento:
| Formato | Formato assembly | Description |
|---|---|---|
28 <T> |
Chiamare methodDesc |
Chiamare il metodo descritto da methodDesc. |
Il comportamento transitorio dello stack, in ordine sequenziale, è:
Gli argomenti del metodo tramite
arg1vengono inseritiargNnello stack.Gli argomenti del metodo tramite
arg1vengono prelevatiargNdallo 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 chiamato e inviato al chiamante.Il valore restituito viene inserito 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, nonché la convenzione di chiamata da usare. L'istruzione call può essere immediatamente preceduta da un'istruzione tail di 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, lo stack frame non viene rilasciato. L'esecuzione continua invece in modo invisibile all'utente come se tail non fosse stato fornito. Il token di metadati contiene informazioni sufficienti per determinare se la chiamata è a un metodo statico, a un metodo di istanza, a un metodo virtuale o a una funzione globale. In tutti questi casi l'indirizzo di destinazione viene determinato interamente dal descrittore del metodo (a differenza dell'istruzione per chiamare metodi virtuali, dove l'indirizzo Callvirt di destinazione dipende anche dal tipo di runtime del riferimento all'istanza di cui è stato eseguito il push prima di Callvirt).
Gli argomenti vengono posizionati nello stack in ordine da sinistra a destra. Ovvero, il primo argomento viene calcolato e posizionato sullo stack, quindi il secondo argomento, quindi il terzo, fino a quando tutti gli argomenti necessari non sono in cima allo stack in ordine decrescente. Esistono tre casi speciali importanti:
Le chiamate a un metodo di istanza (o virtuale) devono eseguire il push del riferimento a tale istanza prima di uno qualsiasi degli argomenti visibili dall'utente. Il riferimento all'istanza non deve essere un riferimento Null. La firma inserita nei metadati non contiene una voce nell'elenco di parametri per il
thispuntatore, ma usa un bit per indicare se il metodo richiede il passaggio delthispuntatore.È valido chiamare un metodo virtuale utilizzando
call(anzichécallvirt); questo indica che il metodo deve essere risolto usando la classe specificata dal metodo anziché come specificato in modo dinamico dall'oggetto richiamato.Si noti che il metodo di
Invokeun delegato può essere chiamato con l'istruzionecallocallvirt.
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 (Intermediate Language) Microsoft vengono convertite in codice nativo anziché in fase di esecuzione.
Note
Quando si chiamano i metodi di System.Object sui tipi valore, è consigliabile usare il constrained prefisso con l'istruzione callvirt invece di emettere un'istruzione call . In questo modo viene rimossa la necessità di generare un'operazione di bilanciamento del carico interno diversa a seconda che il tipo di valore esemetta o meno l'override del metodo, evitando un potenziale problema di controllo delle versioni. È consigliabile usare il constrained prefisso quando si richiamano metodi di interfaccia sui tipi valore, poiché il metodo di tipo valore che implementa il metodo di interfaccia può essere modificato usando un oggetto MethodImpl. Questi problemi sono descritti in modo più dettagliato nel Constrained codice operativo.
Gli overload del metodo seguenti Emit possono usare il call codice operativo:
Note
Il EmitCall metodo viene fornito per varargs le chiamate. Usare il Emit metodo per le chiamate normali.