我正在使用该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
。