OpCodes.Call 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ą przez deskryptor metody przekazanej.
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
Wartość pola
Uwagi
W poniższej tabeli wymieniono format zestawu szesnastkowy instrukcji i microsoft intermediate language (MSIL) wraz z krótkim podsumowaniem referencyjnym:
Format | Format zestawu | Opis |
---|---|---|
28 <T > |
Wywołanie methodDesc |
Wywołaj metodę opisaną przez methodDesc metodę . |
Zachowanie przejściowe stosu w kolejności sekwencyjnej jest następujące:
Argumenty
arg1
argN
metody są wypychane do stosu.Argumenty metody są
argN
wyrzuconearg1
ze stosu. Wywołanie metody jest wykonywane przy użyciu tych argumentów, a kontrolka jest przekazywana do metody, do której odwołuje się deskryptor metody. Po zakończeniu zwracana wartość jest generowana przez metodę wywoływaną i wysyłana do obiektu wywołującego.Wartość zwracana jest wypychana do stosu.
Instrukcja call
wywołuje metodę wskazaną przez deskryptor metody przekazany z instrukcją . Deskryptor metody jest tokenem metadanych, który wskazuje metodę do wywołania oraz numer, typ i kolejność argumentów, które zostały umieszczone na stosie, które mają zostać przekazane do tej metody, a także konwencję wywoływania do użycia. Instrukcja call
może być bezpośrednio poprzedzona instrukcją prefiksu tail
(Tailcall), aby określić, że bieżący stan metody powinien zostać zwolniony przed przekazaniem kontrolki. Jeśli wywołanie przenosi kontrolkę do metody o wyższym zaufaniu niż metoda źródła, ramka stosu nie zostanie zwolniona. Zamiast tego wykonanie jest kontynuowane w trybie dyskretnym, jakby tail
nie zostało dostarczone. Token metadanych zawiera wystarczające informacje, aby określić, czy wywołanie jest metodą statyczną, metodą wystąpienia, metodą wirtualną, czy funkcją globalną. We wszystkich tych przypadkach adres docelowy jest określany całkowicie z deskryptora metody (kontrastuje to z instrukcją Callvirt wywoływania metod wirtualnych, gdzie adres docelowy zależy również od typu środowiska uruchomieniowego odwołania do wystąpienia wypchniętego przed Callvirt).
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, następnie trzeci, aż wszystkie niezbędne argumenty znajdują się na szczycie stosu w kolejności malejącej. Istnieją trzy ważne specjalne przypadki:
Wywołania metody wystąpienia (lub wirtualnej) muszą wypchnąć odwołanie do tego wystąpienia przed dowolnym z argumentów widocznych dla użytkownika. Odwołanie do wystąpienia nie może być odwołaniem o wartości null. Podpis przenoszony w metadanych nie zawiera wpisu na liście parametrów wskaźnika
this
. Zamiast tego używa bitu, aby wskazać, czy metoda wymaga przekazaniathis
wskaźnika.Prawidłowe jest wywołanie metody wirtualnej przy użyciu
call
metody (zamiastcallvirt
); oznacza to, że metoda ma zostać rozpoznana przy użyciu klasy określonej przez metodę, a nie jako określoną dynamicznie z wywoływanego obiektu.Należy pamiętać, że metodę delegata
Invoke
można wywołać za pomocą instrukcjicall
lubcallvirt
.
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 Intermediate Language (MSIL) są konwertowane na kod natywny, a nie w czasie wykonywania.
Uwaga
Podczas wywoływania metod typów wartości System.Object należy rozważyć użycie prefiksu constrained
callvirt
z instrukcją call
zamiast emitowania instrukcji. Eliminuje to konieczność emitowania różnych il w zależności od tego, czy typ wartości zastępuje metodę, unikając potencjalnego problemu z przechowywaniem wersji. Rozważ użycie prefiksu constrained
podczas wywoływania metod interfejsu dla typów wartości, ponieważ metoda typu wartości implementujące metodę interfejsu można zmienić przy użyciu klasy MethodImpl
. Te problemy zostały szczegółowo opisane w Constrained kodzie opcode.
Emit Następujące przeciążenia metody mogą używać call
kodu opcode:
Uwaga
Metoda EmitCall jest udostępniana dla varargs
wywołań.
Emit Użyj metody dla wywołań normalnych.