Share via


IMetaDataEmit::MergeEnd メソッド

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

構文

HRESULT MergeEnd ();

パラメーター

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

解説

このルーチンでは、以前の IMetaDataEmit::Merge の呼び出しで指定されたすべてのインポート スコープのメタデータの現在の出力スコープへの実際のマージがトリガーされます。

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

  • モジュール バージョン識別子 (MVID) はインポートされません。これは、インポート スコープ内のメタデータに固有であるためです。

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

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

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

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

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

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

    例外は、TypeDef オブジェクトに mdPrivateScope というフラグが付けられた増分メンバーが含まれる場合があることです。 これらが検出されると、 MergeEnd によって重複を考慮せずにそれらが現在のスコープに増分的に追加されます。 コンパイラによってプライベート スコープは認識されているため、コンパイラは規則の適用を行う必要があります。

  • 相対仮想アドレス (RVA) はインポートまたはマージされません。この情報はコンパイラによって再生成される必要があります。

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

必要条件

:システム要件」を参照してください。

ヘッダー: Cor.h

ライブラリ: MSCorEE.dll でリソースとして使用されます

.NET Framework のバージョン: 1.1 以降で使用可能

関連項目