OpCodes.Call Veld

Definitie

Roept de methode aan die wordt aangegeven door de doorgegeven methodedescriptor.

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 

Waarde van veld

Opmerkingen

De volgende tabel bevat de hexadecimale en Microsoft MSIL-assembly-indeling (Tussenliggende taal), samen met een beknopt overzicht:

Format Assembly-indeling Description
28 <T> Oproep methodDesc Roep de methode aan die wordt beschreven door methodDesc.

Het overgangsgedrag van de stack, in opeenvolgende volgorde, is:

  1. Methodeargumenten arg1 worden argN naar de stapel gepusht.

  2. Methodeargumenten arg1argN worden uit de stack gepopt. De methodeaanroep wordt uitgevoerd met deze argumenten en het besturingselement wordt overgebracht naar de methode waarnaar wordt verwezen door de methodedescriptor. Wanneer u klaar bent, wordt er een retourwaarde gegenereerd door de aanroepmethode en verzonden naar de aanroeper.

  3. De retourwaarde wordt naar de stack gepusht.

De call instructie roept de methode aan die wordt aangegeven door de methodedescriptor die met de instructie is doorgegeven. De methodedescriptor is een metagegevenstoken dat de methode aangeeft die moet worden aangeroepen en het nummer, het type en de volgorde van de argumenten die zijn geplaatst op de stack die aan die methode moeten worden doorgegeven, evenals de aanroepconventie die moet worden gebruikt. De call instructie kan direct worden voorafgegaan door een tail (Tailcall) voorvoegselinstructie om op te geven dat de huidige methodestatus moet worden vrijgegeven voordat het besturingselement wordt overgedragen. Als de aanroep het besturingselement overdraagt naar een methode met een hogere vertrouwensrelatie dan de oorspronkelijke methode, wordt het stackframe niet vrijgegeven. In plaats daarvan blijft de uitvoering op de achtergrond alsof het tail niet was opgegeven. Het metagegevenstoken bevat voldoende informatie om te bepalen of de aanroep een statische methode, een instantiemethode, een virtuele methode of een globale functie is. In al deze gevallen wordt het doeladres volledig bepaald op basis van de methodedescriptor (contrasteert dit met de instructie voor het Callvirt aanroepen van virtuele methoden, waarbij het doeladres ook afhankelijk is van het runtime-type van het exemplaar waarnaar vóór de Callvirtverwijzing wordt gepusht ).

De argumenten worden op de stapel geplaatst in volgorde van links naar rechts. Dat wil gezegd, het eerste argument wordt berekend en op de stapel geplaatst, vervolgens het tweede argument, vervolgens het derde, totdat alle benodigde argumenten boven de stapel in aflopende volgorde staan. Er zijn drie belangrijke speciale gevallen:

  1. Aanroepen naar een instantiemethode (of virtuele) moeten die instantieverwijzing pushen vóór een van de door de gebruiker zichtbare argumenten. De instantiereferentie mag geen null-verwijzing zijn. De handtekening die in de metagegevens wordt uitgevoerd, bevat geen vermelding in de parameterlijst voor de this aanwijzer. In plaats daarvan wordt een beetje gebruikt om aan te geven of de methode de this aanwijzer moet doorgeven.

  2. Het is geldig om een virtuele methode aan te roepen met behulp van call (in plaats callvirtvan ); dit geeft aan dat de methode moet worden omgezet met behulp van de klasse die is opgegeven door de methode in plaats van zoals dynamisch is opgegeven vanuit het object dat wordt aangeroepen.

  3. Houd er rekening mee dat de methode van Invoke een gemachtigde kan worden aangeroepen met de call of callvirt instructie.

SecurityException kan worden gegenereerd als systeembeveiliging de aanroeper geen toegang verleent tot de aangeroepen methode. De beveiligingscontrole kan optreden wanneer de instructies van de Microsoft Tussenliggende taal (MSIL) worden geconverteerd naar systeemeigen code in plaats van tijdens runtime.

Note

Wanneer u methoden van System.Object aanroept voor waardetypen, kunt u het constrained voorvoegsel gebruiken met de callvirt instructie in plaats van een call instructie te verzenden. Hierdoor hoeft u geen andere IL te verzenden, afhankelijk van of het waardetype de methode overschrijft, waardoor een mogelijk versiebeheerprobleem wordt voorkomen. Overweeg het voorvoegsel te gebruiken bij het constrained aanroepen van interfacemethoden voor waardetypen, omdat de methode voor het waardetype waarmee de interfacemethode wordt geïmplementeerd, kan worden gewijzigd met behulp van een MethodImpl. Deze problemen worden gedetailleerder beschreven in de Constrained opcode.

De volgende Emit methode overbelastingen kunnen de call opcode gebruiken:

Note

De EmitCall methode wordt opgegeven voor varargs aanroepen. Gebruik de Emit methode voor normale aanroepen.

Van toepassing op