OpCodes.Callvirt 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ę 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:
Odwołanie do
obj
obiektu jest wypychane do stosu.Argumenty
arg1
argN
metody są wypychane do stosu.Argumenty
arg1
metody za pomocąargN
metody i odwołanieobj
do obiektu są wyrzucone ze stosu. Wywołanie metody jest wykonywane przy użyciu tych argumentów i kontrolki jest przenoszone do metody, wobj
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.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 callvirt
programu ) 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: