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
トークン。 グローバル関数を定義する場合は、td
を mdTokenNil
に設定します。
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 テーブルのスロットを取得するためにダミー メソッドが定義されています。dwMethodFlags
を CorMethodAttr 列挙型の mdRTSpecialName
値に設定し、次の名前を指定します。
_VtblGap<SequenceNumber><_CountOfSlots>
ここで、SequenceNumber はメソッドのシーケンス番号、CountOfSlots は v テーブルでスキップするスロットの数です。 CountOfSlots を省略した場合、1 が使用されます。 これらのダミー メソッドは、マネージド コードまたはアンマネージド コードから呼び出すことはできません。また、マネージド コードまたはアンマネージド コードから呼び出しを試みると、例外が生成されます。 その唯一の目的は、ランタイムで COM 統合用に生成される v テーブルの領域を占有することです。
重複メソッド
重複するメソッドは定義しないでください。 つまり、td
、 wzName
、pvSig
パラメーターで、重複する値のセットを指定して DefineMethod
を呼び出すことはできません。 (これら 3 つのパラメーターを組み合わせて、メソッドを一意に定義します)。 ただし、メソッドの定義の 1 つに対して、dwMethodFlags
パラメーターに mdPrivateScope
ビットを設定すれば、重複した 3 つを使用できます。 (mdPrivateScope
ビットは、コンパイラでこのメソッド定義への参照が生成されないことを意味します)。
メソッドの実装情報
メソッドの実装に関する情報は、多くの場合、メソッドが宣言されているときには不明です。 したがって、DefineMethod
を呼び出すときに、ulCodeRVA
と dwImplFlags
パラメーターに値を渡す必要はありません。 値は、必要に応じて、後で IMetaDataEmit::SetMethodImplFlags または IMetaDataEmit::SetRVA を使用して指定できます。
プラットフォーム呼び出し (PInvoke) や COM 相互運用のシナリオなど、状況によっては、メソッド本体が提供されず、ulCodeRVA
を 0 に設定する必要があります。 このような状況では、ランタイムによって実装が特定されるため、メソッドを abstract としてタグ付けすることはできません。
PInvoke のメソッドの定義
PInvoke を通じて呼び出される各アンマネージド関数に対して、対象のアンマネージド関数を表すマネージド メソッドを定義する必要があります。 マネージド メソッドを定義するには、PInvoke の使用方法に応じて、特定の値に設定されているいくつかのパラメーターと共に DefineMethod
を使用します。
True PInvoke - アンマネージド DLL に存在する外部アンマネージド メソッドの呼び出しが関係します。
Local PInvoke - 現在のマネージド モジュールに埋め込まれているネイティブ アンマネージド メソッドの呼び出しが関係します。
次の表にパラメーター設定を示します。
パラメーター | True PInvoke の値 | Local PInvoke の値 |
---|---|---|
dwMethodFlags |
mdStatic を設定し、mdSynchronized と mdAbstract をクリアします。 |
|
pvSigBlob |
有効なマネージド型であるパラメーターを持つ有効な共通言語ランタイム (CLR) メソッド署名。 | 有効なマネージド型であるパラメーターを持つ有効な CLR メソッド署名。 |
ulCodeRVA |
0 | |
dwImplFlags |
miCil と miManaged を設定します。 |
miNative と miUnmanaged を設定します。 |
必要条件
:「システム要件」を参照してください。
ヘッダー: Cor.h
ライブラリ: MSCorEE.dll でリソースとして使用されます
.NET Framework のバージョン: 1.0 以降で使用可能
関連項目
.NET