2016-07-26 2 views
1

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

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 создает препятствия для нахождения правильного пути для перехода сюда.

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

С уважением,

ответ

2

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

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

+0

Спасибо! Теперь я понимаю немного лучше, что я должен делать, но это еще не совсем ясно. Я вижу, как MDBG обрабатывает TypeRef и TypeDef, используя метод GetTypeRefProps/GetTypeDefProps. Но как мне разобрать подпись TypeSpec? – 3615

+0

Используйте [GetTypeSpecFromToken] (https://msdn.microsoft.com/en-us/library/windows/desktop/hh870637 (v = vs.85) .aspx), чтобы получить подпись blob. Формат подписи определен в [ECMA-335] (http://www.ecma-international.org/publications/standards/Ecma-335.htm) Раздел II Раздел 23.2.14. –

+0

Еще раз спасибо! Мне нужно некоторое время, чтобы попробовать, а потом я вернусь с некоторыми результатами. – 3615

Смежные вопросы