IMetaDataEmit::DefineMethod – metoda
Vytvoří definici metody nebo globální funkce se zadaným podpisem a vrátí token této definici metody.
Syntaxe
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
);
Parametry
td
[v] Token mdTypedef
nadřazené třídy nebo nadřazeného rozhraní metody. Pokud definujete globální funkci, nastavte td
na mdTokenNil
hodnotu .
szName
[v] Název členu v kódování Unicode.
dwMethodFlags
[v] Hodnota CorMethodAttr výčtu, která určuje atributy metody nebo globální funkce.
pvSigBlob
[v] Podpis metody. Podpis se zachová tak, jak je zadán. Pokud potřebujete zadat další informace pro všechny parametry, použijte metodu IMetaDataEmit::SetParamProps .
cbSigBlob
[v] Počet bajtů v pvSigBlob
.
ulCodeRVA
[v] Adresa kódu.
dwImplFlags
[v] Hodnota CorMethodImpl výčtu, která určuje funkce implementace metody.
pmd
[out] Token člena.
Poznámky
Rozhraní API metadat zaručuje zachování metod ve stejném pořadí, v jakém je volající vygeneruje pro danou nadřazenou třídu nebo rozhraní, která je zadaná v parametru td
.
Další informace týkající se použití DefineMethod
a konkrétních nastavení parametrů jsou uvedeny níže.
Sloty v tabulce V
Modul runtime používá definice metod k nastavení slotů tabulky v-table. V případě, že je nutné vynechat jeden nebo více slotů, například kvůli zachování parity s rozložením rozhraní COM, je definována fiktivní metoda pro převzetí slotu nebo slotů v tabulce v; nastavte dwMethodFlags
na mdRTSpecialName
hodnotu výčtu CorMethodAttr a zadejte název takto:
<_VtblGapSequenceNumber><_CountOfSlots>
kde SequenceNumber je pořadové číslo metody a CountOfSlots je počet slotů, které se mají přeskočit v tabulce v. Pokud parametr CountOfSlots vynecháte, předpokládá se hodnota 1. Tyto fiktivní metody nelze volat ze spravovaného nebo nespravovaného kódu a jakýkoli pokus o jejich volání ze spravovaného nebo nespravovaného kódu vygeneruje výjimku. Jejich jediným účelem je zabírat místo v tabulce virtuálních počítačů, které modul runtime generuje pro integraci modelu COM.
Duplicitní metody
Neměli byste definovat duplicitní metody. To znamená, že byste neměli volat DefineMethod
s duplicitní sadou hodnot v parametrech td
, wzName
a pvSig
. (Tyto tři parametry společně jednoznačně definují metodu.) Můžete však použít duplicitní trojici za předpokladu, že pro jednu z definic metod nastavíte mdPrivateScope
bit v parametru dwMethodFlags
. (Bit mdPrivateScope
znamená, že kompilátor nevygeneruje odkaz na tuto definici metody.)
Informace o implementaci metody
Informace o implementaci metody nejsou často známy v době, kdy je metoda deklarována. Proto při volání DefineMethod
není nutné předávat hodnoty v parametrech ulCodeRVA
a dwImplFlags
. Hodnoty lze zadat později prostřednictvím IMetaDataEmit::SetMethodImplFlags nebo IMetaDataEmit::SetRVA, podle potřeby.
V některých situacích, jako jsou scénáře volání platformy (PInvoke) nebo zprostředkovatele komunikace COM, nebude tělo metody dodáno a ulCodeRVA
mělo by být nastaveno na nulu. V těchto situacích by metoda neměla být označena jako abstraktní, protože modul runtime vyhledá implementaci.
Definování metody pro PInvoke
Pro každou nespravovanou funkci, která má být volána prostřednictvím PInvoke, musíte definovat spravovanou metodu, která představuje cílovou nespravovanou funkci. Pokud chcete definovat spravovanou metodu, použijte DefineMethod
s některými parametry nastavenými na určité hodnoty v závislosti na způsobu, jakým se PInvoke používá:
True PInvoke – zahrnuje vyvolání externí nespravované metody, která se nachází v nespravované knihovně DLL.
Místní funkce PInvoke – zahrnuje vyvolání nativní nespravované metody, která je vložená v aktuálním spravovaném modulu.
Nastavení parametrů jsou uvedena v následující tabulce.
Parametr | Hodnoty pro true PInvoke | Hodnoty pro místní PInvoke |
---|---|---|
dwMethodFlags |
Nastavit mdStatic ; vymazat mdSynchronized a mdAbstract . |
|
pvSigBlob |
Platný podpis metody CLR (Common Language Runtime) s parametry, které jsou platnými spravovanými typy. | Platný podpis metody CLR s parametry, které jsou platnými spravovanými typy. |
ulCodeRVA |
0 | |
dwImplFlags |
Nastavte miCil a miManaged . |
Nastavte miNative a miUnmanaged . |
Požadavky
Platformy: Viz Požadavky na systém.
Záhlaví: Cor.h
Knihovny: Používá se jako prostředek v MSCorEE.dll
Verze rozhraní .NET Framework: K dispozici od verze 1.0