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í.
Zavolá 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í hexadecimální formát sestavení instrukce a formát sestavení MSIL (Microsoft Intermediate Language) spolu se stručným souhrnem referenčních informací:
Formát | Formát sestavení | Description |
---|---|---|
6F <T > |
Callvirt method |
Zavolá konkrétní metodu přidruženou k obj . |
Přechodné chování zásobníku v sekvenčním pořadí je:
Odkaz na
obj
objekt je nasdílený do zásobníku.Argumenty
arg1
metody se nasdílíargN
do zásobníku.Argumenty
arg1
metody aargN
odkaz naobj
objekt se vynoře ze zásobníku; volání metody se provede s těmito argumenty a ovládací prvek se přenese do metody, naobj
kterou odkazuje token metadat metody. Po dokončení je volanou metodou vygenerována návratová hodnota a odeslána volajícímu.Vrácená hodnota se nasdílí do zásobníku.
Instrukce callvirt
volá metodu s pozdní vazbou na objekt. To znamená, že metoda je zvolena na základě typu obj
modulu runtime namísto třídy kompilace viditelné v ukazateli metody.
Callvirt
lze použít k volání virtuálních i instanci metod. Instrukci callvirt
může bezprostředně předcházet předpona tail
(Tailcall), která určuje, že aktuální rámec zásobníku má být uvolněn před přenosem ovládacího prvku. Pokud by volání přeneslo řízení na metodu s vyšší důvěryhodností 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, jejíž je instancí. Pokud třída definuje nestatické metody, která odpovídá zadanému názvu a podpisu metody, je volána tato metoda. V opačném případě jsou všechny třídy v řetězci základních tříd této třídy kontrolovány v pořadí. Pokud není nalezena žádná metoda, jedná se o chybu.
Callvirt
před voláním metody zobrazí objekt a přidružené argumenty mimo zásobník vyhodnocení. Pokud má metoda návratovou hodnotu, nasdílí se do zásobníku po dokončení metody. Na straně volaného se k parametru obj
přistupuje jako k argumentu 0, arg1
jako argumentu 1 atd.
Argumenty jsou umístěny v 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 a pak třetí, dokud všechny potřebné 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 nasdílený před libovolným argumentem viditelným uživatelem. Podpis (nesený v tokenu metadat) nemusí obsahovat záznam v seznamu parametrů pro tento ukazatel.
Všimněte si, že virtuální metodu lze také volat pomocí Call instrukce.
MissingMethodException je vyvolán, pokud se ve třídě přidružené k nebo žádné z jejích základních tříd nenašla statická metoda se zadaným názvem a podpisem obj
. To se obvykle zjistí, když se pokyny jazyka MSIL (Microsoft Intermediate Language) převedou na nativní kód místo za běhu.
NullReferenceException je vyvolán, pokud je obj null.
SecurityException vyvolá se, pokud zabezpečení systému neudělí volajícímu přístup k volané metodě. Kontrola zabezpečení může nastat, když se CIL převede na nativní kód, nikoli za běhu.
Poznámka
Při volání metod System.Object u hodnotových typů zvažte použití předpony constrained
callvirt
s pokyny. Tím se odstraní nutnost vygenerovat různé il v závislosti na tom, jestli typ hodnoty přepíše metodu, aby se zabránilo potenciálnímu problému se správou verzí. Zvažte použití předpony constrained
při vyvolání metod rozhraní pro typy hodnot, protože metodu typu hodnoty implementuje metodu rozhraní lze změnit pomocí MethodImpl
. Tyto problémy jsou podrobněji popsány Constrained v opcode.
Následující Emit přetížení metody může použít callvirt
opcode: