ICorProfiler:为什么我为一个jitted函数获取了错误的类型标记

本文关键字:获取 函数 错误 类型 jitted 一个 为什么 ICorProfiler | 更新日期: 2023-09-27 18:00:52

我的代码结构如下:

class A {
    void M() {}
}
delegate void B<T1,T2>(T1 key, T2 value);

我正在使用ICorProfiler2 API来评测代码。现在,当方法M被jit时,我会得到一个指向其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验证了这些标记:它们是正确的。这种映射在其他应用程序中也进行了多次测试,似乎运行得很好,所以我不认为这是问题的根源。

ICorProfiler:为什么我为一个jitted函数获取了错误的类型标记

到目前为止,没有人能解释为什么会发生这种情况。我的所有调查都让我相信,探查器API有时只是报告方法的错误类型。

幸运的是,方法标记在整个程序集中是唯一的,所以我们现在使用这些+程序集名称来唯一地标识每个方法,并完全忽略类型标记。