Partager via


IMetaDataEmit::DefineMethod Method

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

Syntax

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
);

Parameters

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

szName [in] Nom du membre dans 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 conservée comme indiqué. Si vous devez spécifier des informations supplémentaires pour tous les paramètres, utilisez la méthode IMetaDataEmit ::SetParamProps .

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

Remarks

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

Vous trouverez ci-dessous des informations supplémentaires sur l’utilisation des DefineMethod paramètres particuliers.

Emplacements dans la table V

Le runtime utilise des définitions de méthode pour configurer des emplacements de table v. Dans le cas où un ou plusieurs emplacements doivent ê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 l’emplacement ou les emplacements dans la table v ; définissez la dwMethodFlagsmdRTSpecialName valeur de l’énumération CorMethodAttr et spécifiez le nom comme suit :

<_VtblGapSequenceNumber><_CountOfSlots>

SequenceNumber est le numéro de séquence de la méthode et countOfSlots est le nombre d’emplacements à ignorer dans la table v. Si CountOfSlots est omis , 1 est supposé. Ces méthodes factices ne peuvent pas être appelées à 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 table v que le runtime génère pour l’intégration COM.

Duplicate Methods

Vous ne devez pas définir de méthodes en double. Autrement dit, vous ne devez pas appeler DefineMethod avec un ensemble de valeurs en double dans les paramètres, et pvSig les tdwzNameparamètres. (Ces trois paramètres définissent de façon 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éfinissez le mdPrivateScope bit dans le dwMethodFlags paramètre. (Le mdPrivateScope bit signifie que le compilateur n’émet pas de référence à cette définition de méthode.)

Informations d’implémentation de méthode

Les informations sur l’implémentation de la méthode ne sont souvent 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 et dwImplFlags les paramètres lors de l’appel .ulCodeRVADefineMethod Les valeurs peuvent être fournies ultérieurement via IMetaDataEmit ::SetMethodImplFlags ou IMetaDataEmit ::SetRVA, le cas échéant.

Dans certaines situations, telles que l’appel de plateforme (PInvoke) ou les scénarios d’interopérabilité COM, le corps de la méthode n’est pas fourni et ulCodeRVA doit être défini sur zéro. Dans ces situations, la méthode ne doit pas être étiquetée comme abstraite, car le runtime localisera l’implémentation.

Définition d’une méthode pour PInvoke

Pour que chaque fonction non managée soit appelée 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 certains paramètres définis sur certaines valeurs, en fonction de la façon dont PInvoke est utilisé :

  • True PInvoke : 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 incorporée dans le module managé actuel.

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

Parameter Valeurs pour true PInvoke Valeurs pour PInvoke local
dwMethodFlags Définir mdStatic; effacer 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éfinir miCil et miManaged. Définir miNative et miUnmanaged.

Requirements

Plates-formes: Consultez les systèmes d’exploitation pris en charge par .NET.

Header: Cor.h

Library: CorGuids.lib

See also