Использование GetFunctionInfo для получения имени функции из FunctionID

Я пишу 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,

0

Решение

GetTypeRefProps применимо, только если ваш токен является токеном TypeRef, GetFunctionInfo даст вам токен MethodDef, который требует от вас использовать GetMethodProps метод.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]