次の方法で共有


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

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

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

pvSigBlob
[in] メソッド署名。 署名は、指定されたとおりに永続化されます。 任意のパラメーターの追加情報を指定する必要がある場合は、IMetaDataEmit::SetParamProps メソッドを使用します。

cbSigBlob
[in] pvSigBlob のバイト数。

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

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

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

解説

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

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

V テーブルのスロット

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

_VtblGap<SequenceNumber><_CountOfSlots>

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

重複メソッド

重複するメソッドは定義しないでください。 つまり、tdwzNamepvSig パラメーターで、重複する値のセットを指定して DefineMethod を呼び出すことはできません。 (これら 3 つのパラメーターを組み合わせて、メソッドを一意に定義します)。 ただし、メソッドの定義の 1 つに対して、dwMethodFlags パラメーターに mdPrivateScope ビットを設定すれば、重複した 3 つを使用できます。 (mdPrivateScope ビットは、コンパイラでこのメソッド定義への参照が生成されないことを意味します)。

メソッドの実装情報

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

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

PInvoke のメソッドの定義

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

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

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

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

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

必要条件

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

ヘッダー: Cor.h

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

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

関連項目