Delen via


Methode IMetaDataEmit::D efineMethod

Hiermee maakt u een definitie voor een methode of globale functie met de opgegeven handtekening en retourneert u een token naar die methodedefinitie.

Syntaxis

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] Het mdTypedef token van de bovenliggende klasse of bovenliggende interface van de methode. Stel in td op mdTokenNilals u een globale functie definieert.

szName
[in] De naam van het lid in Unicode.

dwMethodFlags
[in] Een waarde van de opsomming CorMethodAttr die de kenmerken van de methode of globale functie aangeeft.

pvSigBlob
[in] De methodehandtekening. De handtekening blijft behouden zoals opgegeven. Als u aanvullende informatie wilt opgeven voor parameters, gebruikt u de methode IMetaDataEmit::SetParamProps .

cbSigBlob
[in] Het aantal bytes in pvSigBlob.

ulCodeRVA
[in] Het adres van de code.

dwImplFlags
[in] Een waarde van de opsomming CorMethodImpl die de implementatiefuncties van de methode aangeeft.

pmd
[uit] Het lidtoken.

Opmerkingen

De metagegevens-API garandeert dat methoden in dezelfde volgorde worden bewaard als de aanroeper ze verzendt voor een bepaalde omringende klasse of interface, die is opgegeven in de td parameter.

Hieronder vindt u aanvullende informatie over het gebruik van DefineMethod en specifieke parameterinstellingen.

Sleuven in de V-tabel

De runtime maakt gebruik van methodedefinities om v-table-sleuven in te stellen. In het geval dat een of meer sleuven moeten worden overgeslagen, bijvoorbeeld om de pariteit met een COM-interface-indeling te behouden, wordt een dummymethode gedefinieerd om de sleuf of sleuven in de v-tabel op te nemen; stel de dwMethodFlags in op de mdRTSpecialName waarde van de opsomming CorMethodAttr en geef de naam op als:

<_VtblGapSequenceNumber><_CountOfSlots>

waarbij SequenceNumber het volgnummer van de methode is en CountOfSlots het aantal sleuven is dat in de v-tabel moet worden overgeslagen. Als CountOfSlots wordt weggelaten, wordt uitgegaan van 1. Deze dummy-methoden kunnen niet worden aangeroepen vanuit beheerde of onbeheerde code en elke poging om ze aan te roepen, vanuit beheerde of onbeheerde code, genereert een uitzondering. Hun enige doel is om ruimte in te nemen in de v-tabel die de runtime genereert voor COM-integratie.

Dubbele methoden

U moet geen dubbele methoden definiëren. Dat wil gezegd, u moet niet aanroepen DefineMethod met een dubbele set waarden in de tdparameters , wzNameen pvSig . (Deze drie parameters samen definiëren de methode op unieke wijze.) U kunt echter een dubbele triple gebruiken op voorwaarde dat u voor een van de methodedefinities de mdPrivateScope bit in de dwMethodFlags parameter instelt. (De mdPrivateScope bit betekent dat de compiler geen verwijzing naar deze methodedefinitie verzendt.)

Informatie over methode-implementatie

Informatie over de implementatie van de methode is vaak niet bekend op het moment dat de methode wordt gedeclareerd. Daarom hoeft u geen waarden door te geven in de parameters en dwImplFlags bij het ulCodeRVA aanroepen DefineMethodvan . De waarden kunnen later worden opgegeven via IMetaDataEmit::SetMethodImplFlags of IMetaDataEmit::SetRVA, indien van toepassing.

In sommige situaties, zoals platformaanroep (PInvoke) of COM-interoperabiliteitsscenario's, wordt de hoofdtekst van de methode niet opgegeven en ulCodeRVA moet deze worden ingesteld op nul. In dergelijke situaties mag de methode niet worden gelabeld als abstract, omdat de runtime de implementatie zal vinden.

Een methode definiëren voor PInvoke

Voor elke onbeheerde functie die moet worden aangeroepen via PInvoke, moet u een beheerde methode definiëren die de niet-beheerde doelfunctie vertegenwoordigt. Als u de beheerde methode wilt definiëren, gebruikt DefineMethod u met enkele parameters die zijn ingesteld op bepaalde waarden, afhankelijk van de manier waarop PInvoke wordt gebruikt:

  • True PInvoke - omvat aanroepen van een externe onbeheerde methode die zich in een onbeheerde DLL bevindt.

  • Lokale PInvoke: omvat het aanroepen van een systeemeigen niet-beheerde methode die is ingesloten in de huidige beheerde module.

De parameterinstellingen worden weergegeven in de volgende tabel.

Parameter Waarden voor true PInvoke Waarden voor lokale PInvoke
dwMethodFlags Stel in mdStatic; wis mdSynchronized en mdAbstract.
pvSigBlob Een geldige CLR-methodehandtekening (Common Language Runtime) met parameters die geldige beheerde typen zijn. Een geldige CLR-methodehandtekening met parameters die geldige beheerde typen zijn.
ulCodeRVA 0
dwImplFlags Stel en miManagedinmiCil. Stel en miUnmanagedinmiNative.

Vereisten

Platforms: Zie Systeemvereisten.

Header: Cor.h

Bibliotheek: Wordt gebruikt als een resource in MSCorEE.dll

.NET Framework versies: beschikbaar sinds 1.0

Zie ook