Teilen über


OpCodes.Call Feld

Definition

Ruft die Methode auf, die der übergebene Methodendeskriptor angibt.

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 MSIL-Assemblyformat (Microsoft Intermediate Language) der Anweisung sowie eine kurze Referenzzusammenfassung aufgeführt:

Format Assemblyformat BESCHREIBUNG
28 <T> call methodDesc („555-555-5555“ anrufen) Rufen Sie die von beschriebene Methode auf methodDesc.

Das Übergangsverhalten des Stapels in sequenzieller Reihenfolge lautet:

  1. Methodenargumente arg1 durch argN werden auf den Stapel gepusht.

  2. Methodenargumente arg1 durch argN werden aus dem Stapel übertragen. Der Methodenaufruf wird mit diesen Argumenten ausgeführt, und die Steuerung wird an die Methode übertragen, auf die vom Methodendeskriptor verwiesen wird. Nach Abschluss des Vorgangs wird von der aufgerufenen Methode ein Rückgabewert generiert und an den Aufrufer gesendet.

  3. Der Rückgabewert wird auf den Stapel gepusht.

Die call -Anweisung ruft die -Methode auf, die durch den Methodendeskriptor angegeben wird, der mit der -Anweisung übergeben wird. Der Methodendeskriptor ist ein Metadatentoken, das die aufzurufende Methode und die Anzahl, den Typ und die Reihenfolge der Argumente angibt, die im Stapel platziert wurden, um an diese Methode zu übergeben, sowie die zu verwendende Aufrufkonvention. Der call -Anweisung kann sofort eine tail Präfixanweisung (Tailcall) vorangestellt werden, um anzugeben, dass der aktuelle Methodenzustand vor der Übertragung der Steuerung freigegeben werden soll. Wenn der Aufruf die Steuerung an eine Methode mit höherer Vertrauenswürdigkeit als die Ursprungsmethode überträgt, wird der Stapelrahmen nicht freigegeben. Stattdessen wird die Ausführung im Hintergrund fortgesetzt, als ob nicht tail bereitgestellt worden wäre. Das Metadatentoken enthält ausreichende Informationen, um zu bestimmen, ob der Aufruf einer statischen Methode, einer instance-Methode, einer virtuellen Methode oder einer globalen Funktion erfolgt. In all diesen Fällen wird die Zieladresse vollständig aus dem Methodendeskriptor bestimmt (kontrastiert dies mit der Callvirt Anweisung zum Aufrufen virtueller Methoden, wobei die Zieladresse auch vom Laufzeittyp des instance Verweis abhängt, der vor den Callvirtgepusht wird.

Die Argumente werden in der Reihenfolge von links nach rechts im Stapel platziert. Das heißt, das erste Argument wird berechnet und im Stapel platziert, dann das zweite Argument, dann das dritte, bis alle erforderlichen Argumente in absteigender Reihenfolge auf dem Stapel stehen. Es gibt drei wichtige Sonderfälle:

  1. Aufrufe einer instance (oder virtuellen) Methode müssen pushen, die instance Verweis vor einem der vom Benutzer sichtbaren Argumente übertragen. Der instance-Verweis darf kein NULL-Verweis sein. Die in den Metadaten enthaltene Signatur enthält keinen Eintrag in der Parameterliste für den this Zeiger. Stattdessen wird ein Bit verwendet, um anzugeben, ob die Methode das Übergeben des this Zeigers erfordert.

  2. Es ist gültig, eine virtuelle Methode mit call (anstelle callvirtvon ) aufzurufen. Dies bedeutet, dass die Methode mithilfe der klasse aufgelöst werden soll, die von der -Methode angegeben wird, anstatt wie dynamisch vom aufgerufenen Objekt angegeben.

  3. Beachten Sie, dass die Methode eines Delegaten Invoke entweder mit der call -Anweisung oder callvirt 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 MSIL-Anweisungen (Microsoft Intermediate Language) nicht zur Laufzeit, sondern in nativen Code konvertiert werden.

Hinweis

Wenn Sie Methoden von System.Object für Werttypen aufrufen, sollten Sie das constrained Präfix mit der callvirt -Anweisung verwenden, anstatt eine call Anweisung ausgibt. Dadurch entfällt die Notwendigkeit, je nachdem, ob der Werttyp die Methode überschreibt, unterschiedliche IL-Werte auszugeben, wodurch ein potenzielles Versionsverwaltungsproblem vermieden wird. Erwägen Sie die Verwendung des constrained Präfixes beim Aufrufen von Schnittstellenmethoden für Werttypen, da die Werttypmethode, die die Schnittstellenmethode implementiert, mithilfe eines MethodImplgeändert werden kann. Diese Probleme werden im Constrained Opcode ausführlicher beschrieben.

Die folgenden Emit Methodenüberladungen können den call Opcode verwenden:

Hinweis

Die EmitCall -Methode wird für varargs Aufrufe bereitgestellt. Verwenden Sie die Emit -Methode für normale Aufrufe.

Gilt für: