IMetaDataEmit::MergeEnd メソッド

前の 1 つ以上の IMetaDataEmit::Merge 呼び出しで指定されたすべてのメタデータ スコープを現在のスコープにマージします。

HRESULT MergeEnd ();

パラメーター

このメソッドは、パラメーターを受け取りません。

解説

このルーチンは、直前の IMetaDataEmit::Merge の呼び出しで指定されたすべてのインポート スコープについて、現在の出力スコープへのメタデータの実際のマージを発生させます。

マージには、次の特別な条件が適用されます。

  • MVID (Module Version Identifier) は、インポート スコープ内のメタデータに固有であるため、インポートされることはありません。

  • 既存のモジュール全体のプロパティは上書きされません。

    現在のスコープに対してモジュール プロパティが既に設定されている場合、モジュール プロパティはインポートされません。 ただし、現在のスコープ内にモジュール プロパティが設定されていない場合は、最初に検出されたときに 1 回のみインポートされます。 そのモジュール プロパティが再び検出された場合、重複になります。 MVID を除くすべてのモジュール プロパティの値が比較され、重複が見つからなかった場合、エラーが発生します。

  • 型定義 (TypeDef) の場合、重複は現在のスコープにはマージされません。 TypeDef オブジェクトの重複は、各完全修飾オブジェクト名 + GUID + バージョン番号についてチェックされます。 名前または GUID が一致し、他の 2 つの要素のいずれかが異なる場合、エラーが発生します。 それ以外の場合、3 つの項目がすべて一致すると、MergeEnd は簡単なチェックを実行して、エントリが重複かどうかを確認します。重複でない場合は、エラーが発生します。 この簡単なチェックでは、次のものが検索されます。

    • 同じ順序で発生する、同じメンバー宣言。 mdPrivateScope としてフラグされているメンバー (CorMethodAttr 列挙体を参照) は、このチェックには含まれません。このメンバーは特別にマージされます。

    • 同じクラス レイアウト。

    これは、TypeDef オブジェクトが宣言されたすべてのメタデータ スコープ内で常に完全かつ一貫して定義されている必要があることを意味します。クラスに対するメンバー実装が複数のコンパイル単位に分かれている場合、すべてのスコープ内に完全定義が存在すると見なされ、各スコープに対するインクリメントは行われません。 たとえば、パラメーター名が決まりごとに関連している場合、すべてのスコープに同じように出力する必要があります。パラメーター名が決まりごとに関連していない場合、メタデータに出力できません。

    例外として、TypeDef オブジェクトでは、インクリメンタル メンバーを mdPrivateScope としてフラグを設定できます。 この場合、MergeEnd は、重複に関係なく、現在のスコープにメンバーをインクリメント方式で追加します。 コンパイラはプライベート スコープを認識するため、コンパイラが規則を適用する必要があります。

  • RVA (Relative Virtual Address) は、インポートまたはマージされません。コンパイラでは、この情報が再出力されると予測されます。

  • カスタム属性がマージされるのは、カスタム属性がアタッチされている項目がマージされる場合のみです。 たとえば、クラスに関連付けられたカスタム属性は、クラスが最初に検出されたときにマージされます。 カスタム属性が、コンパイル単位 (メンバー コンパイルのタイム スタンプなど) に固有の TypeDef または MemberDef に関連付けられている場合、カスタム属性はマージされず、このようなメタデータの削除または更新はコンパイラによって決定されます。

必要条件

プラットフォーム : 「.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

参照

参照

IMetaDataEmit インターフェイス

IMetaDataEmit2 インターフェイス