我正在使用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
。
答案 0 :(得分:1)
GetTypeRefProps
仅在您的令牌是TypeRef令牌时适用,GetFunctionInfo
会为您提供一个MethodDef令牌,要求您使用GetMethodProps
方法。
metaDataImport->GetMethodProps(metaDataToken, NULL, szName, cchName, &pchName, NULL, NULL, NULL, NULL, NULL);