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 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:
Argumenty
arg1metody sąargNwypychane do stosu.Argumenty
arg1metody sąargNzwinię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.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:
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 przekazaniathiswskaźnika.Prawidłowe jest wywołanie metody wirtualnej przy użyciu
callmetody (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
Invokemożna wywołać za pomocą instrukcjicalllubcallvirt.
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.