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 列舉的值,可指定方法或全域函式的屬性。
pvSigBlob
[in] 方法簽章。 此簽章會依提供方式保存。 如果您需要指定任何參數的其他資訊,請使用 IMetaDataEmit::SetParamProps 方法。
cbSigBlob
[in] pvSigBlob
中的位元組計數。
ulCodeRVA
[in] 程式碼的位址。
dwImplFlags
[in] CorMethodImpl 列舉的值,可指定方法的實作功能。
pmd
[out] 成員權杖。
備註
中繼資料 API 保證會以與呼叫端針對指定的封入類別或介面發出方法的相同順序來保存方法,其指定於 td
參數。
以下提供有關使用 DefineMethod
和特定參數設定的其他資訊。
V 資料表中的位置
執行階段會使用方法定義來設定 V 資料表位置。 如果需要略過一或多個位置,例如保存與 COM 介面配置的同位,則會定義虛擬方法以佔用 V 資料表中的位置;將 dwMethodFlags
設定為 CorMethodAttr 列舉的 mdRTSpecialName
值,並將名稱指定為:
_VtblGap<SequenceNumber><_CountOfSlots>
其中 SequenceNumber 是方法的序號,而 CountOfSlots 是 V 資料表中要略過的位置數目。 如果省略了 CountOfSlots,則假設為 1。 這些虛擬方法無法從受控或非受控程式碼呼叫,而且嘗試從受控或非受控程式碼呼叫它們,則會產生例外狀況。 其唯一目的是佔用執行階段為了 COM 整合所產生的 V 資料表空間。
重複的方法
您不應該定義重複的方法。 也就是說,您不應該使用 td
、wzName
和 pvSig
參數中的重複值集來呼叫 DefineMethod
。 (這三個參數會一起唯一定義方法)。 不過,您可以針對其中一個方法定義使用提供的重複三元數,在 dwMethodFlags
參數中設定 mdPrivateScope
位元。 (mdPrivateScope
位元表示編譯器不會發出這此法定義的參考。)
方法實作資訊
宣告方法時,通常不知道方法實作的相關資訊。 因此,呼叫 DefineMethod
時,您不需要在 ulCodeRVA
和 dwImplFlags
參數中傳遞值。 視情況而定,稍後可透過 IMetaDataEmit::SetMethodImplFlags 或 IMetaDataEmit::SetRVA 提供這些值。
在某些情況下,例如平台叫用 (PInvoke) 或 COM Interop 案例,將不會提供方法主體,而且 ulCodeRVA
應該設定為零。 在這些情況下,不應該將方法標記為抽象,因為執行階段會找出實作。
定義 PInvoke 的方法
若要透過 PInvoke 呼叫每個非受控函式,您必須定義代表目標非受控函式的受控方法。 若要定義受控方法,請根據 PInvoke 的使用方式,搭配一些設定為特定值的參數使用 DefineMethod
:
真正 PInvoke - 涉及叫用位於非受控 DLL 的外部非受控方法。
本機 PInvoke - 涉及叫用內嵌在目前受控模組中的原生非受控方法。
下表提供參數設定。
參數 | True PInvoke 的值 | 本機 PInvoke 的值 |
---|---|---|
dwMethodFlags |
設定 mdStatic ;清除 mdSynchronized 和 mdAbstract 。 |
|
pvSigBlob |
有效的通用語言執行平台 (CLR) 方法簽章,具有屬於有效受控類型的參數。 | 有效的 CLR 方法簽章,具有屬於有效受控類型的參數。 |
ulCodeRVA |
0 | |
dwImplFlags |
請設定 miCil 和 miManaged 。 |
請設定 miNative 和 miUnmanaged 。 |
規格需求
平台:請參閱系統需求。
標頭:Cor.h
程式庫:作為 MSCorEE.dll 中的資源使用
.NET Framework版本:自 1.0 起提供