OpCodes.Callvirt Fält

Definition

Anropar en sen bindningsmetod för ett objekt och push-överför returvärdet till utvärderingsstacken.

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 

Fältvärde

Kommentarer

I följande tabell visas instruktionens sammansättningsformat för hexadecimalt och Microsoft mellanliggande språk (MSIL), tillsammans med en kort referenssammanfattning:

Format Sammansättningsformat Description
6F <T> callvirt method Anropar en specifik metod som är associerad med obj.

Stackens övergångsbeteende i sekventiell ordning är:

  1. En objektreferens obj skickas till stacken.

  2. Metodargumenten arg1 skickas till argN stacken.

  3. Metodargument arg1 genom argN och objektreferensen obj poppas från stacken. Metodanropet utförs med dessa argument och kontrollen överförs till den metod som obj anges av metodens metadatatoken. När det är klart genereras ett returvärde av anroparmetoden och skickas till anroparen.

  4. Returvärdet skickas till stacken.

Instruktionen callvirt anropar en sen bindningsmetod för ett objekt. Metoden väljs alltså baserat på körningstypen obj i stället för den kompileringstidsklass som visas i metodpekaren. Callvirt kan användas för att anropa både virtuella metoder och instansmetoder. Instruktionen callvirt kan omedelbart föregås av ett tail (Tailcall) prefix för att ange att den aktuella stackramen ska släppas innan kontrollen överförs. Om anropet överför kontrollen till en metod med högre förtroende än den ursprungliga metoden släpps inte stackramen.

Metodens metadatatoken innehåller namnet, klassen och signaturen för den metod som ska anropas. Klassen som är associerad med obj är den klass som den är en instans av. Om klassen definierar en icke-statisk metod som matchar det angivna metodnamnet och signaturen anropas den här metoden. Annars kontrolleras alla klasser i basklasskedjan för den här klassen i ordning. Det är ett fel om ingen metod hittas.

Callvirt pops objektet och de associerade argumenten från utvärderingsstacken innan metoden anropas. Om metoden har ett returvärde pushas den på stacken när metoden har slutförts. På anroparsidan används parametern obj som argument 0, arg1 som argument 1 och så vidare.

Argumenten placeras på stacken i vänster-till-höger-ordning. Det första argumentet beräknas och placeras på stacken, sedan det andra argumentet, sedan det tredje, tills alla nödvändiga argument ligger ovanpå stacken i fallande ordning. Instansreferensen obj (krävs alltid för callvirt) måste push-överföras innan något av de användar synliga argumenten. Signaturen (som finns i metadatatoken) behöver inte innehålla en post i parameterlistan för den här pekaren.

Observera att en virtuell metod också kan anropas med hjälp av instruktionen Call .

MissingMethodException utlöses om en icke-statisk metod med det angivna namnet och signaturen inte kunde hittas i klassen som är associerad med obj eller någon av dess basklasser. Detta identifieras vanligtvis när instruktioner för Microsoft mellanliggande språk (MSIL) konverteras till intern kod i stället för vid körning.

NullReferenceException utlöses om obj är null.

SecurityException utlöses om systemsäkerhet inte ger anroparen åtkomst till den anropade metoden. Säkerhetskontrollen kan inträffa när CIL konverteras till intern kod i stället för vid körning.

Note

När du anropar metoder för System.Object på värdetyper bör du överväga att använda constrained prefixet med instruktionen callvirt . Detta tar bort behovet av att generera olika IL beroende på om värdetypen åsidosätter metoden eller inte, vilket undviker ett potentiellt versionsproblem. Överväg att använda prefixet constrained när du anropar gränssnittsmetoder för värdetyper, eftersom metoden för värdetyp som implementerar gränssnittsmetoden kan ändras med hjälp av en MethodImpl. Dessa problem beskrivs mer detaljerat i Constrained opcode.

Följande Emit metodöverlagring kan använda callvirt opcode:

Gäller för