1

我正在使用该ICorProfilerInfo接口编写 CLR 分析器。

使用SetEnterLeaveFunctionHooks时,回调方法传递一个FunctionID.

如何获取给定 this 的函数的元数据(特别是我的名字)FunctionID

一篇 MSDN 文章建议第一次调用应该是GetFunctionInfo. 此功能的文档指出:

探查器代码可以调用 ICorProfilerInfo::GetModuleMetaData 来获取给定模块的元数据接口。然后可以使用返回到 pToken 引用的位置的元数据令牌来访问函数的元数据。

它没有详细说明最后一句话('元数据令牌......可用于访问函数的元数据')。这是如何运作的?

到目前为止,我正在执行以下操作:

void MyProfiler::EnterMethod(FunctionID functionID)
{
    ClassID classId = 0;
    ModuleID moduleId = 0;
    mdToken metaDataToken = 0;
    IMetaDataImport* metaDataImport = NULL;

    // (m_info is ICorProfilerInfo3)
    m_info->GetFunctionInfo(functionID, &classId, &moduleId, &metaDataToken);
    m_info->GetModuleMetaData(moduleId, ofRead, IID_IMetaDataImport, (IUnknown**)&metaDataImport);

    // What goes here?
}

我试过这样打电话GetTypeRefProps

    mdToken ptkResolutionScope;
    WCHAR szName[1024];
    ULONG cchName = 1024;
    ULONG pchName;

    HRESULT result = MetaDataImport->GetTypeRefProps(pToken, &ptkResolutionScope, szName, cchName, &pchName);

最后的调用返回S_FALSE,并且不填充szName

4

1 回答 1

2

GetTypeRefProps仅当您的令牌是 TypeRef 令牌时才适用,GetFunctionInfo它会给您一个 MethodDef 令牌,要求您使用该GetMethodProps方法。

metaDataImport->GetMethodProps(metaDataToken, NULL, szName, cchName, &pchName, NULL, NULL, NULL, NULL, NULL);
于 2017-11-17T09:42:49.117 回答