OpCodes.Call Pole
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Volá metodu označenou předanou popisovačem metody.
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
Hodnota pole
Poznámky
Následující tabulka uvádí šestnáctkový formát sestavení jazyka MSIL (Intermediate Language) a Microsoft s stručným přehledem referenčních informací:
| Formát | Formát sestavení | Description |
|---|---|---|
28 <T> |
Volání methodDesc |
Volejte metodu popsanou metodou methodDesc. |
Přechodné chování zásobníku v sekvenčním pořadí je:
Argumenty
arg1metody jsouargNvloženy do zásobníku.Argumenty
arg1metody jsouargNvynechány ze zásobníku; volání metody se provádí s těmito argumenty a ovládací prvek je přenesen do metody odkazované popisovačem metody. Po dokončení je vrácená hodnota vygenerována volanou metodou a odeslána volajícímu.Vrácená hodnota se nasdílí do zásobníku.
Instrukce call volá metodu označenou popisovačem metody předanou instrukcí. Popisovač metody je token metadat, který označuje metodu volání a číslo, typ a pořadí argumentů, které byly umístěny do zásobníku, které mají být předány této metodě, a také volající konvence, které se mají použít. Instrukce call může bezprostředně předcházet před předponou tail (Tailcall), aby bylo možné určit, že aktuální stav metody by měl být vydán před převodem řízení. Pokud volání přenese řízení na metodu vyšší důvěryhodnosti než metoda původu, rámec zásobníku se nevyvolá. Místo toho provádění pokračuje bezobslužně, jako by tail nebylo dodáno. Token metadat má dostatek informací k určení, jestli je volání statické metody, metody instance, virtuální metody nebo globální funkce. Ve všech těchto případech je cílová adresa určena zcela z popisovače metody (na rozdíl od Callvirt instrukce pro volání virtuálních metod, kde cílová adresa také závisí na typu modulu runtime odkazu instance nabízené před Callvirt).
Argumenty se umístí do zásobníku v pořadí zleva doprava. To znamená, že první argument se vypočítá a umístí do zásobníku, pak druhý argument, potom třetí, dokud všechny nezbytné argumenty nejsou na vrcholu zásobníku v sestupném pořadí. Existují tři důležité zvláštní případy:
Volání instance (nebo virtuální) metody musí odeslat odkaz na danou instanci před libovolným argumentem viditelným uživatelem. Odkaz na instanci nesmí být nulovým odkazem. Podpis přenášený v metadatech neobsahuje položku v seznamu parametrů ukazatele
this; místo toho používá bit k označení, zda metoda vyžaduje předáníthisukazatele.Je platné volat virtuální metodu pomocí
call(nikolicallvirt); to znamená, že metoda se má přeložit pomocí třídy určené metodou namísto dynamického zadání z objektu, který je vyvolán.Všimněte si, že metodu delegáta
Invokeje možné volat buďcallpomocí instrukce nebo instrukcecallvirt.
SecurityException může být vyvolána, pokud zabezpečení systému neuděluje volajícímu přístup k volané metodě. Ke kontrole zabezpečení může dojít v případě, že se instrukce jazyka MSIL (Microsoft Intermediate Language) převedou na nativní kód, nikoli za běhu.
Note
Při volání metod System.Object u typů hodnot zvažte použití constrained předpony callvirt s instrukcí místo generování call instrukce. Tím se odebere potřeba vygenerovat různé il v závislosti na tom, jestli typ hodnoty přepíše metodu, aby nedocházelo k potenciálnímu problému s verzí. Při vyvolání metod rozhraní u typů hodnot zvažte použití constrained předpony, protože metodu typu hodnoty, která implementuje metodu rozhraní, lze změnit pomocí MethodImplmetody . Tyto problémy jsou podrobněji popsány v Constrained opcode.
Následující Emit přetížení metody může použít call opcode: