Получите методы иерархии базового класса с помощью IMetaDataImport EnumMethods

Я пытаюсь реализовать управляемый отладчик, глядя на образец MDBG.

MDBG может разрешать имена функций в заданной области, но не учитывает базовые классы.

MDBG делает это:

    /// <summary>
    /// Resolves a Function from a Module, Class Name, and Function Name.
    /// </summary>
    /// <param name="mdbgModule">The Module that has the Function.</param>
    /// <param name="className">The name of the Class that has the Function.</param>
    /// <param name="functionName">The name of the Function.</param>
    /// <returns>The MDbgFunction that matches the given parameters.</returns>
    public MDbgFunction ResolveFunctionName(MDbgModule mdbgModule, string className, string functionName) {
        ...
        foreach (MethodInfo mi in t.GetMethods()) {
            if (mi.Name.Equals(functionName)) {
                func = mdbgModule.GetFunction((mi as MetadataMethodInfo).MetadataToken);
                break;
            }
        }
        return func;
    }

Хотя Type.GetMethods() переопределяется и имеет эту реализацию, используется IMetaDataImport.EnumMethods:

     public override MethodInfo[] GetMethods(BindingFlags bindingAttr) {
        ArrayList al = new ArrayList();
        IntPtr hEnum = new IntPtr();

        int methodToken;
        try {
            while (true) {
                int size;
                m_importer.EnumMethods(ref hEnum, (int) m_typeToken, out methodToken, 1, out size);
                if (size == 0) {
                    break;
                }
                al.Add(new MetadataMethodInfo(m_importer, methodToken));
            }
        }
        finally {
            m_importer.CloseEnum(hEnum);
        }
        return (MethodInfo[]) al.ToArray(typeof (MethodInfo));
    }

Проблема в том, что m_importer.EnumMethods() перечисляет токены MethodDef, представляющие методы указанного типа, но меня интересуют все методы из иерархии классов.

Как я могу получить все методы, определенные в иерархии классов? (Очевидно, что обычные методы, такие как отражение, использовать нельзя, так как я анализирую тип, определенный в другом процессе)

Мои ограниченные знания взаимодействия и глубокой структуры CLR/CIL создают препятствия для поиска правильного пути.

Любой совет / предложение приветствуется!

С Уважением,

1 ответ

Решение

GetTypeProps вернет токен метаданных базового типа в ptkExtends, вы можете использовать его для перехода по дереву наследования и сбора методов из каждого из них по мере продвижения.

Имейте в виду, однако, что токен метаданных может не быть TypeDef. Это может быть TypeRef (требующий разрешения типа) или TypeSpec (требующий анализа сигнатуры типа и извлечения соответствующего TypeDef/TypeRef).

Другие вопросы по тегам