OpCodes.Calli 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 die im Auswertungsstapel angegebene Methode (als Zeiger auf einen Einstiegspunkt) mit Argumenten auf, die durch eine Aufrufkonvention beschrieben werden.
public: static initonly System::Reflection::Emit::OpCode Calli;
public static readonly System.Reflection.Emit.OpCode Calli;
staticval mutable Calli : System.Reflection.Emit.OpCode
Public Shared ReadOnly Calli 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 |
|---|---|---|
29 <T> |
Calli callSiteDescr |
Ruft die Methode auf, auf die mit Argumenten verwiesen wird, die durch die aufrufende Konvention beschrieben werden. |
Das Übergangsverhalten des Stapels in sequenzieller Reihenfolge lautet:
Methodenargumente
arg1argNdurchlaufen werden auf den Stapel verschoben.Der Einstiegspunkt für die Methode wird auf den Stapel verschoben.
Methodenargumente
arg1durchargNund der Methodeneinstiegspunkt werden aus dem Stapel angezeigt. Der Aufruf der Methode wird ausgeführt. Nach Abschluss wird ein Rückgabewert von der Angerufenen-Methode generiert und an den Aufrufer gesendet.Der Rückgabewert wird auf den Stapel verschoben.
Die calli Anweisung ruft den Methodeneinstiegspunkt mit den Argumenten arg1 über argN. Die Typen dieser Argumente werden durch die spezifische Aufrufkonvention (callSiteDesc) beschrieben. Der calli Anweisung kann unmittelbar ein tail Präfix (Tailcall) vorangestellt werden, um anzugeben, dass der aktuelle Methodenstatus freigegeben werden soll, bevor die Steuerung übertragen wird. Wenn der Aufruf die Steuerung an eine Methode mit höherer Vertrauenswürdigkeit überträgt als die Ursprungsmethode, wird der Stapelframe nicht freigegeben. Stattdessen wird die Ausführung im Hintergrund fortgesetzt, als wäre dies tail nicht angegeben worden.
Der Methodeneinstiegspunkt wird als bestimmter Zeiger auf systemeigenen Code (des Zielcomputers) angenommen, der legitim mit den argumenten aufgerufen werden kann, die durch die aufrufende Konvention (ein Metadatentoken für eine eigenständige Signatur) beschrieben werden. Ein solcher Zeiger kann mit den Ldftn Anweisungen oder Ldvirtftn Anweisungen erstellt oder aus systemeigenem Code übergeben werden.
Die Aufrufkonvention wird nicht dynamisch überprüft, sodass Code, der eine calli Anweisung verwendet, nicht ordnungsgemäß funktioniert, wenn das Ziel nicht die angegebene Aufrufkonvention verwendet.
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. Die Codesequenz zum Erstellen von Argumenten für eine Instanz oder virtuelle Methode muss diesen Instanzverweis (der kein Nullverweis sein darf) vor einem der vom Benutzer sichtbaren Argumente pushen.
SecurityException kann ausgelöst werden, wenn die Systemsicherheit dem Aufrufer keinen Zugriff auf die aufgerufene Methode gewährt. Die Sicherheitsüberprüfung kann auftreten, wenn die Microsoft MSIL-Anweisungen (Intermediate Language) nicht zur Laufzeit in nativen Code konvertiert werden.
Die folgenden EmitCalli Methoden können verwendet werden, um eine calli Anweisung für den Stapel auszuführen. Beachten Sie, dass calli die folgenden Methoden aufgerufen werden sollten, anstatt die Emit Klasse zu verwenden, um die Anweisung direkt im Stapel zu platzieren.
ILGenerator.EmitCalli(OpCode, CallingConventions, Type, Type[], Type[]) für Anrufe mit einer konvention für verwaltete Anrufe.
ILGenerator.EmitCalli(OpCode, CallingConvention, Type, Type[]) für Anrufe, die eine nicht verwaltete Anrufkonvention verwenden.