OpCodes.Call 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 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:
Argumenty
arg1
metody seargN
odsílají do zásobníku.Ze zásobníku se vynořily argumenty
arg1
argN
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.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:
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.Je platné volat virtuální metodu pomocí (
call
místocallvirt
), 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.Všimněte si, že metodu delegáta
Invoke
je možné volat pomocícall
instrukce nebocallvirt
.
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 .