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 angegebene Methode auf dem Auswertungsstapel (als Zeiger auf einen Einstiegspunkt) mit Argumenten auf, die durch eine Aufrufkonvention beschrieben sind.
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 MSIL-Assemblyformat (Microsoft Intermediate Language) der Anweisung sowie eine kurze Referenzzusammenfassung aufgeführt:
Format | Assemblyformat | BESCHREIBUNG |
---|---|---|
29 <T > |
Calli callSiteDescr |
Ruft die Methode auf, auf die mit Argumenten verwiesen wird, die von der aufrufenden Konvention beschrieben werden. |
Das Stapelübergangsverhalten in sequenzieller Reihenfolge lautet:
Methodenargumente
arg1
durchargN
werden auf den Stapel gepusht.Der Methodeneinstiegszeiger wird auf den Stapel gepusht.
Methodenargumente
arg1
durchargN
und der Methodeneinstiegszeiger werden aus dem Stapel geknallt. Der Aufruf der -Methode wird ausgeführt. Nach Abschluss wird ein Rückgabewert von der aufgerufenen Methode generiert und an den Aufrufer gesendet.Der Rückgabewert wird auf den Stapel gepusht.
Die calli
-Anweisung ruft den Methodeneinstiegszeiger mit den Argumenten arg1
über argN
auf. 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 Methodenzustand vor der Übertragung der Steuerung freigegeben werden soll. Wenn der Aufruf die Steuerung an eine Methode mit höherer Vertrauenswürdigkeit als die Ursprungsmethode übertragen würde, wird der Stapelrahmen nicht freigegeben. stattdessen wird die Ausführung im Hintergrund fortgesetzt, als wäre die tail
nicht angegeben worden.
Es wird angenommen, dass der Methodeneinstiegszeiger ein bestimmter Zeiger auf nativen Code (des Zielcomputers) ist, der mit den Argumenten aufgerufen werden kann, die von der aufrufenden Konvention beschrieben werden (ein Metadatentoken für eine eigenständige Signatur). Ein solcher Zeiger kann mithilfe der Ldftn Anweisungen oder Ldvirtftn erstellt oder aus nativem Code übergeben werden.
Die Aufrufende Konvention 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 in der Reihenfolge von links nach rechts auf dem Stapel platziert. Das heißt, das erste Argument wird berechnet und auf dem Stapel platziert, dann das zweite Argument, dann das dritte, bis sich alle erforderlichen Argumente in absteigender Reihenfolge auf dem Stapel befinden. Die Codesequenz zum Erstellen von Argumenten für eine instance oder virtuelle Methode muss instance Verweis (der kein NULL-Verweis 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 erfolgen, wenn die MSIL-Anweisungen (Microsoft Intermediate Language) nicht zur Laufzeit, sondern 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
sie über 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 Aufrufe, die eine Konvention für verwaltete Aufrufe verwenden.
ILGenerator.EmitCalli(OpCode, CallingConvention, Type, Type[]) für Aufrufe, die eine nicht verwaltete Aufrufkonvention verwenden.