OpCodes.Callvirt Champ

Définition

Appelle une méthode à liaison tardive sur un objet, en transmettant la valeur de retour sur 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 (Hexadécimal et Microsoft Intermediate Language) de l'instruction, ainsi qu'un bref résumé de référence :

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

Le comportement transitionnel de la pile, dans l’ordre séquentiel, est :

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

  2. Les arguments de arg1 méthode sont argN envoyés (push) sur la pile.

  3. Les arguments de méthode et argN la référence obj d’objet sont extraits arg1 de la pile ; l’appel de méthode est effectué avec ces arguments et le contrôle est transféré à la méthode obj référencée par le jeton de métadonnées de la méthode. Une fois 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 envoyée (push) sur la pile.

L’instruction callvirt appelle une méthode à liaison tardive sur un objet. Autrement dit, la méthode est choisie en fonction du type d’exécution plutôt obj que de la classe de compilation visible dans le pointeur de méthode. Callvirt peut être utilisé pour appeler des méthodes virtuelles et d’instance. L’instruction callvirt peut être précédée immédiatement d’un tail préfixe (Tailcall) pour spécifier que la trame de pile actuelle doit être libérée avant de transférer le contrôle. Si l’appel transférerait 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 elle est une 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 affiche 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 (push) sur la pile à l’achèvement de la méthode. Côté appelé, le obj paramètre est accessible en tant qu’argument 0, arg1 en tant qu’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-dessus de la pile dans l’ordre décroissant. La référence obj d’instance (toujours nécessaire pour callvirt) doit être envoyée (push) avant l’un des arguments visibles par l’utilisateur. La signature (portée dans le jeton de métadonnées) ne doit pas 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 n’ont pas pu être trouvées dans la classe associée obj ou à l’une de ses classes de base. Cela est généralement détecté lorsque Microsoft instructions MSIL (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 vérification de sécurité peut se produire lorsque la bibliothèque CIL est convertie en code natif plutôt qu’au moment de l’exécution.

Note

Lors de l’appel de méthodes de System.Object sur les 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 préfixe lors de l’appel constrained de méthodes d’interface sur les 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 le Constrained code opcode.

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

S’applique à