Sdílet prostřednictvím


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 mdTokenNilhodnotu .

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, wzNamea 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í DefineMethodnení 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

Viz také