Dela via


IMetaDataEmit::D efineMethod, metod

Skapar en definition för en metod eller global funktion med den angivna signaturen och returnerar en token till den metoddefinitionen.

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

Parametrar

td
[in] Token mdTypedef för den överordnade klassen eller det överordnade gränssnittet för metoden. Ange td till mdTokenNilom du definierar en global funktion.

szName
[in] Medlemsnamnet i Unicode.

dwMethodFlags
[in] Ett värde för CorMethodAttr-uppräkningen som anger attributen för metoden eller den globala funktionen.

pvSigBlob
[in] Metodsignaturen. Signaturen sparas enligt angiven. Om du behöver ange ytterligare information för några parametrar använder du metoden IMetaDataEmit::SetParamProps .

cbSigBlob
[in] Antalet byte i pvSigBlob.

ulCodeRVA
[in] Kodens adress.

dwImplFlags
[in] Ett värde för CorMethodImpl-uppräkningen som anger implementeringsfunktionerna för metoden.

pmd
[ut] Medlemstoken.

Kommentarer

Metadata-API:et garanterar att bevara metoder i samma ordning som anroparen genererar dem för en viss omslutande klass eller ett visst gränssnitt, som anges i parametern td .

Ytterligare information om användningen av DefineMethod och särskilda parameterinställningar finns nedan.

Platser i V-tabellen

Körningen använder metoddefinitioner för att konfigurera v-table-platser. Om en eller flera platser måste hoppas över, till exempel för att bevara paritet med en COM-gränssnittslayout, definieras en dummy-metod för att ta upp platsen eller platserna i v-tabellen. dwMethodFlags ange värdet för mdRTSpecialNameCorMethodAttr-uppräkningen och ange namnet som:

<_VtblGapSequenceNumber><_CountOfSlots>

där SequenceNumber är sekvensnumret för metoden och CountOfSlots är antalet platser att hoppa över i v-tabellen. Om CountOfSlots utelämnas antas 1. Dessa dummy-metoder kan inte anropas från antingen hanterad eller ohanterad kod och alla försök att anropa dem, från antingen hanterad eller ohanterad kod, genererar ett undantag. Deras enda syfte är att ta upp utrymme i den v-tabell som körningen genererar för COM-integrering.

Duplicerade metoder

Du bör inte definiera dubblettmetoder. Du bör alltså inte anropa DefineMethod med en duplicerad uppsättning värden i parametrarna td, wzNameoch pvSig . (Dessa tre parametrar definierar tillsammans metoden unikt.). Du kan dock använda en dubblett trippel förutsatt att du anger biten mdPrivateScope i parametern dwMethodFlags för en av metoddefinitionerna. (Biten mdPrivateScope innebär att kompilatorn inte genererar en referens till den här metoddefinitionen.)

Information om metodimplementering

Information om metodimplementeringen är ofta inte känd när metoden deklareras. Därför behöver du inte skicka värden i parametrarna ulCodeRVA och dwImplFlags när du anropar DefineMethod. Värdena kan anges senare via IMetaDataEmit::SetMethodImplFlags eller IMetaDataEmit::SetRVA efter behov.

I vissa situationer, till exempel plattformsanrop (PInvoke) eller COM-interop-scenarier, kommer metodtexten inte att anges och ulCodeRVA bör anges till noll. I dessa situationer bör metoden inte taggas som abstrakt, eftersom körningen kommer att hitta implementeringen.

Definiera en metod för PInvoke

För att varje ohanterad funktion ska anropas via PInvoke måste du definiera en hanterad metod som representerar den ohanterade målfunktionen. För att definiera den hanterade metoden använder DefineMethod du med några av parametrarna inställda på vissa värden, beroende på hur PInvoke används:

  • True PInvoke – innebär anrop av en extern ohanterad metod som finns i en ohanterad DLL.

  • Lokal PInvoke – omfattar anrop av en intern ohanterad metod som är inbäddad i den aktuella hanterade modulen.

Parameterinställningarna anges i följande tabell.

Parameter Värden för true PInvoke Värden för lokal PInvoke
dwMethodFlags Ange mdStatic; clear mdSynchronized och mdAbstract.
pvSigBlob En giltig CLR-metodsignatur (Common Language Runtime) med parametrar som är giltiga hanterade typer. En giltig CLR-metodsignatur med parametrar som är giltiga hanterade typer.
ulCodeRVA 0
dwImplFlags Ange miCil och miManaged. Ange miNative och miUnmanaged.

Krav

Plattformar: Se Systemkrav.

Huvudet: Cor.h

Bibliotek: Används som en resurs i MSCorEE.dll

.NET Framework versioner: Tillgänglig sedan 1.0

Se även