Получите методы иерархии базового класса с помощью 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).