使用 GetFunctionInfo 从 FunctionID 获取函数的名称

Using GetFunctionInfo to get the name of a function from a FunctionID

本文关键字:函数 获取 GetFunctionInfo FunctionID 使用      更新时间:2023-10-16

我正在使用ICorProfilerInfo接口编写CLR探查器。

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

如何获取给定此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

GetTypeRefProps仅适用于

您的令牌是 TypeRef 令牌,GetFunctionInfo会为您提供一个 MethodDef 令牌,该令牌要求您使用 GetMethodProps 方法。

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