Я пишу CLR профилировщик, используя ICorProfilerInfo
интерфейс.
Когда используешь 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);
Других решений пока нет …