OpCodes.Callvirt Field

Definition

Ruft eine spät gebundene Methode für ein Objekt auf und legt den Rückgabewert auf dem Auswertungsstapel ab.Calls a late-bound method on an object, pushing the return value onto the evaluation stack.

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 

Field Value

OpCode

Remarks

In der folgenden Tabelle werden das hexadezimale und das MSIL-AssemblyFormat (Microsoft Intermediate Language) zusammen mit einer kurzen Verweis Zusammenfassung aufgelistet:The following table lists the instruction's hexadecimal and Microsoft Intermediate Language (MSIL) assembly format, along with a brief reference summary:

FormatFormat AssemblyFormatAssembly Format BeschreibungDescription
6f < T >6F < T > "callvirt"-methodcallvirt method Ruft eine bestimmte Methode auf, die objzugeordnet ist.Calls a specific method associated with obj.

Das Stapel Übergangs Verhalten ist in sequenzieller Reihenfolge:The stack transitional behavior, in sequential order, is:

  1. Ein Objekt Verweis obj auf den Stapel verschoben wird.An object reference obj is pushed onto the stack.

  2. Methodenargumente, die über argN arg1 werden, werden auf dem Stapel abgelegt.Method arguments arg1 through argN are pushed onto the stack.

  3. Methodenargumente arg1 über argN und der Objekt Verweis obj aus dem Stapel entfernt werden. der Methodenaufrufe wird mit diesen Argumenten ausgeführt, und die Steuerung wird an die-Methode in obj übertragen, auf die durch das Methoden Metadaten-Token verwiesen wird.Method arguments arg1 through argN and the object reference obj are popped from the stack; the method call is performed with these arguments and control is transferred to the method in obj referred to by the method metadata token. Nach Abschluss des Vorgangs wird ein Rückgabewert von der aufgerufenen Methode generiert und an den Aufrufer gesendet.When complete, a return value is generated by the callee method and sent to the caller.

  4. Der Rückgabewert wird auf den Stapel verschoben.The return value is pushed onto the stack.

Die callvirt-Anweisung ruft eine spät gebundene Methode für ein Objekt auf.The callvirt instruction calls a late-bound method on an object. Das heißt, die Methode wird auf der Grundlage des Lauf Zeit Typs von obj und nicht mit der im Methoden Zeiger sichtbaren Kompilierzeit Klasse ausgewählt.That is, the method is chosen based on the runtime type of obj rather than the compile-time class visible in the method pointer. Callvirt können verwendet werden, um sowohl virtuelle als auch Instanzmethoden aufzurufen.Callvirt can be used to call both virtual and instance methods. Der callvirt-Anweisung wird möglicherweise direkt ein Präfix tail vorangestellt (Tailcall), um anzugeben, dass der aktuelle Stapel Rahmen vor dem übertragen der Steuerung freigegeben werden soll.The callvirt instruction may be immediately preceded by a tail (Tailcall) prefix to specify that the current stack frame should be released before transferring control. Wenn der-Befehl die Steuerung an eine Methode mit höherer Vertrauenswürdigkeit überträgt, als die ursprüngliche Methode, wird der Stapel Rahmen nicht freigegeben.If the call would transfer control to a method of higher trust than the original method the stack frame will not be released.

Das Metadatentoken der Methode stellt den Namen, die Klasse und die Signatur der aufzurufenden Methode bereit.The method metadata token provides the name, class and signature of the method to call. Die Klasse, die obj zugeordnet ist, ist die Klasse, von der Sie eine-Instanz ist.The class associated with obj is the class of which it is an instance. Wenn die Klasse eine nicht statische Methode definiert, die mit dem festgelegten Methodennamen und der Signatur übereinstimmt, wird diese Methode aufgerufen.If the class defines a non-static method that matches the indicated method name and signature, this method is called. Andernfalls werden alle Klassen in der Basisklassen Kette dieser Klasse in der richtigen Reihenfolge geprüft.Otherwise all classes in the base class chain of this class are checked in order. Wenn keine Methode gefunden wird, ist dies ein Fehler.It is an error if no method is found.

Callvirt springt das-Objekt und die zugehörigen Argumente aus dem Auswertungs Stapel, bevor die-Methode aufgerufen 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 dem Stapel abgelegt.If the method has a return value, it is pushed on the stack upon method completion. Auf der aufgerufenen Seite wird auf den obj-Parameter als Argument 0 zugegriffen, arg1 als Argument 1 usw.On the callee side, the obj parameter is accessed as argument 0, arg1 as argument 1, and so on.

Die Argumente werden in der Reihenfolge von links nach rechts auf dem Stapel abgelegt.The arguments are placed on the stack in left-to-right order. Das heißt, das erste Argument wird berechnet und auf dem Stapel abgelegt, dann das zweite Argument, dann das dritte, bis alle erforderlichen Argumente in absteigender Reihenfolge auf dem Stapel liegen.That is, the first argument is computed and placed on the stack, then the second argument, then the third, until all necessary arguments are atop the stack in descending order. Der instanzverweisverweis obj (immer erforderlich für callvirt) muss vor allen Benutzer sichtbaren Argumenten gepusht werden.The instance reference obj (always required for callvirt) must be pushed before any of the user-visible arguments. Die Signatur (die im Metadatentoken enthalten ist) muss keinen Eintrag in der Parameterliste für den this-Zeiger enthalten.The signature (carried in the metadata token) need not contain an entry in the parameter list for the this pointer.

Beachten Sie, dass eine virtuelle Methode auch mit der Call-Anweisung aufgerufen werden kann.Note that a virtual method can also be called using the Call instruction.

MissingMethodException wird ausgelöst, wenn eine nicht statische Methode mit dem Namen und der Signatur in der Klasse, die obj oder einer der zugehörigen Basisklassen zugeordnet ist, nicht gefunden wurde.MissingMethodException is thrown if a non-static method with the indicated name and signature could not be found in the class associated with obj or any of its base classes. Dies wird in der Regel erkannt, wenn MSIL-Anweisungen (Microsoft Intermediate Language) in systemeigenen Code konvertiert werden, anstatt zur Laufzeit.This is typically detected when Microsoft Intermediate Language (MSIL) instructions are converted to native code, rather than at runtime.

NullReferenceException wird ausgelöst, wenn obj null ist.NullReferenceException is thrown if obj is null.

SecurityException wird ausgelöst, wenn die Systemsicherheit dem Aufrufer nicht den Zugriff auf die aufgerufene Methode gewährt.SecurityException is thrown if system security does not grant the caller access to the called method. Die Sicherheitsüberprüfung kann auftreten, wenn die cil anstelle der Laufzeit in nativen Code konvertiert wird.The security check may occur when the CIL is converted to native code rather than at run time.

Note

Wenn Sie Methoden von System. Object für Werttypen aufrufen, empfiehlt es sich, das constrained-Präfix mit der callvirt Anweisung zu verwenden.When calling methods of System.Object on value types, consider using the constrained prefix with the callvirt instruction. Dadurch entfällt die Notwendigkeit, eine andere Il auszugeben, je nachdem, ob der Werttyp die Methode überschreibt, sodass ein mögliches Versions Problem vermieden wird.This removes the need to emit different IL depending on whether or not the value type overrides the method, avoiding a potential versioning problem. Verwenden Sie beim Aufrufen von Schnittstellen Methoden für Werttypen ggf. das constrained Präfix, da die Werttyp Methode, die die Schnittstellen Methode implementiert, mithilfe eines MethodImplgeändert werden kann.Consider using the constrained prefix when invoking interface methods on value types, since the value type method implementing the interface method can be changed using a MethodImpl. Diese Probleme werden im Constrained Opcode ausführlicher beschrieben.These issues are described in more detail in the Constrained opcode.

Die folgende Emit-Methoden Überladung kann den callvirt Opcode verwenden:The following Emit method overload can use the callvirt opcode:

Applies to