OpCodes.Call Feld

Definition

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:

  1. Methodenargumente arg1argN durchlaufen werden auf den Stapel verschoben.

  2. Methodenargumente arg1argN werden 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.

  3. 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:

  1. 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 this Zeiger. Stattdessen wird ein Bit verwendet, um anzugeben, ob die Methode den this Zeiger übergeben muss.

  2. Es ist gültig, eine virtuelle Methode mithilfe call von (statt callvirt) 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.

  3. Beachten Sie, dass die Methode einer Stellvertretung Invoke entweder mit der Anweisung oder call mit der callvirt Anweisung 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.

Gilt für: