Partager via


OpCodes.Callvirt Champ

Définition

Appelle une méthode à liaison tardive sur un objet, en exécutant un push de la valeur de retour dans la pile d'évaluation.

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 

Valeur de champ

Remarques

Le tableau suivant répertorie le format d’assembly MSIL et hexadécimal de l’instruction, ainsi qu’un bref résumé des références :

Format Format d’assembly Description
6F <T> callvirt method Appelle une méthode spécifique associée objà .

Le comportement transitoire de la pile, dans l’ordre séquentiel, est le suivant :

  1. Une référence obj d’objet est envoyée sur la pile.

  2. Les arguments de arg1 méthode sont argN envoyés à la pile.

  3. Les arguments arg1 de méthode via argN et la référence obj d’objet sont extraits de la pile ; l’appel de méthode est effectué avec ces arguments et le contrôle est transféré vers la méthode en obj référence par le jeton de métadonnées de méthode. Une fois l’opération terminée, une valeur de retour est générée par la méthode appelée et envoyée à l’appelant.

  4. La valeur de retour est poussée vers la pile.

L’instruction callvirt appelle une méthode liée en retard sur un objet. Autrement dit, la méthode est choisie en fonction du type d’exécution de plutôt que de obj la classe de compilation visible dans le pointeur de méthode. Callvirtpeut être utilisé pour appeler des méthodes virtuelles et instance. L’instruction callvirt peut être immédiatement précédée d’un tail préfixe (Tailcall) pour spécifier que l’image de pile actuelle doit être libérée avant le transfert du contrôle. Si l’appel transfère le contrôle vers une méthode d’approbation supérieure à la méthode d’origine, la trame de pile ne sera pas libérée.

Le jeton de métadonnées de méthode fournit le nom, la classe et la signature de la méthode à appeler. La classe associée obj à est la classe dont il s’agit d’un instance. Si la classe définit une méthode non statique qui correspond au nom et à la signature de la méthode indiqués, cette méthode est appelée. Sinon, toutes les classes de la chaîne de classes de base de cette classe sont vérifiées dans l’ordre. Il s’agit d’une erreur si aucune méthode n’est trouvée.

Callvirt fait apparaître l’objet et les arguments associés hors de la pile d’évaluation avant d’appeler la méthode. Si la méthode a une valeur de retour, elle est envoyée sur la pile à l’achèvement de la méthode. Du côté appelé, le obj paramètre est accessible en tant qu’argument 0, arg1 argument 1, et ainsi de suite.

Les arguments sont placés sur la pile dans l’ordre de gauche à droite. Autrement dit, le premier argument est calculé et placé sur la pile, puis le deuxième argument, puis le troisième, jusqu’à ce que tous les arguments nécessaires soient au sommet de la pile dans l’ordre décroissant. La référence obj instance (toujours requise pour callvirt) doit être envoyée avant l’un des arguments visibles par l’utilisateur. La signature (portée dans le jeton de métadonnées) ne doit pas nécessairement contenir d’entrée dans la liste des paramètres pour ce pointeur.

Notez qu’une méthode virtuelle peut également être appelée à l’aide de l’instruction Call .

MissingMethodException est levée si une méthode non statique portant le nom et la signature indiqués est introuvable dans la classe associée à obj ou à l’une de ses classes de base. Cela est généralement détecté lorsque les instructions MSIL (Microsoft Intermediate Language) sont converties en code natif, plutôt qu’au moment de l’exécution.

NullReferenceException est levée si obj a la valeur Null.

SecurityException est levée si la sécurité système n’accorde pas à l’appelant l’accès à la méthode appelée. La case activée de sécurité peut se produire lorsque le CIL est converti en code natif plutôt qu’au moment de l’exécution.

Notes

Lorsque vous appelez des méthodes de System.Object sur des types valeur, envisagez d’utiliser le constrained préfixe avec l’instruction callvirt . Cela supprime la nécessité d’émettre un il différent selon que le type de valeur remplace ou non la méthode, ce qui évite un problème potentiel de contrôle de version. Envisagez d’utiliser le constrained préfixe lors de l’appel de méthodes d’interface sur des types valeur, car la méthode de type valeur implémentant la méthode d’interface peut être modifiée à l’aide d’un MethodImpl. Ces problèmes sont décrits plus en détail dans l’opcode Constrained .

La surcharge de méthode suivante Emit peut utiliser l’opcode callvirt :

S’applique à