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::SetMethodImplFlags 或 IMetaDataEmit::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;清除 mdSynchronized 和 mdAbstract。 |
|
pvSigBlob |
有效的 Common Language Runtime (CLR) 方法簽章,搭配表示有效 Managed 型別的參數。 |
有效的 CLR 方法簽章,搭配表示有效 Managed 型別的參數。 |
ulCodeRVA |
0 |
|
dwImplFlags |
設定 miCil 和 miManaged。 |
設定 miNative 和 miUnmanaged。 |
需求
**平台:**請參閱 .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