次のような構造のコードがあります。
class A {
void M() {}
}
delegate void B<T1,T2>(T1 key, T2 value);
そして、ICorProfiler2 API を使用してそのコードをプロファイリングしています。ここで、メソッド M がジットされると、その ID への FunctionID* ポインターを取得します。次に、次のことを行います (大幅に省略されています)。
mdToken functionToken = mdTypeDefNil;
mdTypeDef classToken = mdTypeDefNil;
IMetaDataImport* pMDImport = NULL;
profilerInfo->GetTokenAndMetaDataFromFunction(functionId,
IID_IMetaDataImport, (IUnknown**) &pMDImport, &functionToken);
pMDImport->GetMethodProps(functionToken, &classToken, functionName,
sizeof(functionName), 0, &methodAttr, &sigBlob, &sigSize, NULL,
NULL);
これにより、変数 classToken に TypeToken が含まれます。
これは、ソースで M が宣言された型 (別名クラス A) であると予想していましたが、代わりにデリゲート B の型トークンを受け取ります。だから私の質問は: 私は何か間違ったことをしていますか、それとも GetMethodProps が M の定義型の型トークンを返すという私の仮定は間違っていますか?
残念ながら、GetMethodProps のドキュメントはあまり役に立ちません: https://msdn.microsoft.com/en-us/library/ms233163(v=vs.110).aspx
編集: 明確にするために:すべてのタイプ/関数トークンとそれらがマップする名前を含むファイルを生成したため、間違ったタイプが返されることを知っています。これらのトークンをILSpyで検証しました: それらは正しいです。このマッピングは、他のアプリケーションでも何度もテストされており、問題なく機能しているように見えるので、これが問題の原因ではないと思います。