OpCodes.Call 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 Methode auf, die der übergebene Methodendeskriptor angibt.
public: static initonly System::Reflection::Emit::OpCode Call;
public static readonly System.Reflection.Emit.OpCode Call;
staticval mutable Call : System.Reflection.Emit.OpCode
Public Shared ReadOnly Call 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 |
|---|---|---|
28 <T> |
call methodDesc („555-555-5555“ anrufen) |
Rufen Sie die von beschriebene Methode auf methodDesc. |
Das Übergangsverhalten des Stapels in sequenzieller Reihenfolge lautet:
Methodenargumente
arg1durchargNwerden auf den Stapel gepusht.Methodenargumente
arg1durchargNwerden aus dem Stapel übertragen. Der Methodenaufruf wird mit diesen Argumenten ausgeführt, und die Steuerung wird an die Methode übertragen, auf die vom Methodendeskriptor verwiesen wird. Nach Abschluss des Vorgangs wird von der aufgerufenen Methode ein Rückgabewert generiert und an den Aufrufer gesendet.Der Rückgabewert wird auf den Stapel gepusht.
Die call -Anweisung ruft die -Methode auf, die durch den Methodendeskriptor angegeben wird, der mit der -Anweisung übergeben wird. Der Methodendeskriptor ist ein Metadatentoken, das die aufzurufende Methode und die Anzahl, den Typ und die Reihenfolge der Argumente angibt, die im Stapel platziert wurden, um an diese Methode zu übergeben, sowie die zu verwendende Aufrufkonvention. Der call -Anweisung kann sofort eine tail Präfixanweisung (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 überträgt, wird der Stapelrahmen nicht freigegeben. Stattdessen wird die Ausführung im Hintergrund fortgesetzt, als ob nicht tail bereitgestellt worden wäre. Das Metadatentoken enthält ausreichende Informationen, um zu bestimmen, ob der Aufruf einer statischen Methode, einer instance-Methode, einer virtuellen Methode oder einer globalen Funktion erfolgt. In all diesen Fällen wird die Zieladresse vollständig aus dem Methodendeskriptor bestimmt (kontrastiert dies mit der Callvirt Anweisung zum Aufrufen virtueller Methoden, wobei die Zieladresse auch vom Laufzeittyp des instance Verweis abhängt, der vor den Callvirtgepusht wird.
Die Argumente werden in der Reihenfolge von links nach rechts im Stapel platziert. Das heißt, das erste Argument wird berechnet und im Stapel platziert, dann das zweite Argument, dann das dritte, bis alle erforderlichen Argumente in absteigender Reihenfolge auf dem Stapel stehen. Es gibt drei wichtige Sonderfälle:
Aufrufe einer instance (oder virtuellen) Methode müssen pushen, die instance Verweis vor einem der vom Benutzer sichtbaren Argumente übertragen. Der instance-Verweis darf kein NULL-Verweis sein. Die in den Metadaten enthaltene Signatur enthält keinen Eintrag in der Parameterliste für den
thisZeiger. Stattdessen wird ein Bit verwendet, um anzugeben, ob die Methode das Übergeben desthisZeigers erfordert.Es ist gültig, eine virtuelle Methode mit
call(anstellecallvirtvon ) aufzurufen. Dies bedeutet, dass die Methode mithilfe der klasse aufgelöst werden soll, die von der -Methode angegeben wird, anstatt wie dynamisch vom aufgerufenen Objekt angegeben.Beachten Sie, dass die Methode eines Delegaten
Invokeentweder mit dercall-Anweisung odercallvirtaufgerufen werden kann.
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 MSIL-Anweisungen (Microsoft Intermediate Language) nicht zur Laufzeit, sondern in nativen Code konvertiert werden.
Hinweis
Wenn Sie Methoden von System.Object für Werttypen aufrufen, sollten Sie das constrained Präfix mit der callvirt -Anweisung verwenden, anstatt eine call Anweisung ausgibt. Dadurch entfällt die Notwendigkeit, je nachdem, ob der Werttyp die Methode überschreibt, unterschiedliche IL-Werte auszugeben, wodurch ein potenzielles Versionsverwaltungsproblem vermieden wird. Erwägen Sie die Verwendung des constrained Präfixes beim Aufrufen von Schnittstellenmethoden für Werttypen, da die Werttypmethode, die die Schnittstellenmethode implementiert, mithilfe eines MethodImplgeändert werden kann. Diese Probleme werden im Constrained Opcode ausführlicher beschrieben.
Die folgenden Emit Methodenüberladungen können den call Opcode verwenden:
Hinweis
Die EmitCall -Methode wird für varargs Aufrufe bereitgestellt. Verwenden Sie die Emit -Methode für normale Aufrufe.