Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Hiermee maakt u een definitie voor een methode of globale functie met de opgegeven handtekening en retourneert u een token naar die methodedefinitie.
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] Het mdTypedef token van de bovenliggende klasse of bovenliggende interface van de methode. Ingesteld td op mdTokenNil, als u een globale functie definieert.
szName [in] De lidnaam in Unicode.
dwMethodFlags [in] Een waarde van de CorMethodAttr-opsomming waarmee de kenmerken van de methode of globale functie worden opgegeven.
pvSigBlob [in] De handtekening van de methode. 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 waarmee de implementatiefuncties van de methode worden opgegeven.
pmd [uit] Het lidtoken.
Remarks
De metagegevens-API garandeert dat methoden in dezelfde volgorde worden bewaard als de aanroeper verzendt voor een bepaalde 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 voor het instellen van v-table-sites. In het geval dat een of meer sleuven moeten worden overgeslagen, zoals het behouden van pariteit met een COM-interface-indeling, wordt een dummymethode gedefinieerd om de sleuf of sleuven in de v-tabel op te nemen; stel de dwMethodFlags waarde in van de mdRTSpecialNameopsomming CorMethodAttr en geef de naam op als:
<_VtblGapSequenceNumber><_CountOfSlots>
waarbij SequenceNumber het volgnummer van de methode is en CountOfSlots het aantal sleuven is dat moet worden overgeslagen in de v-tabel. Als CountOfSlots wordt weggelaten, wordt uitgegaan van 1. Deze dummy-methoden kunnen niet worden aangeroepen vanuit beheerde of onbeheerde code en elke poging om deze aan te roepen, vanuit beheerde of onbeheerde code, genereert een uitzondering. Het enige doel is om ruimte in te nemen in de v-tabel die de runtime genereert voor COM-integratie.
Duplicate Methods
U moet geen dubbele methoden definiëren. Dat wil gezegd, u moet geen dubbele set waarden in de td, wzNameen pvSig parameters aanroepenDefineMethod. (Deze drie parameters definiëren de methode op unieke wijze.) U kunt echter een dubbele triple gebruiken, mits 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 ulCodeRVA en dwImplFlags parameters bij het aanroepen DefineMethod. De waarden kunnen later worden opgegeven via IMetaDataEmit::SetMethodImplFlags of IMetaDataEmit::SetRVA, indien van toepassing.
In sommige situaties, zoals platforminvocation (PInvoke) of COM-interop-scenario's, wordt de hoofdtekst van de methode niet opgegeven en ulCodeRVA moet deze worden ingesteld op nul. In deze situaties mag de methode niet als abstract worden gelabeld, omdat de runtime de implementatie zal vinden.
Een methode definiëren voor PInvoke
Voor elke niet-beheerde 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 deze met een aantal parameters die zijn ingesteld op bepaalde waarden, afhankelijk van de manier waarop PInvoke wordt gebruikt:
True PInvoke- omvat het aanroepen van een externe onbeheerde methode die zich in een niet-beheerde DLL bevindt.
Lokale PInvoke- omvat het aanroepen van een systeemeigen onbeheerde methode die is ingesloten in de huidige beheerde module.
De parameterinstellingen worden gegeven in de volgende tabel.
| Parameter | Waarden voor true PInvoke | Waarden voor lokale PInvoke |
|---|---|---|
dwMethodFlags |
Instellen mdStatic; wissen 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 |
Instellen miCil en miManaged. |
Instellen miNative en miUnmanaged. |
Requirements
Platformen: Zie ondersteunde besturingssystemen van .NET.
Header: Cor.h
Library: CorGuids.lib