Freigeben über


OpCodes.Call-Feld

Ruft die Methode auf, die der übergebene Methodendeskriptor angibt.

Namespace: System.Reflection.Emit
Assembly: mscorlib (in mscorlib.dll)

Syntax

'Declaration
Public Shared ReadOnly Call As OpCode
'Usage
Dim value As OpCode

value = OpCodes.Call
public static readonly OpCode Call
public:
static initonly OpCode Call
public static final OpCode Call
public static final var Call : 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

28 < T >

call methodDesc

Ruft die durch methodDesc beschriebene Methode auf.

Im Stapel laufen die folgenden Aktionen in der angegebenen Reihenfolge ab:

  1. Die Methodenargumente arg1 bis argN werden auf dem Stapel abgelegt.

  2. Die Methodenargumente arg1 bis argN werden vom Stapel geholt. Anschließend wird der Methodenaufruf mit diesen Argumenten ausgeführt, und die Steuerung wird an die Methode übertragen, auf die der Methodendeskriptor verweist. Die aufgerufene Methode erzeugt nun einen Rückgabewert und sendet diesen an die aufrufende Methode.

  3. Der Rückgabewert wird auf dem Stapel abgelegt.

Die call-Anweisung ruft die Methode auf, auf die der Methodendeskriptor verweist, der mit der Anweisung übergeben wurde. Der Methodendeskriptor ist ein Metadatentoken, mit dem die aufzurufende Methode, die zu verwendende Aufrufkonvention sowie Anzahl, Typ und Reihenfolge der Argumente angegeben werden, die für die Übergabe an die Methode auf dem Stapel abgelegt wurden. Der call-Anweisung kann direkt eine tail-Präfixanweisung (Tailcall) vorausgehen, die 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. Das Metadatentoken enthält genügend Informationen, um zu bestimmen, ob eine statische Methode, ein Instanzmethode, eine virtuelle Methode oder eine globale Funktion aufgerufen wird. In allen Fällen wird die Zieladresse ausschließlich über den Methodendeskriptor bestimmt. (Bei der Callvirt-Anweisung zum Aufrufen virtueller Methode ist die Zieladresse hingegen auch vom Laufzeittyp des Instanzverweises abhängig, der vor Callvirt auf dem Stapel abgelegt wird.)

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. Es gibt drei wichtige Sonderfälle:

1. Aufrufe einer Instanzmethode (oder virtuellen Methode) müssen diesen Instanzverweis vor allen für den Benutzer sichtbaren Argumenten auf dem Stapel ablegen. Der Instanzverweis darf kein NULL-Verweis sein. Die Signatur in den Metadaten enthält keinen Eintrag in der Parameterliste für den this-Zeiger. Stattdessen wird durch ein Bit angezeigt, ob der Methode der this-Zeiger übergeben werden muss.

2. Es ist zulässig, eine virtuelle Methode mit call (anstatt mit callvirt) aufzurufen. Dies bedeutet, dass die Methode mit der Klasse aufgelöst werden muss, die durch die Methode angegeben ist, und nicht durch die dynamischen Angaben des aufgerufenen Objekts.

3. Beachten Sie, dass die Invoke-Methode eines Delegaten mit der call-Anweisung oder der callvirt-Anweisung aufgerufen werden kann.

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 (Microsoft Intermediate Language)-Anweisungen 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, anstatt eine call-Anweisung auszugeben. 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 folgenden Überladungen der Emit-Methode verwenden den call-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