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>
où 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