3

次のような構造のコードがあります。

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で検証しました: それらは正しいです。このマッピングは、他のアプリケーションでも何度もテストされており、問題なく機能しているように見えるので、これが問題の原因ではないと思います。

4

1 に答える 1

0

これまでのところ、これがなぜ起こっているのかについて説明できる人は誰もいません。すべての調査により、プロファイラー API が単にメソッドの間違った型を報告することがあると考えるようになりました。

幸いなことに、メソッド トークンはアセンブリ全体で一意であるため、これらとアセンブリ名を使用して各メソッドを一意に識別し、型トークンを完全に無視します。

于 2015-07-27T12:25:27.257 に答える