OpCodes.Call Feld
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Ruft die vom übergebenen Methodendeskriptor angegebene Methode auf.
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
Feldwert
Hinweise
In der folgenden Tabelle sind das Hexadezimal- und Microsoft MSIL-Assemblyformat (Intermediate Language) der Anweisung zusammen mit einer kurzen Referenzzusammenfassung aufgeführt:
| Format | Assemblyformat | Description |
|---|---|---|
28 <T> |
Aufrufen methodDesc |
Rufen Sie die von methodDesc. |
Das Übergangsverhalten des Stapels in sequenzieller Reihenfolge lautet:
Methodenargumente
arg1argNdurchlaufen werden auf den Stapel verschoben.Methodenargumente
arg1argNwerden vom Stapel durchgetaucht. Der Methodenaufruf wird mit diesen Argumenten ausgeführt und das Steuerelement wird an die Methode übertragen, auf die vom Methodendeskriptor verwiesen wird. Nach Abschluss wird ein Rückgabewert von der Angerufenen-Methode generiert und an den Aufrufer gesendet.Der Rückgabewert wird auf den Stapel verschoben.
Die call Anweisung ruft die durch den Methodendeskriptor angegebene Methode auf, die mit der Anweisung übergeben wird. Der Methodendeskriptor ist ein Metadatentoken, das die Methode angibt, die aufgerufen werden soll, sowie die Anzahl, den Typ und die Reihenfolge der Argumente, die auf dem Stapel platziert wurden, an diese Methode sowie die zu verwendende Aufrufkonvention übergeben werden. Der call Anweisung kann unmittelbar eine tail (Tailcall) Präfixanweisung vorangestellt werden, um anzugeben, dass der aktuelle Methodenstatus losgelassen werden soll, bevor die Steuerung übertragen wird. Wenn der Aufruf die Steuerung an eine Methode mit höherer Vertrauenswürdigkeit überträgt als die Ursprungsmethode, wird der Stapelframe nicht freigegeben. Stattdessen wird die Ausführung im Hintergrund fortgesetzt, als wäre dies tail nicht angegeben worden. Das Metadatentoken enthält ausreichende Informationen, um zu bestimmen, ob der Aufruf einer statischen Methode, einer Instanzmethode, einer virtuellen Methode oder einer globalen Funktion besteht. In all diesen Fällen wird die Zieladresse vollständig vom Methodendeskriptor bestimmt (im Gegensatz dazu die Anweisung für das Callvirt Aufrufen virtueller Methoden, wobei die Zieladresse auch vom Laufzeittyp des Instanzverweises abhängt, der vor der CallvirtInstanz verschoben wurde).
Die Argumente werden auf dem Stapel in der Reihenfolge von links nach rechts platziert. Das heißt, das erste Argument wird berechnet und auf dem Stapel platziert, dann das zweite Argument, dann der dritte, bis alle erforderlichen Argumente auf dem Stapel in absteigender Reihenfolge stehen. Es gibt drei wichtige Sonderfälle:
Aufrufe einer Instanz (oder einer virtuellen) Methode müssen diese Instanzreferenz vor einem der vom Benutzer sichtbaren Argumente übertragen. Der Instanzverweis darf kein Nullverweis sein. Die in den Metadaten übertragene Signatur enthält keinen Eintrag in der Parameterliste für den
thisZeiger. Stattdessen wird ein Bit verwendet, um anzugeben, ob die Methode denthisZeiger übergeben muss.Es ist gültig, eine virtuelle Methode mithilfe
callvon (stattcallvirt) aufzurufen. Dies gibt an, dass die Methode mithilfe der durch die Methode angegebenen Klasse aufgelöst werden soll, anstatt dynamisch vom aufgerufenen Objekt angegeben zu werden.Beachten Sie, dass die Methode einer Stellvertretung
Invokeentweder mit der Anweisung odercallmit dercallvirtAnweisung aufgerufen werden kann.
SecurityException kann ausgelöst werden, wenn die Systemsicherheit dem Aufrufer keinen Zugriff auf die aufgerufene Methode gewährt. Die Sicherheitsüberprüfung kann auftreten, wenn die Microsoft MSIL-Anweisungen (Intermediate Language) nicht zur Laufzeit in nativen Code konvertiert werden.
Note
Beim Aufrufen von Methoden von System.Object für Werttypen sollten Sie das constrained Präfix mit der callvirt Anweisung anstelle einer call Anweisung verwenden. Dadurch wird die Notwendigkeit entfernt, je nachdem, ob der Werttyp die Methode außer Kraft setzt, unterschiedliche Ils ausgegeben werden müssen, um ein potenzielles Versionsverwaltungsproblem zu vermeiden. Erwägen Sie die Verwendung des constrained Präfixes beim Aufrufen von Schnittstellenmethoden für Werttypen, da die Werttypmethode, die die Schnittstellenmethode implementiert, mithilfe einer MethodImplgeändert werden kann. Diese Probleme werden im Opcode ausführlicher Constrained beschrieben.
Die folgenden Emit Methodenüberladungen können den call Opcode verwenden:
Note
Die EmitCall Methode wird für varargs Aufrufe bereitgestellt. Verwenden Sie die Emit Methode für normale Aufrufe.