OpCodes.Callvirt 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 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:
Odkaz na
objobjekt se nasdílí do zásobníku.Argumenty
arg1metody jsouargNvloženy do zásobníku.Argumenty
arg1metody prostřednictvímargNa odkaz naobjobjekt 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éobjtoken metadat 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 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: