次の方法で共有


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
    [入力] メソッドの親クラスまたは親インターフェイスの mdTypedef トークン。 グローバル関数を定義する場合は、td を mdTokenNil に設定します。

  • szName
    [入力] Unicode のメンバー名。

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

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

  • cbSigBlob
    [入力] pvSigBlob のバイト数。

  • ulCodeRVA
    [入力] コードのアドレス。

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

  • pmd
    [出力] メンバー トークン。

解説

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

DefineMethod の使用および特定のパラメーター設定に関する追加情報を次に示します。

v-table 内のスロット

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

_VtblGap<SequenceNumber><_CountOfSlots>

SequenceNumber はメソッドのシーケンス番号、CountOfSlots は v-table 内でスキップされるスロット数です。 CountOfSlots を省略すると、1 が使用されます。 これらのダミー メソッドは、マネージ コードまたはアンマネージ コードから呼び出すことはできません。マネージ コードまたはアンマネージ コードから呼び出そうとすると、例外が生成されます。 ダミー メソッドの目的は、ランタイムが COM 統合用に生成する v-table 内の領域を使用することだけです。

重複したメソッド

重複したメソッドを定義しないでください。 つまり、td、wzName、および pvSig の各パラメーターで重複した値セットを使用して DefineMethod を呼び出さないでください。 この 3 つのパラメーターは、メソッドを一意に定義します。 ただし、メソッド定義の 1 つについて dwMethodFlags パラメーターで mdPrivateScope ビットを設定する場合は、この 3 つのバラメータの重複したセットを使用できます。 mdPrivateScope ビットは、コンパイラがこのメソッド定義への参照を生成しないことを意味します。

メソッド実装情報

メソッド実装に関する情報は、通常はメソッドを宣言した時点ではわかりません。 したがって、DefineMethod を呼び出すときに、ulCodeRVA パラメーターおよび dwImplFlags パラメーターで値を渡す必要はありません。 値は必要に応じて、IMetaDataEmit::SetMethodImplFlags または IMetaDataEmit::SetRVA を使用して後で指定できます。

プラットフォーム呼び出し (PInvoke) や COM 相互運用の場合などは、メソッド本体が指定されないため、ulCodeRVA をゼロに設定する必要があります。 このような場合、ランタイムが実装を検索するため、メソッドに抽象としてタグを付けないでください。

PInvoke のメソッドの定義

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

  • true PInvoke : アンマネージ DLL に存在する外部アンマネージ メソッドの呼び出しを含みます。

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

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

パラメーター

true PInvoke の値

ローカル PInvoke の値

dwMethodFlags

mdStatic を設定し、mdSynchronized および mdAbstract を消去します。

pvSigBlob

有効なマネージ型であるパラメーターを持つ、有効な共通言語ランタイム (CLR: Common Language Runtime) メソッド シグネチャ。

有効なマネージ型であるパラメーターを持つ、有効な CLR メソッド シグネチャ。

ulCodeRVA

0

dwImplFlags

miCilmiManaged を設定します。

miNativemiUnmanaged を設定します。

必要条件

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

参照

参照

IMetaDataEmit インターフェイス

IMetaDataEmit2 インターフェイス