Partager via


IMetaDataEmit::DefineMethod, méthode

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

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 parente ou de l'interface parente de la méthode. Affectez à td la valeur mdTokenNil si vous définissez une fonction globale.

  • szName
    [in] Nom de membre en Unicode.

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

  • pvSigBlob
    [in] Signature de méthode. La signature est rendue persistante telle que fournie. Si vous devez spécifier des informations supplémentaires pour tous paramètres, utilisez la méthode IMetaDataEmit::SetParamProps.

  • cbSigBlob
    [in] Nombre d'octets de 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 membre.

Notes

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

Des informations supplémentaires concernant l'utilisation de DefineMethod et des paramètres particuliers sont fournies ci-dessous.

Emplacements dans la V-table

Le runtime utilise des définitions de méthode pour configurer les emplacements de la v-table. Lorsqu'un ou plusieurs emplacements doivent être ignorés, par exemple pour conserver la parité avec une disposition d'interface COM, une méthode factice est définie pour utiliser l'emplacement ou les emplacements dans la v-table ; affectez à dwMethodFlags la valeur mdRTSpecialName de l'énumération CorMethodAttr et spécifiez le nom comme suit :

_VtblGap <NuméroSéquence> < _NombreEmplacements>

où NuméroSéquence est le numéro de séquence de la méthode et NombreEmplacements le nombre d'emplacements à ignorer dans la v-table. Si NombreEmplacements est omis, la valeur 1 est utilisée. Ces méthodes factices ne peuvent pas être appelées à partir du code managé ou non managé et toute tentative d'appel à partir du code managé ou non managé génère une exception. Leur seul objectif est d'utiliser l'espace dans la v-table que le runtime génère pour l'intégration COM.

Méthodes en double

Vous ne devez pas définir de méthodes en double. Autrement dit, vous ne devez pas appeler DefineMethod avec un jeu de valeurs en double dans les paramètres td, wzName et pvSig. (Ces trois paramètres définissent de manière unique la méthode.). Toutefois, vous pouvez utiliser un triple en double à condition que, pour l'une des définitions de méthode, vous définissiez le bit mdPrivateScope dans le paramètre dwMethodFlags. (Le bit mdPrivateScope signifie que le compilateur n'émettra pas de référence à cette définition de méthode.)

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

Souvent, les informations sur l'implémentation de la méthode ne sont pas connues au moment où la méthode est déclarée. Par conséquent, vous n'avez pas besoin de passer des valeurs dans les paramètres ulCodeRVA et dwImplFlags lors de l'appel de DefineMethod. Les valeurs peuvent être fournies ultérieurement via IMetaDataEmit::SetMethodImplFlags ou IMetaDataEmit::SetRVA, selon le cas.

Dans certaines situations, telles que les scénarios d'appel de code non managé (PInvoke) ou les scénarios COM interop, le corps de la méthode n'est pas fourni et ulCodeRVA doit avoir la valeur zéro. Dans ce cas, la méthode ne doit pas être identifiée comme abstraite, car le runtime localisera l'implémentation.

Définition d'une méthode pour PInvoke

Pour chaque fonction non managée à appeler via 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 des valeurs spécifiques affectées à certains paramètres, selon la manière dont PInvoke est utilisé :

  • PInvoke true : implique l'appel d'une méthode non managée externe qui réside 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é en cours.

Les paramètres sont fournis dans le tableau suivant.

Paramètre

Valeurs pour PInvoke true

Valeurs pour PInvoke local

dwMethodFlags

Définissez mdStatic ; supprimez mdSynchronized et mdAbstract.

pvSigBlob

Signature de méthode CLR 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

Configuration requise

Plateformes : consultez Configuration requise du .NET Framework.

En-tête : Cor.h

Bibliothèque : utilisée en tant que ressource dans MSCorEE.dll

Versions du .NET Framework : 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0, 1.1, 1.0

Voir aussi

Référence

IMetaDataEmit, interface

IMetaDataEmit2, interface