OpCodes.Callvirt Pole

Definicja

Wywołuje metodę z opóźnieniem w obiekcie, wypychając wartość zwracaną do stosu oceny.

public: static initonly System::Reflection::Emit::OpCode Callvirt;
public static readonly System.Reflection.Emit.OpCode Callvirt;
 staticval mutable Callvirt : System.Reflection.Emit.OpCode
Public Shared ReadOnly Callvirt 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
6F <T> callvirt method Wywołuje określoną metodę skojarzona z elementem obj.

Zachowanie przejściowe stosu w kolejności sekwencyjnej to:

  1. Odwołanie do obj obiektu jest wypychane do stosu.

  2. Argumenty arg1argN metody są wypychane do stosu.

  3. Argumenty arg1 metody za pomocą argN metody i odwołanie obj do obiektu są wyrzucone ze stosu. Wywołanie metody jest wykonywane przy użyciu tych argumentów i kontrolki jest przenoszone do metody, w obj której odwołuje się token metadanych metody. Po zakończeniu zwracana wartość jest generowana przez metodę callee i wysyłana do obiektu wywołującego.

  4. Wartość zwracana jest wypychana do stosu.

Instrukcja callvirt wywołuje metodę związaną z opóźnieniem na obiekcie. Oznacza to, że metoda jest wybierana na podstawie typu obj środowiska uruchomieniowego zamiast klasy czasu kompilacji widocznej w wskaźniku metody. Callvirt może służyć do wywoływania metod wirtualnych i wystąpień. Instrukcja callvirt może być natychmiast poprzedzona prefiksem tail (Tailcall), aby określić, że bieżąca ramka stosu powinna zostać zwolniona przed przeniesieniem kontrolki. Jeśli wywołanie przeniesie kontrolę do metody wyższego zaufania niż oryginalna metoda, ramka stosu nie zostanie zwolniona.

Token metadanych metody udostępnia nazwę, klasę i podpis metody do wywołania. Klasa skojarzona z obj jest klasą, z którą jest wystąpieniem. Jeśli klasa definiuje metodę niestacyjną zgodną ze wskazaną nazwą metody i podpisem, ta metoda jest wywoływana. W przeciwnym razie wszystkie klasy w łańcuchu klas bazowych tej klasy są sprawdzane w kolejności. Jest to błąd, jeśli nie znaleziono metody.

Callvirt wyskakuje obiekt i skojarzone argumenty z stosu oceny przed wywołaniem metody. Jeśli metoda ma wartość zwracaną, jest wypychana na stos po zakończeniu metody. Po stronie obj wywoływanej parametr jest uzyskiwany jako argument 0, arg1 jako argument 1 itd.

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. Odwołanie do obj wystąpienia (zawsze wymagane dla callvirtprogramu ) musi zostać wypchnięte przed dowolnym argumentem widocznym dla użytkownika. Podpis (przenoszony w tokenie metadanych) nie musi zawierać wpisu na liście parametrów dla tego wskaźnika.

Należy pamiętać, że można również wywołać metodę wirtualną przy użyciu instrukcji Call .

MissingMethodException jest zgłaszany, jeśli niestatyczna metoda o wskazanej nazwie i podpisie nie można odnaleźć w klasie skojarzonej z klasą lub żadnej z obj jej klas bazowych. Zazwyczaj jest to wykrywane, gdy instrukcje języka Microsoft Intermediate Language (MSIL) są konwertowane na kod natywny, a nie w czasie wykonywania.

NullReferenceException jest zgłaszany, jeśli wartość obj ma wartość null.

SecurityException jest zgłaszany, jeśli zabezpieczenia systemu nie udzielają wywołującego dostępu do wywoływanej metody. Sprawdzanie zabezpieczeń może wystąpić, gdy CIL jest konwertowany na kod natywny, a nie w czasie wykonywania.

Uwaga

Podczas wywoływania metod typu wartości System.Object należy rozważyć użycie prefiksu constrained z instrukcją callvirt . Eliminuje to konieczność emitowania różnych nazw 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ącego metodę interfejsu można zmienić przy użyciu metody MethodImpl. Te problemy zostały szczegółowo opisane w Constrained kodzie opcode.

Następujące Emit przeciążenie metody może używać callvirt kodu opcode:

Dotyczy