我的代码结构如下:
class A {
void M() {}
}
delegate void B<T1,T2>(T1 key, T2 value);
我正在使用 ICorProfiler2 API 来分析该代码。现在,当方法 M 被 jitted 时,我得到一个 FunctionID* 指向其 ID 的指针。然后我执行以下操作(高度缩写):
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 类)中声明 M 的类型,但我收到了委托 B 的类型令牌。所以我的问题是:我做错了什么还是我假设 GetMethodProps 返回 M 的定义类型的类型标记错误?
不幸的是,GetMethodProps 的文档不是很有帮助:https ://msdn.microsoft.com/en-us/library/ms233163(v=vs.110).aspx
编辑: 澄清:我知道返回了错误的类型,因为我生成了一个包含所有类型/函数标记及其映射到的名称的文件。我用ILSpy验证了这些令牌:它们是正确的。这种映射也在其他应用程序中进行了多次测试,似乎工作得很好,所以我认为这不是问题的根源。