OpCodes.Call Fält

Definition

Anropar metoden som anges av den angivna metodbeskrivningen.

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 

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
28 <T> Kalla methodDesc Anropa metoden som beskrivs av methodDesc.

Stackens övergångsbeteende i sekventiell ordning är:

  1. Metodargumenten arg1 skickas till argN stacken.

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

  3. Returvärdet skickas till stacken.

Instruktionen call anropar den metod som anges av metodbeskrivningen som skickades med instruktionen. Metodbeskrivningen är en metadatatoken som anger vilken metod som ska anropas och antalet, typen och ordningen för argumenten som har placerats på stacken som ska skickas till den metoden samt den anropskonvention som ska användas. Instruktionen call kan omedelbart föregås av en tail (Tailcall) prefixinstruktion för att ange att det aktuella metodtillståndet ska släppas innan kontrollen överförs. Om anropet överför kontrollen till en metod med högre förtroende än ursprungsmetoden släpps inte stackramen. I stället fortsätter körningen tyst som om den tail inte hade angetts. Metadatatoken innehåller tillräckligt med information för att avgöra om anropet är till en statisk metod, en instansmetod, en virtuell metod eller en global funktion. I alla dessa fall bestäms måladressen helt från metodbeskrivningen (jämför detta med instruktionen Callvirt för att anropa virtuella metoder, där måladressen också beror på körningstypen för instansreferensen som push-överfördes före Callvirt).

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. Det finns tre viktiga specialfall:

  1. Anrop till en instansmetod (eller virtuell) måste skicka instansreferensen före något av de användar synliga argumenten. Instansreferensen får inte vara en null-referens. Signaturen som bärs i metadata innehåller inte en post i parameterlistan för pekaren this . I stället används lite för att ange om metoden kräver att pekaren skickas this .

  2. Det är giltigt att anropa en virtuell metod med ( call i stället callvirtför ); detta anger att metoden ska matchas med hjälp av klassen som anges av metoden i stället för att anges dynamiskt från objektet som anropas.

  3. Observera att en ombudsmetod kan anropas Invoke med antingen instruktionen call eller callvirt .

SecurityException kan utlöses om systemsäkerhet inte ger anroparen åtkomst till den anropade metoden. Säkerhetskontrollen kan inträffa när instruktionerna för Microsoft mellanliggande språk (MSIL) 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 i stället för att generera en call instruktion. 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överlagringar kan använda call opcode:

Note

Metoden EmitCall tillhandahålls för varargs anrop. Emit Använd metoden för normala anrop.

Gäller för