Udostępnij za pośrednictwem


OpCodes.Call Pole

Definicja

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 methodDescmetodę .

Zachowanie przejściowe stosu w kolejności sekwencyjnej jest następujące:

  1. Argumenty arg1argN metody są wypychane do stosu.

  2. Argumenty metody są argN wyrzucone arg1 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.

  3. 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:

  1. 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 przekazania this wskaźnika.

  2. Prawidłowe jest wywołanie metody wirtualnej przy użyciu call metody (zamiast callvirt); 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.

  3. Należy pamiętać, że metodę delegata Invoke można wywołać za pomocą instrukcji call lub callvirt .

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 constrainedcallvirt 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.

Dotyczy