Поиск сборок иерархии типов с помощью Mono.Cecil

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

Например:
Учебный класс A это базовый тип (класс A принадлежит сборке c: \ A.dll)
Учебный класс B наследуется от A (учебный класс B принадлежит сборке c: \ B.dll)
Учебный класс C наследуется от B (учебный класс C принадлежит сборке c: \ c.dll)

public IEnumerable<string> GetAssembliesFromInheritance(string assembly, 
                                                        string type)
{
    // If the method recieves type C from assembly c:\C.dll
    // it should return { "c:\A.dll", "c:\B.dll", "c:\C.dll" }
}

Моя главная проблема в том, что AssemblyDefinition from Mono.Cecil не содержит никаких свойств, таких как Location.

Как найти место сборки с учетом AssemblyDefinition?

1 ответ

Решение

Сборка может состоять из нескольких модулей, поэтому у нее нет места как такового. Главный модуль сборки имеет местоположение, хотя:

AssemblyDefinition assembly = ...;
ModuleDefinition module = assembly.MainModule;
string fileName = module.FullyQualifiedName;

Таким образом, вы могли бы написать что-то вроде:

public IEnumerable<string> GetAssembliesFromInheritance (TypeDefinition type)
{
    while (type != null) {
        yield return type.Module.FullyQualifiedName;

        if (type.BaseType == null)
            yield break;

        type = type.BaseType.Resolve ();
    }
}

Или любой другой вариант, который вас больше радует.

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