Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ruft eine spät gebundene Methode für ein Objekt auf und legt den Rückgabewert auf dem Auswertungsstapel ab.
Namespace: System.Reflection.Emit
Assembly: mscorlib (in mscorlib.dll)
Syntax
'Declaration
Public Shared ReadOnly Callvirt As OpCode
'Usage
Dim value As OpCode
value = OpCodes.Callvirt
public static readonly OpCode Callvirt
public:
static initonly OpCode Callvirt
public static final OpCode Callvirt
public static final var Callvirt : OpCode
Hinweise
In der folgenden Tabelle werden das hexadezimale und das Assemblyformat der MSIL (Microsoft Intermediate Language) jeweils mit einer Kurzreferenz aufgeführt:
Format |
Assemblyformat |
Beschreibung |
|---|---|---|
6F < T > |
callvirt method |
Ruft eine bestimmte Methode auf, die obj zugeordnet ist. |
Im Stapel laufen die folgenden Aktionen in der angegebenen Reihenfolge ab:
Der Objektverweis obj wird auf dem Stapel abgelegt.
Die Methodenargumente arg1 bis argN werden auf dem Stapel abgelegt.
Die Methodenargumente arg1 bis argN und der Objektverweis obj werden vom Stapel geholt. Anschließend wird die Methode mit diesen Argumenten aufgerufen, und die Steuerung wird an die Methode in obj übertragen, auf die das Methodenmetadatentoken verweist. Die aufgerufene Methode erzeugt nun einen Rückgabewert und sendet diesen an die aufrufende Methode.
Der Rückgabewert wird auf dem Stapel abgelegt.
Die callvirt-Anweisung ruft eine spät gebundene Methode für ein Objekt auf. Das heißt, dass die Methode nicht abhängig von der Klasse ausgewählt wird, die zur Kompilierzeit im Methodenzeiger sichtbar ist, sondern abhängig vom Laufzeittyp von obj. Mit Callvirt können sowohl virtuelle als auch Instanzmethoden aufgerufen werden. Der callvirt-Anweisung kann unmittelbar ein tail-Präfix (Tailcall) vorausgehen, das angibt, dass der Zustand des aktuellen Stapelrahmens vor der Steuerungsübertragung freigegeben werden soll. Wenn der Aufruf die Steuerung an eine Methode überträgt, deren Vertrauensebene höher als die der Ursprungsmethode ist, wird der Stapelrahmen nicht freigegeben.
Das Methodenmetadatentoken stellt den Namen, die Klasse und die Signatur der aufzurufenden Methode bereit. Die obj zugeordnete Klasse ist die Klasse, von der dieses Objekt eine Instanz ist. Wenn in der Klasse eine nicht statische Methode definiert ist, die dem angegebenen Methodennamen und der Signatur entspricht, wird diese Methode aufgerufen. Andernfalls wird die Methode nacheinander in allen Basisklassen der Klasse gesucht. Wenn keine Methode gefunden wird, tritt ein Fehler auf.
Vor Aufruf der Methode holt Callvirt das Objekt und die zugeordneten Argumente vom Auswertungsstapel. Wenn die Methode einen Wert zurückgibt, wird dieser nach Abschluss der Methode auf dem Stapel abgelegt. Auf der aufgerufenen Seite wird auf den obj-Parameter als Argument 0, auf arg1 als Argument 1 usw. zugegriffen.
Die Argumente werden von links nach rechts auf dem Stapel abgelegt. Das heißt, das erste Argument wird berechnet und auf dem Stapel abgelegt, anschließend das zweite, dann das dritte usw., bis sich alle erforderlichen Argumente in absteigender Reihenfolge auf dem Stapel befinden. Der (bei callvirt immer erforderliche) Instanzverweis obj muss vor den Argumenten, die für den Benutzer sichtbar sind, auf dem Stapel abgelegt werden. Die (im Metadatentoken enthaltene) Signatur muss keinen Eintrag in der Parameterliste für den this-Zeiger enthalten.
Beachten Sie, dass eine virtuelle Methode auch mit der Call-Anweisung aufgerufen werden kann.
MissingMethodException wird ausgelöst, wenn in der Klasse, die obj zugeordnet ist, oder in ihren Basisklassen keine nicht statische Methode mit dem angegebenen Namen und der entsprechenden Signatur gefunden werden kann. Dies wird normalerweise nicht zur Laufzeit erkannt, sondern wenn MSIL (Microsoft Intermediate Language)-Anweisungen in systemeigenen Code konvertiert werden.
NullReferenceException wird ausgelöst, wenn obj NULL ist.
SecurityException wird ausgelöst, wenn dem Aufrufer der Zugriff auf die aufgerufene Methode durch die Systemsicherheit verweigert wird. Die Sicherheitsüberprüfung wird nicht zur Laufzeit ausgeführt, sondern beim Konvertieren von CIL in systemeigenen Code.
Hinweis
Beim Aufruf von Methoden von System.Object für Werttypen sollten Sie das constrained-Präfix mit der callvirt-Anweisung verwenden. Dadurch müssen Sie keine andere IL ausgeben, wenn der Werttyp die Methode überschreibt und vermeiden so mögliche Versionskonflikte. Verwenden Sie beim Aufrufen von Methoden für Werttypen das constrained-Präfix, da die Werttypmethode, die die Schnittstellenmethode implementiert, mit MethodImpl geändert werden kann. Eine genauere Beschreibung dieser Fragen finden Sie unter dem Constrained-Opcode.
Die folgende Überladung der Emit-Methode verwendet den callvirt-Opcode:
ILGenerator.Emit(OpCode, MethodInfo)
ILGenerator.EmitCall(OpCode, MethodInfo, Type[])
Plattformen
Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.
Versionsinformationen
.NET Framework
Unterstützt in: 2.0, 1.1, 1.0
Siehe auch
Referenz
OpCodes-Klasse
OpCodes-Member
System.Reflection.Emit-Namespace