Sdílet prostřednictvím


OpCodes.Call Pole

Definice

Volá metodu označenou předaným 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í instrukce a formát sestavení MSIL (Microsoft Intermediate Language) spolu se stručným přehledem referencí:

Formát Formát sestavení Description
28 <T> Volání methodDesc Volání metody popsané v methodDesc.

Přechodné chování zásobníku v sekvenčním pořadí je:

  1. Argumenty arg1 metody se argN odsílají do zásobníku.

  2. Ze zásobníku se vynořily argumenty arg1argN metody. Volání metody se provede s těmito argumenty a ovládací prvek se přenese do metody, na kterou odkazuje popisovač metody. Po dokončení je volanou metodou vygenerována návratová hodnota a odeslána volajícímu.

  3. Vrácená hodnota je vložena do zásobníku.

Instrukce call volá metodu označenou popisovačem metody předanou s instrukcí . Popisovač metody je token metadat, který označuje metodu volání a číslo, typ a pořadí argumentů umístěných v zásobníku, které mají být předány této metodě, a také konvenci volání, která se má použít. Pokynu call může bezprostředně předcházet předpona tail (Tailcall) instrukce, která určuje, že aktuální stav metody má být uvolněn před přenesením řízení. Pokud volání přenese řízení na metodu s vyšší důvěryhodností než metoda původu, rámec zásobníku není uvolněn. Místo toho provádění pokračuje tiše, jako by tail nebyla zadána. Token metadat obsahuje dostatečné informace k určení, zda se jedná o 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 na instanci vložené před Callvirt).

Argumenty jsou umístěny v zásobníku v pořadí zleva doprava. To znamená, že první argument je vypočítán a umístěn v zásobníku, pak druhý argument, pak třetí, dokud všechny potřebné argumenty nejsou nad zásobníkem v sestupném pořadí. Existují tři důležité zvláštní případy:

  1. Volání metody instance (nebo virtuální) musí odeslat odkaz na danou instanci před libovolným uživatelem viditelných argumentů. Odkaz na instanci nesmí být nulový. Podpis přenášený v metadatech neobsahuje položku v seznamu parametrů pro this ukazatel; 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 místo callvirt), což znamená, že metoda má být přeložena pomocí třídy určené metodou, nikoli tak, jak je zadána dynamicky z vyvolaného objektu.

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

SecurityException může být vyvolána, pokud zabezpečení systému neudělí volajícímu přístup k volané metodě. Ke kontrole zabezpečení může dojít, když se pokyny jazyka MSIL (Microsoft Intermediate Language) místo za běhu převedou na nativní kód.

Poznámka

Při volání metod System.Object u typů hodnot zvažte použití constrained předpony s callvirt instrukcí místo generování call instrukce. Tím se odstraní potřeba generovat různé il v závislosti na tom, jestli typ hodnoty přepíše metodu, a vyhnete se tak potenciálnímu problému se správou verzí. Zvažte použití předpony constrained při vyvolání metod rozhraní u hodnotových typů, protože metodu hodnotového typu, která implementuje metodu rozhraní, lze změnit pomocí MethodImpl. Tyto problémy jsou podrobněji popsány Constrained v opcode.

Emit Následující přetížení metody mohou použít call opcode:

Poznámka

Metoda EmitCall je k dispozici pro varargs volání. Pro normální volání použijte metodu Emit .

Platí pro