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 mdTokenNil
als 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 td
parameters , wzName
en 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 DefineMethod
van . 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 miManaged inmiCil . |
Stel en miUnmanaged inmiNative . |
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
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor