OpCodes.Callvirt Feld

Definition

Ruft eine spät gebundene Methode für ein Objekt auf und legt den Rückgabewert auf dem Auswertungsstapel ab.

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 

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
6F <T> callvirt method Ruft eine bestimmte Methode auf, die zugeordnet ist obj.

Das Übergangsverhalten des Stapels in sequenzieller Reihenfolge lautet:

  1. Ein Objektverweis obj wird auf den Stapel gepusht.

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

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

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

Die callvirt -Anweisung ruft eine spät gebundene Methode für ein -Objekt auf. Das heißt, die Methode wird basierend auf dem Laufzeittyp von obj ausgewählt und nicht auf der Kompilierzeitklasse, die im Methodenzeiger sichtbar ist. Callvirtkann verwendet werden, um virtuelle und instance Methoden aufzurufen. Der callvirt Anweisung kann unmittelbar ein tail Präfix (Tailcall) vorangestellt werden, um anzugeben, dass der aktuelle Stapelrahmen vor der Übertragung der Steuerung freigegeben werden soll. Wenn der Aufruf die Steuerung an eine Methode mit höherer Vertrauenswürdigkeit als die ursprüngliche Methode übertragen würde, wird der Stapelrahmen nicht freigegeben.

Das Metadatentoken der Methode stellt den Namen, die Klasse und die Signatur der methode bereit, die aufgerufen werden soll. Die zugeordnete obj Klasse ist die Klasse, deren instance. Wenn die -Klasse eine nicht statische Methode definiert, die mit dem angegebenen Methodennamen und der angegebenen Signatur übereinstimmt, wird diese Methode aufgerufen. Andernfalls werden alle Klassen in der Basisklassenkette dieser Klasse in der Reihenfolge überprüft. Es handelt sich um einen Fehler, wenn keine Methode gefunden wird.

Callvirt Popt das -Objekt und die zugeordneten Argumente aus dem Auswertungsstapel, bevor die -Methode aufgerufen wird. Wenn die Methode über einen Rückgabewert verfügt, wird sie nach Abschluss der Methode auf den Stapel gepusht. Auf der Aufgerufenenseite wird auf den obj Parameter als Argument 0, arg1 als Argument 1 usw. zugegriffen.

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. Der instance-Verweis obj (immer erforderlich für callvirt) muss vor einem der vom Benutzer sichtbaren Argumente gepusht werden. Die Signatur (im Metadatentoken enthalten) muss keinen Eintrag in der Parameterliste für diesen Zeiger enthalten.

Beachten Sie, dass eine virtuelle Methode auch mithilfe der Call -Anweisung aufgerufen werden kann.

MissingMethodException wird ausgelöst, wenn eine nicht statische Methode mit dem angegebenen Namen und der angegebenen Signatur in der Klasse, die oder einer ihrer Basisklassen zugeordnet obj ist, nicht gefunden werden konnte. Dies wird in der Regel erkannt, wenn MSIL-Anweisungen (Microsoft Intermediate Language) nicht zur Laufzeit, sondern in nativen Code konvertiert werden.

NullReferenceException wird ausgelöst, wenn obj NULL ist.

SecurityException wird ausgelöst, wenn die Systemsicherheit dem Aufrufer keinen Zugriff auf die aufgerufene Methode gewährt. Die Sicherheitsüberprüfung kann auftreten, wenn die CIL nicht zur Laufzeit, sondern in nativen Code konvertiert wird.

Hinweis

Wenn Sie Methoden von System.Object für Werttypen aufrufen, sollten Sie das constrained Präfix mit der callvirt -Anweisung verwenden. 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 folgende Emit Methodenüberladung kann den callvirt Opcode verwenden:

Gilt für: