Sdílet prostřednictvím


OpCodes.Calli Pole

Definice

Volá metodu uvedenou ve zkušebním zásobníku (jako ukazatel na vstupní bod) s argumenty popsanými konvencí volání.

public: static initonly System::Reflection::Emit::OpCode Calli;
public static readonly System.Reflection.Emit.OpCode Calli;
 staticval mutable Calli : System.Reflection.Emit.OpCode
Public Shared ReadOnly Calli 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
29 <T> Calli callSiteDescr Volá metodu, na kterou je odkazováno, s argumenty popsanými konvencí volání.

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

  1. Argumenty arg1 metody se argN odsílají do zásobníku.

  2. Ukazatel na položku metody je nasdílený do zásobníku.

  3. Ze zásobníku se vynořily argumenty arg1argN metody a ukazatel na zadávání metody; provede se volání metody. Po dokončení je volanou metodou vygenerována návratová hodnota a odeslána volajícímu.

  4. Vrácená hodnota je vložena do zásobníku.

Instrukce calli volá ukazatel zadávání metody s argumenty arg1 prostřednictvím argN. Typy těchto argumentů jsou popsány specifickou konvencí volání (callSiteDesc). Pokynu calli může bezprostředně předcházet předpona tail (Tailcall), která určuje, že se má aktuální stav metody uvolnit před přenesením ovládacího prvku. Pokud volání by přenést řízení na metodu s vyšší důvěryhodností než origin metoda zásobníku nebude uvolněna; místo toho bude provádění bezobslužně pokračovat, jako by tail nebyl dodán.

Předpokládá se, že ukazatel na položku metody je konkrétním ukazatelem na nativní kód (cílového počítače), který lze legitimním způsobem volat pomocí argumentů popsaných konvencí volání (token metadat pro samostatný podpis). Takový ukazatel lze vytvořit pomocí Ldftn pokynů nebo Ldvirtftn nebo předat z nativního kódu.

Konvence volání není kontrolována dynamicky, takže kód, který používá calli instrukce, nefunguje správně, pokud cíl skutečně nepoužívá zadanou konvenci volání.

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í. Sekvence kódu pro vytváření argumentů pro instanci nebo virtuální metodu musí tento odkaz na instanci (který nesmí být odkazem s hodnotou null) před libovolný z argumentů viditelných uživatelem.

SecurityException může být vyvolána, pokud zabezpečení systému neudělí volajícímu přístup k volané metodě. K této 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.

Následující EmitCalli metody lze použít k provedení calli instrukce v zásobníku. Všimněte si, že calli by se měly volat pomocí níže uvedených metod místo použití Emit třídy k umístění instrukce přímo do zásobníku.

Platí pro