Я пытаюсь реализовать управляемый отладчик, рассматривающий образец 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 создает препятствия для нахождения правильного пути для перехода сюда.
Любые советы и предложения приветствуются!
С уважением,
Спасибо! Теперь я понимаю немного лучше, что я должен делать, но это еще не совсем ясно. Я вижу, как MDBG обрабатывает TypeRef и TypeDef, используя метод GetTypeRefProps/GetTypeDefProps. Но как мне разобрать подпись TypeSpec? – 3615
Используйте [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. –
Еще раз спасибо! Мне нужно некоторое время, чтобы попробовать, а потом я вернусь с некоторыми результатами. – 3615