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

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

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

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

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

一篇 MSDN 文章建议第一个调用应该是 GetFunctionInfo。此函数的 documentation 声明:

The profiler code can call ICorProfilerInfo::GetModuleMetaData to obtain a metadata interface for a given module. The metadata token that is returned to the location referenced by pToken can then be used to access the metadata for the function.

最后一句没有详细说明('the metadata token ... can be used to access metadata for the function')。 这是如何工作的?

到目前为止,我正在做以下事情:

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);

最后调用returnsS_FALSE,不填充szName.

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

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