OpCodes.Callvirt Champ
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
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 :
Une référence
obj
d’objet est envoyée sur la pile.Les arguments de
arg1
méthode sontargN
envoyés à la pile.Les arguments
arg1
de méthode viaargN
et la référenceobj
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 enobj
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.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.
Callvirt
peut ê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
: