2011-01-22 10 views
5

Sto cercando di implementare un metodo che riceve un tipo e restituisce tutti gli assembly che contengono i suoi tipi di base.Ricerca di assembly di gerarchia di tipi utilizzando Mono.Cecil

Ad esempio:
Classe A è un tipo di base (classe A appartiene al montaggio c: \ A.dll)
Classe B eredita da A (classe B appartiene all'assemblaggio c: \ B.dll)
Classe C eredita da B (classe C appartiene al montaggio 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" } 
} 

Il mio problema principale è che AssemblyDefinition da Mono.Cecil non contiene alcuna proprietà come Località.

Come si può trovare un luogo di montaggio dato un AssemblyDefinition?

risposta

3

Un assieme può essere composto da più moduli, quindi in realtà non ha una posizione di per sé. modulo principale del montaggio ha una posizione, però:

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

Così si potrebbe scrivere qualcosa lungo la linea del:

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

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

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

O qualsiasi altra variante che vi piace di più.

+0

Grazie! Questo è stato molto utile :) – Elisha

+0

E dall'autore di Cecil, niente di meno! –

Problemi correlati