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ływania.
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ę wskazywaną za pomocą argumentów opisanych przez konwencję wywoływania. |
Zachowanie przejściowe stosu w kolejności sekwencyjnej jest następujące:
Argumenty
arg1metody sąargNwypychane do stosu.Wskaźnik wejścia metody jest wypychany do stosu.
Argumenty
arg1metody za pomocąargNmetody i wskaźnik wejścia metody są zwinięte ze stosu; wykonywane jest wywołanie metody. Po zakończeniu wartość zwracana jest generowana przez metodę wywoływaną 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ą argNmetody . 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 o wyższym zaufaniu niż metoda źródła, ramka stosu nie zostanie zwolniona; Zamiast tego wykonanie będzie kontynuowane dyskretnie tak, jakby tail nie zostało dostarczone.
Przyjmuje 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 autonomicznego podpisu). Taki wskaźnik można utworzyć przy użyciu instrukcji Ldftn lub Ldvirtftn lub przekazać z kodu natywnego.
Konwencja wywoływania nie jest sprawdzana dynamicznie, dlatego 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 udzielają wywołującego dostępu do wywoływanej metody. Sprawdzanie zabezpieczeń może wystąpić, gdy instrukcje języka Microsoft pośredniego (MSIL) są konwertowane na kod natywny, a nie w czasie wykonywania.
Poniższe EmitCalli metody mogą służyć do wykonywania calli instrukcji na stosie. Należy pamiętać, że calli należy wywołać za pomocą poniższych metod, zamiast używać Emit klasy , aby umieścić instrukcję bezpośrednio na stosie.
ILGenerator.EmitCalli(OpCode, CallingConventions, Type, Type[], Type[]) do wywołań korzystających z konwencji zarządzanego wywoływania.
ILGenerator.EmitCalli(OpCode, CallingConvention, Type, Type[]) do wywołań korzystających z niezarządzanej konwencji wywoływania.