OpCodes.Call Pole

Definice

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:

  1. Argumenty arg1 metody jsou argN vloženy do zásobníku.

  2. Argumenty arg1 metody jsou argN vynechá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.

  3. 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:

  1. 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í this ukazatele.

  2. Je platné volat virtuální metodu pomocí call (nikoli callvirt); 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.

  3. Všimněte si, že metodu delegáta Invoke je možné volat buď call pomocí instrukce nebo instrukce callvirt .

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:

Note

Metoda EmitCall je poskytována pro varargs volání. Použijte metodu Emit pro normální volání.

Platí pro