我正在使用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);