IMetaDataEmit::DefineMethod, méthode

Crée une définition pour une méthode ou une fonction globale avec la signature spécifiée, puis retourne un jeton à cette définition de méthode.

Syntaxe

HRESULT DefineMethod (
    [in]  mdTypeDef         td,
    [in]  LPCWSTR           szName,
    [in]  DWORD             dwMethodFlags,
    [in]  PCCOR_SIGNATURE   pvSigBlob,
    [in]  ULONG             cbSigBlob,
    [in]  ULONG             ulCodeRVA,
    [in]  DWORD             dwImplFlags,
    [out] mdMethodDef      *pmd  
);  

Paramètres

td
[in] Jeton mdTypedef de la classe parent ou de l’interface parent de la méthode. Définissez td sur mdTokenNil, si vous définissez une fonction globale.

szName
[in] Nom du membre en Unicode.

dwMethodFlags
[in] Valeur de l’énumération CorMethodAttr qui spécifie les attributs de la méthode ou fonction globale.

pvSigBlob
[in] Signature de la méthode. La signature est conservée telle qu’elle est indiquée. Si vous avez besoin de spécifier des informations supplémentaires pour des paramètres, utilisez la méthode IMetaDataEmit::SetParamProps.

cbSigBlob
[in] Nombre d’octets dans pvSigBlob.

ulCodeRVA
[in] Adresse du code.

dwImplFlags
[in] Valeur de l’énumération CorMethodImpl qui spécifie les fonctionnalités d’implémentation de la méthode.

pmd
[out] Jeton du membre.

Notes

L’API de métadonnées garantit le maintien des méthodes dans le même ordre que celui dans lequel l’appelant les émet pour une interface ou classe englobante donnée, spécifiée dans le paramètre td.

Vous trouverez ci-dessous d’autres informations sur l’utilisation de DefineMethod et les réglages de paramètres particuliers.

Emplacements dans la v-table

Le runtime utilise des définitions de méthode pour configurer les emplacements de v-table. Si un ou plusieurs emplacements ont besoin d’être ignorés, par exemple pour préserver la parité avec une disposition d’interface COM, une méthode factice est définie pour prendre le ou les emplacements dans la v-table. Définissez dwMethodFlags sur la valeur mdRTSpecialName de l’énumération CorMethodAttr et spécifiez le nom comme suit :

_VtblGap<SequenceNumber><_CountOfSlots>

SequenceNumber correspond au numéro de séquence de la méthode et CountOfSlots correspond au nombre d’emplacements à ignorer dans la v-table. Si CountOfSlots est omis, la valeur 1 est supposée. Ces méthodes factices ne sont pas appelables à partir de code managé ou non managé et toute tentative d’appel, à partir de code managé ou non managé, génère une exception. Leur seul objectif est de prendre de l’espace dans la v-table que le runtime génère pour l’intégration COM.

Méthodes dupliquées

Vous ne devez pas définir de méthodes dupliquées. Autrement dit, vous ne devez pas appeler DefineMethod avec un jeu dupliqué de valeurs dans les paramètres td, wzName et pvSig. (Ces trois paramètres définissent ensemble la méthode de manière unique.) Toutefois, vous pouvez utiliser un triple dupliqué à condition de définir, pour l’une des définitions de méthode, la partie mdPrivateScope dans le paramètre dwMethodFlags. (La partie mdPrivateScope signifie que le compilateur ne va pas émettre de référence à cette définition de méthode.)

Informations sur l’implémentation de la méthode

Les informations sur l’implémentation de la méthode sont souvent inconnues au moment où la méthode est déclarée. Ainsi, vous n’avez pas besoin de passer des valeurs dans les paramètres ulCodeRVA et dwImplFlags lors de l’appel DefineMethod. Les valeurs peuvent être fournies ultérieurement par le biais de IMetaDataEmit::SetMethodImplFlags ou IMetaDataEmit::SetRVA, selon les besoins.

Dans certaines situations, comme un appel de plateforme (PInvoke) ou des scénarios COM Interop, le corps de la méthode n’est pas fourni et ulCodeRVA doit être défini à zéro. Dans ces situations, la méthode ne doit pas être étiquetée comme étant abstraite, car le runtime va localiser l’implémentation.

Définition d’une méthode pour PInvoke

Pour que chaque fonction non managée soit appelée par le biais de PInvoke, vous devez définir une méthode managée qui représente la fonction non managée cible. Pour définir la méthode managée, utilisez DefineMethod avec certains des paramètres définis sur certaines valeurs, selon la façon dont PInvoke est utilisé :

  • PInvoke vrai : implique l’appel d’une méthode non managée externe qui se trouve dans une DLL non managée.

  • PInvoke local : implique l’appel d’une méthode non managée native qui est incorporée dans le module managé actuel.

Les paramètres sont indiqués dans le tableau suivant.

Paramètre Valeurs pour un PInvoke vrai Valeurs pour un PInvoke local
dwMethodFlags Définissez mdStatic. Effacez mdSynchronized et mdAbstract.
pvSigBlob Signature de méthode CLR (Common Language Runtime) valide avec des paramètres qui sont des types managés valides. Signature de méthode CLR valide avec des paramètres qui sont des types managés valides.
ulCodeRVA 0
dwImplFlags Définissez miCil et miManaged. Définissez miNative et miUnmanaged.

Spécifications

Plateformes : Consultez Configuration requise.

En-tête : Cor.h

Bibliothèque : Utilisée comme ressource dans MSCorEE.dll

Versions de .NET Framework : Disponible à partir de la version 1.0

Voir aussi