我的代码结构如下:
class A {
void M() {}
}
delegate void B<T1,T2>(T1 key, T2 value);
我正在使用ICorProfiler2 API来分析该代码。现在,当方法M被jitted时,我得到一个指向其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。
我期望这是在源(a.k.a A类)中声明M的类型,而是我收到了委托B的类型令牌。所以我的问题是:我做错了什么,或者我认为GetMethodProps返回M&#39定义类型错误的类型标记?
不幸的是,GetMethodProps的文档不是很有用:https://msdn.microsoft.com/en-us/library/ms233163(v=vs.110).aspx
修改 澄清:我知道返回了错误的类型,因为我生成了一个包含所有类型/函数标记的文件以及它们映射到的名称。我使用ILSpy验证了这些令牌:它们是正确的。这种映射在其他应用程序中也经过多次测试,似乎运行得很好,所以我不认为这是问题的根源。
答案 0 :(得分:0)
到目前为止,没有人可以解释为什么会发生这种情况。我的所有调查都让我相信,探查器API有时只会报告方法的错误类型。
幸运的是,方法标记在整个程序集中是唯一的,因此我们现在使用这些+程序集名称来唯一地标识每个方法并完全忽略类型标记。