OpCodes.Callvirt Pole

Definice

Volá metodu s pozdní vazbou na objekt a nasdílí návratovou hodnotu do zásobníku vyhodnocení.

public: static initonly System::Reflection::Emit::OpCode Callvirt;
public static readonly System.Reflection.Emit.OpCode Callvirt;
 staticval mutable Callvirt : System.Reflection.Emit.OpCode
Public Shared ReadOnly Callvirt 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
6F <T> Callvirt method Volá konkrétní metodu přidruženou .obj

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

  1. Odkaz na obj objekt se nasdílí do zásobníku.

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

  3. Argumenty arg1 metody prostřednictvím argN a odkaz na obj objekt jsou 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 uvedené obj token metadat metody. Po dokončení je vrácená hodnota vygenerována volanou metodou a odeslána volajícímu.

  4. Vrácená hodnota se nasdílí do zásobníku.

Instrukce callvirt volá metodu s pozdní vazbou na objektu. To znamená, že metoda je zvolena na základě typu modulu runtime namísto třídy obj kompilátoru viditelné v ukazateli metody. Callvirt lze použít k volání virtuálních i instance metod. Před callvirt předponou tail () může bezprostředně předcházet předpona (Tailcall), aby bylo možné určit, že se má aktuální rámec zásobníku uvolnit před přenosem ovládacího prvku. Pokud by volání přeneslo řízení na metodu vyšší důvěryhodnosti než původní metoda, rámec zásobníku nebude uvolněn.

Token metadat metody poskytuje název, třídu a podpis metody, která se má volat. Třída přidružená obj je třída, pro kterou se jedná o instanci. Pokud třída definuje ne statickou metodu, která odpovídá zadanému názvu metody a podpisu, volá se tato metoda. V opačném případě jsou všechny třídy v řetězci základní třídy této třídy kontrolovány v pořadí. Pokud nebyla nalezena žádná metoda, jedná se o chybu.

Callvirt před voláním metody zobrazí objekt a přidružené argumenty ze zásobníku vyhodnocení. Pokud má metoda návratovou hodnotu, při dokončení metody se nasdílí do zásobníku. Na volané straně se k parametru obj přistupuje jako argument 0, arg1 jako argument 1 atd.

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í. Odkaz na obj instanci (vždy vyžadovaný pro callvirt) musí být vložen před libovolnými argumenty viditelnými uživatelem. Podpis (přenášený v tokenu metadat) nemusí obsahovat položku v seznamu parametrů pro tento ukazatel.

Všimněte si, že virtuální metoda se dá volat také pomocí Call instrukce.

MissingMethodException je vyvolán, pokud není statická metoda se zadaným názvem a podpis nebyl nalezen ve třídě přidružené obj nebo žádné z jejích základních tříd. To se obvykle zjistí, když se instrukce jazyka MSIL (Microsoft Intermediate Language) převedou na nativní kód, nikoli za běhu.

NullReferenceException je vyvolán, pokud je obj null.

SecurityException je vyvolána, pokud zabezpečení systému neuděluje volajícímu přístup k volané metodě. Při převodu souboru CIL na nativní kód místo za běhu může dojít ke kontrole zabezpečení.

Note

Při volání metod System.Object u typů hodnot zvažte použití constrained předpony callvirt s instrukcí. 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.

Emit Následující přetížení metody může použít callvirt opcode:

Platí pro