使用GetFunctionInfo从FunctionID

时间:2017-11-16 23:16:44

标签: c++ .net profiling clr-profiling-api imetadataimport

我正在使用ICorProfilerInfo界面编写CLR探查器。

使用SetEnterLeaveFunctionHooks时,回调方法会传递FunctionID

如何获取给定此FunctionID的函数的元数据(我特别是在名字后面)?

MSDN文章建议第一次调用应该是GetFunctionInfo。此函数的documentation表示:

  

探查器代码可以调用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

1 个答案:

答案 0 :(得分:1)

GetTypeRefProps仅在您的令牌是TypeRef令牌时适用,GetFunctionInfo会为您提供一个MethodDef令牌,要求您使用GetMethodProps方法。

metaDataImport->GetMethodProps(metaDataToken, NULL, szName, cchName, &pchName, NULL, NULL, NULL, NULL, NULL);