2011-01-22 5 views
5

Я пытаюсь реализовать метод, который получает тип и возвращает все сборки, которые содержат его базовые типы.Поиск групп иерархии типов с использованием 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 из Mono.Cecil не содержит какого-либо имущества, как Расположение.

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

ответ

3

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

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

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

+0

Спасибо! Это было очень полезно :) – Elisha

+0

И от автора Сесила, не меньше! –

Смежные вопросы