Sdílet prostřednictvím


OpCodes.Callvirt Pole

Definice

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:

  1. Odkaz na obj objekt je nasdílený do zásobníku.

  2. Argumenty arg1 metody se nasdílí argN do zásobníku.

  3. Argumenty arg1 metody a argN odkaz na obj 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, na obj kterou odkazuje token metadat metody. Po dokončení je volanou metodou vygenerována návratová hodnota 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 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 constrainedcallvirt 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:

Platí pro