OpCodes.Calli Pole
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Wywołuje metodę wskazaną na stosie oceny (jako wskaźnik do punktu wejścia) z argumentami opisanymi przez konwencję wywołującą.
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
Wartość pola
Uwagi
W poniższej tabeli wymieniono format zestawu szesnastkowy i microsoft intermediate language (MSIL) instrukcji wraz z krótkim podsumowaniem referencyjnym:
Format | Format zestawu | Opis |
---|---|---|
29 <T > |
Calli callSiteDescr |
Wywołuje metodę wskazującą na argumenty opisane przez konwencję wywołującą. |
Zachowanie przejściowe stosu w kolejności sekwencyjnej to:
Argumenty
arg1
argN
metody są wypychane do stosu.Wskaźnik wejścia metody jest wypychany do stosu.
Argumenty
arg1
metody za pośrednictwemargN
metody i wskaźnik wejścia metody są wyskoczone ze stosu; wykonywane jest wywołanie metody. Po zakończeniu zwracana wartość jest generowana przez metodę callee i wysyłana do obiektu wywołującego.Wartość zwracana jest wypychana do stosu.
Instrukcja calli
wywołuje wskaźnik wejścia metody z argumentami arg1
za pomocą metody argN
. Typy tych argumentów są opisane przez konkretną konwencję wywoływania (callSiteDesc
). Instrukcja calli
może być natychmiast poprzedzona prefiksem tail
(Tailcall), aby określić, że bieżący stan metody powinien zostać zwolniony przed przeniesieniem kontrolki. Jeśli wywołanie przeniesie kontrolę do metody wyższego zaufania niż metoda źródła, ramka stosu nie zostanie zwolniona; Zamiast tego wykonanie będzie kontynuowane w trybie dyskretnym, jakby tail
nie zostało dostarczone.
Zakłada się, że wskaźnik wejścia metody jest określonym wskaźnikiem do kodu natywnego (maszyny docelowej), który może być legalnie wywoływany z argumentami opisanymi przez konwencję wywołującą (token metadanych dla sygnatury autonomicznej). Taki wskaźnik można utworzyć przy użyciu Ldftn instrukcji lub Ldvirtftn lub przekazać z kodu natywnego.
Konwencja wywoływania nie jest sprawdzana dynamicznie, więc kod używający calli
instrukcji nie działa poprawnie, jeśli miejsce docelowe nie używa określonej konwencji wywoływania.
Argumenty są umieszczane na stosie w kolejności od lewej do prawej. Oznacza to, że pierwszy argument jest obliczany i umieszczany na stosie, a następnie drugi argument, a następnie trzeci, aż wszystkie niezbędne argumenty znajdują się na szczycie stosu w kolejności malejącej. Sekwencja kodu tworzenia argumentów dla wystąpienia lub metody wirtualnej musi wypchnąć odwołanie do tego wystąpienia (które nie może być odwołaniem o wartości null) przed żadnym z argumentów widocznych dla użytkownika.
SecurityException może zostać zgłoszony, jeśli zabezpieczenia systemu nie przyznają obiektowi wywołującego dostępu do wywoływanej metody. Sprawdzanie zabezpieczeń może wystąpić, gdy instrukcje języka Microsoft Intermediate Language (MSIL) są konwertowane na kod natywny, a nie w czasie wykonywania.
EmitCalli Poniższe metody mogą służyć do wykonywania calli
instrukcji na stosie. Należy pamiętać, że calli
należy wywołać poniższe metody, zamiast używać Emit klasy do umieszczania instrukcji bezpośrednio na stosie.
ILGenerator.EmitCalli(OpCode, CallingConventions, Type, Type[], Type[]) w przypadku wywołań korzystających z zarządzanej konwencji wywoływania.
ILGenerator.EmitCalli(OpCode, CallingConvention, Type, Type[]) w przypadku wywołań korzystających z niezarządzanej konwencji wywoływania.