IMetaDataEmit::MergeEnd 方法

合併至目前範圍中的所有由一或多個先前呼叫 IMetaDataEmit::Merge 所指定的中繼資料範圍。

語法

HRESULT MergeEnd ();

參數

此方法不會採用任何參數。

備註

此常式會觸發將先前透過呼叫 IMetaDataEmit::Merge 所指定之所有匯入範圍的中繼資料,實際合併至目前的輸出範圍。

下列特殊條件適用於該合併:

  • 永遠不會匯入模組版本識別碼 (MVID),因為它對匯入範圍中的中繼資料來說是唯一的。

  • 不會覆寫現有的全模組屬性。

    如果已針對目前的範圍設定模組屬性,則不會匯入任何模組屬性。 不過,如果模組屬性尚未設定到目前的範圍,則只會在第一次遇到模組屬性時匯入一次。 如果再次遇到這些模組屬性,其便會重複。 如果比較所有模組屬性的值 (MVID 除外),而且找不到重複,便會引發錯誤。

  • 對於型別定義 (TypeDef),不會將重複項目合併到目前的範圍。 系統會針對每個 完整物件名稱 + GUID + 版本號碼,檢查 TypeDef 物件是否有重複項目。 如果有相符的名稱或 GUID,但其他兩個元素有任何一個不同,則會引發錯誤。 否則,如果三個項目都相符,MergeEnd 便會進行粗略檢查以確保項目確實重複;如果沒有相符,則會引發錯誤。 此粗略檢查會尋找:

    • 以相同順序發生的相同成員宣告。 標示為 mdPrivateScope 的成員 (請參閱 CorMethodAttr 列舉) 未包含在此檢查中;系統會專門合併這些成員。

    • 相同的類別配置。

    這表示 TypeDef 物件一律必須完整且一致地定義在其宣告所在的每個中繼資料範圍內;如果 (類別的) 成員實作分散到多個編譯單位,則會假設每個範圍中都有完整的定義,而不會累加到每個範圍。 例如,如果參數名稱與合約相關,則必須以相同方式發出至每個範圍;如果不相關,則不應該發出至中繼資料。

    例外狀況是 TypeDef 物件可以有標示為 mdPrivateScope 的累加成員。 遇到這些成員時,MergeEnd 會以累加方式將它們新增至目前的範圍,而不考慮重複的問題。 因為編譯器了解私用範圍,所以編譯器必須負責強制執行規則。

  • 不會匯入或合併相對虛擬位址 (RVA);編譯器應該會重新發出此資訊。

  • 只有在已合併自訂屬性所連結的項目時,才會合併自訂屬性。 例如,第一次遇到類別時,會合併與類別相關聯的自訂屬性。 如果自訂屬性與編譯單位特定的 TypeDefMemberDef 相關聯 (例如成員編譯的時間戳記),則自訂屬性不會合併,而且會由編譯器決定是移除還是更新這類中繼資料。

規格需求

平台:請參閱系統需求

標頭:Cor.h

程式庫:作為 MSCorEE.dll 中的資源使用

.NET Framework版本:自 1.1 起提供

另請參閱