Поиск сборок иерархии типов с использованием Mono.Cecil - PullRequest
5 голосов
/ 22 января 2011

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

Например:
Класс 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 из Mono.Cecil не содержит никаких свойств, таких как Местоположение .

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

1 Ответ

3 голосов
/ 22 января 2011

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

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 ();
    }
}

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

...