共用方式為


IMetaDataEmit::DefineMethod 方法

以指定的簽章建立方法或全域函式的定義,並將語彙基元傳回該方法定義。

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

參數

  • td
    [in] 此方法之父類別或父介面的 mdTypedef 語彙基元。 如果要定義全域函式,請將 td 設為 mdTokenNil

  • szName
    [in] 使用 Unicode 的成員名稱。

  • dwMethodFlags
    [in] CorMethodAttr 列舉型別 (Enumeration) 的值,這個列舉型別會指定方法或全域函式的屬性。

  • pvSigBlob
    [in] 方法簽章。 此簽章依提供時的狀態保存。 如果您需要指定任何參數的其他資訊,請使用 IMetaDataEmit::SetParamProps 方法。

  • cbSigBlob
    [in] pvSigBlob 的位元組數目。

  • ulCodeRVA
    [in] 程式碼的位址。

  • dwImplFlags
    [in] CorMethodImpl 列舉型別的值,這個列舉型別會指定方法的實作功能。

  • pmd
    [out] 成員語彙基元。

備註

中繼資料 API 保證會依照呼叫端為指定之封入類別或介面 (在 td 參數中指定) 發出方法的相同順序,來保存方法。

下文提供有關 DefineMethod 之使用和特定參數設定的其他資訊。

V-table 中的位置

執行階段會使用方法定義來設定 v-table 位置。 在需要略過一或多個位置的情況下,例如將同位檢查與 COM 介面配置一同保存,則定義空方法來佔用 v-table 中的一或多個位置;將 dwMethodFlags 設為 CorMethodAttr 列舉型別的 mdRTSpecialName 值,並且將名稱指定為:

_VtblGap<SequenceNumber><_CountOfSlots>

其中 SequenceNumber 為方法序號,而且 CountOfSlots 為 v-table 中要略過的位置數目。 如果省略 CountOfSlots,則假設為 1。 這些空方法不可從 Managed 或 Unmanaged 程式碼呼叫,而且不論從 Managed 或 Unmanaged 程式碼,嘗試呼叫它們都會產生例外狀況。 它們的唯一目的是佔用 v-table 中執行階段為了 COM 整合而產生的空間。

重複的方法

您不應定義重複的方法。 也就是說,您不應使用 td、wzName 和 pvSig 參數中的一組重複值來呼叫 DefineMethod (這三個參數會共同唯一定義此方法)。 不過,如果您針對其中一個方法定義,在 dwMethodFlags 參數中設定 mdPrivateScope 位元,則可以使用這三個重複的參數 (mdPrivateScope 位元表示編譯器將不會發出此方法定義的參考)。

方法實作資訊

在宣告方法時,方法實作的相關資訊通常是未知的。 因此,當呼叫 DefineMethod 時,您不需在 ulCodeRVA 和 dwImplFlags 參數中傳遞值。 稍後可以在適當時,透過 IMetaDataEmit::SetMethodImplFlagsIMetaDataEmit::SetRVA 提供這些值。

在某些情況下,例如平台引動過程 (PInvoke) 或 COM Interop 案例,不會提供方法主體,而且 ulCodeRVA 應設為零。 在這些情況下,方法不應標記為抽象,因為執行階段將會尋找實作。

定義 PInvoke 的方法

對於透過 PInvoke 呼叫的每個 Unmanaged 函式,您必須各定義一個表示目標 Unmanaged 函式的 Managed 方法。 若要定義 Managed 方法,請使用 DefineMethod,並且根據 PInvoke 的使用方法,搭配一些設為特定值的參數:

  • True PInvoke - 包含位在 Unmanaged DLL 中之外部 Unmanaged 方法的引動過程。

  • 本機 PInvoke,包含內嵌在目前 Managed 模組中之原生 Unmanaged 方法的引動過程。

下表提供參數設定。

參數

True PInvoke 的值

本機 PInvoke 的值

dwMethodFlags

設定 mdStatic;清除 mdSynchronizedmdAbstract

pvSigBlob

有效的 Common Language Runtime (CLR) 方法簽章,搭配表示有效 Managed 型別的參數。

有效的 CLR 方法簽章,搭配表示有效 Managed 型別的參數。

ulCodeRVA

0

dwImplFlags

設定 miCilmiManaged

設定 miNativemiUnmanaged

需求

**平台:**請參閱 .NET Framework 系統需求

**標頭:**Cor.h

**程式庫:**當做 MSCorEE.dll 中的資源使用

**.NET Framework 版本:**4、3.5 SP1、3.5、3.0 SP1、3.0、2.0 SP1、2.0、1.1、1.0

請參閱

參考

IMetaDataEmit 介面

IMetaDataEmit2 介面