OpCodes.Callvirt 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 un metodo ad associazione tardiva su un oggetto, inserendo il valore restituito nello stack di valutazione.
public: static initonly System::Reflection::Emit::OpCode Callvirt;
public static readonly System.Reflection.Emit.OpCode Callvirt;
staticval mutable Callvirt : System.Reflection.Emit.OpCode
Public Shared ReadOnly Callvirt 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 |
---|---|---|
6F <T > |
callvirt method |
Chiama un metodo specifico associato a obj . |
Il comportamento di transizione dello stack, in ordine sequenziale, è:
Viene eseguito il push di un riferimento
obj
a un oggetto nello stack.Gli argomenti del metodo tramite
argN
vengono inseritiarg1
nello stack.Gli
arg1
argomenti del metodo tramiteargN
e il riferimentoobj
all'oggetto vengono prelevati dallo stack. La chiamata al metodo viene eseguita con questi argomenti e il controllo viene trasferito al metodo aobj
cui fa riferimento il token dei metadati 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 callvirt
chiama un metodo ad associazione tardiva su un oggetto . Ovvero, il metodo viene scelto in base al tipo di runtime di anziché alla classe in fase di obj
compilazione visibile nel puntatore al metodo.
Callvirt
può essere usato per chiamare metodi virtuali e di istanza. L'istruzione callvirt
può essere immediatamente preceduta da un tail
prefisso (Tailcall) per specificare che il frame dello stack corrente deve essere rilasciato prima del trasferimento del controllo. Se la chiamata trasferisce il controllo a un metodo con attendibilità superiore rispetto al metodo originale, il frame dello stack non verrà rilasciato.
Il token dei metadati del metodo fornisce il nome, la classe e la firma del metodo da chiamare. La classe associata a obj
è la classe di cui è un'istanza. Se la classe definisce un metodo non statico che corrisponde al nome e alla firma del metodo indicato, viene chiamato questo metodo. In caso contrario, tutte le classi nella catena di classi di base di questa classe vengono controllate in ordine. Si tratta di un errore se non viene trovato alcun metodo.
Callvirt
pop l'oggetto e gli argomenti associati dallo stack di valutazione prima di chiamare il metodo . Se il metodo ha un valore restituito, viene eseguito il push nello stack al completamento del metodo. Sul lato chiamato, il obj
parametro è accessibile come argomento 0, arg1
come argomento 1 e così via.
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. Il riferimento obj
all'istanza (sempre obbligatorio per callvirt
) deve essere sottoposto a push prima di uno degli argomenti visibili dall'utente. La firma (contenuta nel token di metadati) non deve contenere una voce nell'elenco di parametri per questo puntatore.
Si noti che è anche possibile chiamare un metodo virtuale usando l'istruzione Call .
MissingMethodException viene generata se non è stato possibile trovare un metodo non statico con il nome e la firma indicati nella classe associata a obj
o in una delle relative classi di base. Questo viene in genere rilevato quando le istruzioni MSIL (Microsoft Intermediate Language) vengono convertite in codice nativo, anziché in fase di esecuzione.
NullReferenceException viene generata se obj è null.
SecurityException viene generata se la sicurezza del sistema non concede al chiamante l'accesso al metodo chiamato. Il controllo di sicurezza può verificarsi quando il CIL viene convertito in codice nativo anziché in fase di esecuzione.
Nota
Quando si chiamano i metodi di System.Object sui tipi valore, è consigliabile usare il constrained
prefisso con l'istruzione callvirt
. In questo modo viene rimossa la necessità di generare codice IL diverso a seconda che il tipo di valore eseva 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.
L'overload del metodo seguente Emit può usare il callvirt
codice operativo: