Język

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 i Microsoft Intermediate Language (MSIL) instrukcji 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 arg1 metody są argN wypychane do stosu.

  2. Argumenty arg1 metody są argN zwinięte ze stosu. Wywołanie metody jest wykonywane przy użyciu tych argumentów, a kontrolka jest przenoszona do metody, do której odwołuje się deskryptor metody. Po zakończeniu wartość zwracana 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 to token metadanych, który wskazuje metodę wywoływania oraz liczbę, 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. Instrukcję call można bezpośrednio poprzedzić instrukcją prefiksu tail (Tailcall), aby określić, że bieżący stan metody powinien zostać zwolniony przed przeniesieniem kontrolki. Jeśli wywołanie przenosi kontrolkę do metody wyższego zaufania niż metoda źródła, ramka stosu nie zostanie zwolniona. Zamiast tego wykonanie jest kontynuowane dyskretnie tak, 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ą lub funkcją globalną. We wszystkich tych przypadkach adres docelowy jest określany całkowicie z deskryptora metody (z kolei z Callvirt instrukcją wywoływania metod wirtualnych, gdzie adres docelowy zależy również od typu środowiska uruchomieniowego odwołania do wystąpienia wypchniętego Callvirtprzed ).

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. Istnieją trzy ważne przypadki specjalne:

  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 pośredniego (MSIL) są konwertowane na kod natywny, a nie w czasie wykonywania.

Note

Podczas wywoływania metod dla typów wartości System.Object rozważ 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 wersją. Rozważ użycie prefiksu constrained podczas wywoływania metod interfejsu dla typów wartości, ponieważ metoda typu wartości implementując 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:

Note

Metoda EmitCall jest udostępniana dla varargs wywołań. Emit Użyj metody dla wywołań normalnych.

Dotyczy