次の方法で共有


IMetaDataEmit::DefineMethod Method

指定したシグネチャを持つメソッドまたはグローバル関数の定義を作成し、そのメソッド定義にトークンを返します。

Syntax

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
);

Parameters

td [in]メソッドの親クラスまたは親インターフェイスの mdTypedef トークン。 グローバル関数を定義する場合は、 tdmdTokenNil に設定します。

szName [in]Unicode のメンバー名。

dwMethodFlags [in]メソッドまたはグローバル関数の属性を指定する CorMethodAttr 列挙体の値。

pvSigBlob [in]メソッド シグネチャ。 署名は指定されたとおりに保持されます。 パラメーターに追加情報を指定する必要がある場合は、 IMetaDataEmit::SetParamProps メソッドを使用します。

cbSigBlob [in] pvSigBlob内のバイト数。

ulCodeRVA [in]コードのアドレス。

dwImplFlags [in]メソッドの実装機能を指定する CorMethodImpl 列挙体の値。

pmd [out]メンバー トークン。

Remarks

メタデータ API は、呼び出し元が、 td パラメーターで指定された、指定された外側のクラスまたはインターフェイスに対してメソッドを出力するのと同じ順序でメソッドを保持することを保証します。

DefineMethodの使用と特定のパラメーター設定に関する追加情報を以下に示します。

V テーブル内のスロット

ランタイムは、メソッド定義を使用して v テーブル スロットを設定します。 COM インターフェイス レイアウトとのパリティを維持するなど、1 つ以上のスロットをスキップする必要がある場合は、v テーブル内のスロットを占有するようにダミー メソッドが定義されます。dwMethodFlagsを CorMethodAttr 列挙のmdRTSpecialName値に設定し、名前を次のように指定します。

_VtblGap<SequenceNumber><_CountOfSlots>

SequenceNumber はメソッドのシーケンス番号で、CountOfSlots は v テーブルでスキップするスロットの数です。 CountOfSlots を省略すると、1 が想定されます。 これらのダミー メソッドは、マネージド コードまたはアンマネージド コードから呼び出すことはできず、マネージド コードまたはアンマネージド コードから呼び出そうとすると、例外が生成されます。 唯一の目的は、ランタイムが COM 統合のために生成する v テーブルの領域を占有することです。

Duplicate Methods

重複するメソッドは定義しないでください。 つまり、tdwzName、およびpvSigパラメーター内の値のセットが重複するDefineMethodを呼び出さないでください。 (これら 3 つのパラメーターは、メソッドを一意に定義します)。 ただし、メソッド定義の 1 つに対して、dwMethodFlags パラメーターにmdPrivateScope ビットを設定する場合は、重複するトリプルを使用できます。 ( mdPrivateScope ビットは、コンパイラがこのメソッド定義への参照を出力しないことを意味します)。

メソッドの実装情報

メソッドの実装に関する情報は、多くの場合、メソッドが宣言されている時点では不明です。 そのため、DefineMethodを呼び出すときに、ulCodeRVAパラメーターと dwImplFlags パラメーターに値を渡す必要はありません。 値は、必要に応じて 、後で IMetaDataEmit::SetMethodImplFlags または IMetaDataEmit::SetRVA を使用して指定できます。

プラットフォーム呼び出し (PInvoke) や COM 相互運用のシナリオなど、状況によっては、メソッド本体が指定されず、 ulCodeRVA を 0 に設定する必要があります。 このような状況では、ランタイムが実装を見つけるので、メソッドを抽象としてタグ付けしないでください。

PInvoke のメソッドの定義

PInvoke を介して呼び出されるアンマネージ関数ごとに、ターゲットのアンマネージ関数を表すマネージド メソッドを定義する必要があります。 マネージド メソッドを定義するには、PInvoke の使用方法に応じて、一部のパラメーターを特定の値に設定して DefineMethod を使用します。

  • True PInvoke - アンマネージド DLL に存在する外部アンマネージド メソッドの呼び出しが含まれます。

  • ローカル PInvoke - 現在のマネージド モジュールに埋め込まれているネイティブアンマネージド メソッドの呼び出しが含まれます。

パラメーターの設定を次の表に示します。

Parameter 真の PInvoke の値 ローカル PInvoke の値
dwMethodFlags mdStaticを設定し、mdSynchronizedmdAbstractをクリアします。
pvSigBlob 有効なマネージド型であるパラメーターを持つ有効な共通言語ランタイム (CLR) メソッドシグネチャ。 有効なマネージド型であるパラメーターを持つ有効な CLR メソッド シグネチャ。
ulCodeRVA 0
dwImplFlags miCilmiManagedを設定します。 miNativemiUnmanagedを設定します。

Requirements

プラットフォーム:サポートされている .NET オペレーティング システムを参照してください。

Header: Cor.h

Library: CorGuids.lib

See also