Использование 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,

1 ответ

Решение

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

metaDataImport->GetMethodProps(metaDataToken, NULL, szName, cchName, &pchName, NULL, NULL, NULL, NULL, NULL);
Другие вопросы по тегам