Поиск сборок иерархии типов с помощью 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 ();
}
}
Или любой другой вариант, который вас больше радует.