OpCodes.Calli-Feld
Ruft die angegebene Methode auf dem Auswertungsstapel (als Zeiger auf einen Einstiegspunkt) mit Argumenten auf, die durch eine Aufrufkonvention beschrieben sind.
Namespace: System.Reflection.Emit
Assembly: mscorlib (in mscorlib.dll)
Syntax
'Declaration
Public Shared ReadOnly Calli As OpCode
'Usage
Dim value As OpCode
value = OpCodes.Calli
public static readonly OpCode Calli
public:
static initonly OpCode Calli
public static final OpCode Calli
public static final var Calli : 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 |
---|---|---|
29 < T > |
calli callSiteDescr |
Ruft die Methode auf, auf die die Argumente zeigen, die durch die Aufrufkonvention beschrieben sind. |
Im Stapel laufen die folgenden Aktionen in der angegebenen Reihenfolge ab:
Die Methodenargumente arg1 bis argN werden auf dem Stapel abgelegt.
Der Zeiger auf den Methodeneinsprung wird auf dem Stapel abgelegt.
Die Methodenargumente arg1 bis argN und die Zeiger auf den Methodeneinsprung werden vom Stapel geholt, und der Methodenaufruf wird ausgeführt. Die aufgerufene Methode erzeugt nun einen Rückgabewert und sendet diesen an die aufrufende Methode.
Der Rückgabewert wird auf dem Stapel abgelegt.
Die calli-Anweisung ruft den Zeiger auf den Methodeneinstieg mit den Argumenten arg1 bis argN auf. Die Typen dieser Argumente werden durch die jeweilige Aufrufkonvention (callSiteDesc) beschrieben. Der calli-Anweisung kann unmittelbar ein tail-Präfix (Tailcall) vorausgehen, das angibt, dass der Zustand der aktuellen Methode 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. Die Ausführung wird stattdessen ohne Meldung fortgesetzt, als wäre kein tail angegeben.
Es wird davon ausgegangen, dass der Zeiger auf den Methodeneinsprung ein bestimmter Zeiger auf systemeigenen Code (des Zielcomputers) ist, der mit den durch die Aufrufkonvention (ein Metadatentoken für eine eigenständige Signatur) beschriebenen Argumenten legitim aufgerufen werden kann. Ein Zeiger dieser Art kann mit der Ldftn-Anweisung oder der Ldvirtftn-Anweisung erstellt oder aus dem systemeigenen Code übergeben werden.
Die Aufrufkonvention wird nicht dynamisch überprüft, sodass Code mit der calli-Anweisung nur ordnungsgemäß ausgeführt werden kann, wenn das Ziel die angegebene Aufrufkonvention verwendet.
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. Die Argumente erstellende Codesequenz für eine Instanz oder virtuelle Methode muss diesen Instanzverweis (der kein NULL-Verweis sein darf) vor den Argumenten, die für den Benutzer sichtbar sind, auf dem Stapel ablegen.
SecurityException kann ausgelöst werden, 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 der MSIL-Anweisungen (Microsoft Intermediate Language) in systemeigenen Code.
Mit den folgenden EmitCalli-Methoden kann eine calli-Anweisung auf dem Stapel ausgeführt werden. Beachten Sie, dass calli durch die unten aufgeführten Methoden aufgerufen werden muss. Es ist unzulässig, die Emit-Klasse zu verwenden, um die Anweisung direkt auf dem Stapel abzulegen.
ILGenerator.EmitCalli(Opcode, CallingConventions, Type, Type[], Type[]) für Aufrufe mit einer verwalteten Aufrufkonvention.
ILGenerator.EmitCalli(Opcode, CallingConvention, Type, Type[]) für Aufrufe mit einer nicht verwalteten Aufrufkonvention.
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