OpCodes.Callvirt 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 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:
Ein Objektverweis
obj
wird auf den Stapel gepusht.Methodenargumente
arg1
durchargN
werden auf den Stapel gepusht.Methodenargumente
arg1
bisargN
und der Objektverweisobj
werden aus dem Stapel übertragen. Der Methodenaufruf wird mit diesen Argumenten ausgeführt, und die Steuerung wird an die Methode inobj
ü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.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.
Callvirt
kann 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 MethodImpl
geändert werden kann. Diese Probleme werden im Constrained Opcode ausführlicher beschrieben.
Die folgende Emit Methodenüberladung kann den callvirt
Opcode verwenden: