Campo OpCodes.Call
Assembly: mscorlib (in mscorlib.dll)
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 |
|---|---|---|
| 28 < T > | call methodDesc | Chiama il metodo descritto da methodDesc. |
Di seguito viene riportato il comportamento di transizione dello stack, in ordine sequenziale.
-
Gli argomenti del metodo da arg1 a argN vengono inseriti nello stack.
-
Gli argomenti del metodo da arg1 a argN vengono estratti dallo stack; la chiamata del metodo viene effettuata con questi argomenti e il controllo viene trasferito al metodo a cui il descrittore del metodo fa riferimento. 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 al metodo, oltre alla convenzione da utilizzare per la chiamata. L'istruzione call può essere immediatamente preceduta da un'istruzione tail (Tailcall) di prefisso, per specificare che lo stato del metodo corrente deve essere liberato prima di trasferire il controllo. Se la chiamata trasferisce il controllo a un metodo più attendibile di quello di origine, lo stack frame non viene liberato, ma l'esecuzione continua senza generare errori, come se l'istruzione tail non fosse stata fornita. Il token di metadati contiene informazioni sufficienti a determinare se la chiamata è diretta a un metodo static, a un metodo di istanza, a un metodo virtual o una funzione globale. In tutti questi casi, l'indirizzo di destinazione è determinato interamente dal descrittore del metodo. Confrontare questo comportamento con l'istruzione Callvirt per la chiamata di metodi virtual, dove l'indirizzo di destinazione dipende anche dal tipo in fase di esecuzione del riferimento di istanza inserito prima di Callvirt.
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. Possono verificarsi tre casi particolari degni di nota:
1. Le chiamate a un metodo di istanza (o virtual) devono spostare il riferimento all'istanza in questione prima di qualsiasi eventuale argomento visibile all'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 puntatore this, ma utilizza un bit per indicare se il metodo richiede il passaggio del puntatore this.
2. È consentito chiamare un metodo virtual utilizzando call anziché callvirt; in questo modo si indica che il metodo deve essere risolto utilizzando la classe specificata dal metodo anziché quella specificata in modo dinamico dall'oggetto richiamato.
3. Si noti che è possibile chiamare un metodo Invoke di un delegato mediante l'istruzione call o l'istruzione callvirt.
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.
Nota |
|---|
| Quando si chiamano i metodi di System.Object sui tipi di valore, prendere in considerazione l'utilizzo del prefisso constrained con l'istruzione callvirt invece di generare un'istruzione call. In questo modo, non sarà necessario generare un IL diverso a seconda che il tipo di valore sostituisca il metodo, evitando così potenziali problemi di controllo delle versioni. Prendere in considerazione l'utilizzo del prefisso constrained quando si chiamano i metodi di interfaccia sui tipi di valore, dal momento che il metodo del tipo di valore che implementa il metodo di interfaccia può essere modificato mediante MethodImpl. Questi problemi sono illustrati in maniera più dettagliata nel codice operativo Constrained. |
Nei seguenti overload di metodi Emit è possibile utilizzare il codice operativo call:
-
ILGenerator.Emit(OpCode, MethodInfo)
-
ILGenerator.EmitCall(OpCode, MethodInfo, Type[])
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.
Nota