OpCodes.Callvirt Feld

Definition

Ruft eine spät gebundene Methode für ein Objekt auf, wobei der Rückgabewert auf den Auswertungsstapel verschoben wird.

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 Microsoft MSIL-Assemblyformat (Intermediate Language) der Anweisung zusammen mit einer kurzen Referenzzusammenfassung aufgeführt:

Format Assemblyformat Description
6F <T> callvirt method Ruft eine bestimmte Methode auf, die objmit .

Das Übergangsverhalten des Stapels in sequenzieller Reihenfolge lautet:

  1. Ein Objektverweis obj wird auf den Stapel verschoben.

  2. Methodenargumente arg1argN durchlaufen werden auf den Stapel verschoben.

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

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

Die callvirt Anweisung ruft eine spät gebundene Methode für ein Objekt auf. Das heißt, die Methode wird basierend auf dem Laufzeittyp der obj im Methodenzeiger sichtbaren Kompilierungszeitklasse ausgewählt. Callvirt kann verwendet werden, um virtuelle und Instanzmethoden aufzurufen. Der callvirt Anweisung kann unmittelbar ein tail (Tailcall) Präfix vorangestellt werden, um anzugeben, dass der aktuelle Stapelframe 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 ursprüngliche Methode, wird der Stapelframe nicht freigegeben.

Das Methodenmetadatentoken stellt den Namen, die Klasse und die Signatur der methode bereit, die aufgerufen werden soll. Die zugeordnete obj Klasse ist die Klasse, deren Instanz sie ist. Wenn die Klasse eine nicht statische Methode definiert, die dem angegebenen Methodennamen und der angegebenen Signatur entspricht, 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 pops the object and the associated arguments off the evaluation stack before calling the method. Wenn die Methode über einen Rückgabewert verfügt, wird sie nach Abschluss der Methode auf den Stapel verschoben. Auf der angerufenen Seite wird auf den obj Parameter als Argument 0, arg1 als Argument 1 usw. zugegriffen.

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. Der Instanzverweis obj (immer erforderlich für callvirt) muss vor einem der vom Benutzer sichtbaren Argumente verschoben werden. Die Signatur (im Metadatentoken übertragen) 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 Signatur in der klasse gefunden werden konnte, die mit obj oder einer ihrer Basisklassen verknüpft ist. Dies wird in der Regel erkannt, wenn Microsoft MSIL-Anweisungen (Intermediate Language) nicht zur Laufzeit, sondern in systemeigenen 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 systemeigenen Code konvertiert wird.

Note

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

Gilt für: