OpCodes.Call Fält
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
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:
Metodargumenten
arg1skickas tillargNstacken.Metodargument
arg1genomargNpoppas 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.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:
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 skickasthis.Det är giltigt att anropa en virtuell metod med (
calli ställetcallvirtfö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.Observera att en ombudsmetod kan anropas
Invokemed antingen instruktionencallellercallvirt.
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: