2011-01-22 9 views
5

Estoy tratando de implementar un método que recibe un tipo y devuelve todos los ensamblajes que contienen sus tipos básicos.Encontrando ensamblajes de jerarquía de tipos utilizando Mono.Cecil

Por ejemplo:
Clase A es un tipo de base (clase A pertenece al conjunto de C: \ A.dll)
Clase B hereda de A (clase B pertenece al conjunto c: \ B.dll)
Clase C hereda de B (clase C pertenece al montaje 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" } 
} 

Mi problema principal es que AssemblyDefinition de Mono.Cecil no contiene ninguna propiedad como Localización.

¿Cómo se puede encontrar una ubicación de ensamblado dado un AssemblyDefinition?

Respuesta

3

Un conjunto puede estar compuesto por varios módulos, por lo que realmente no tiene una ubicación per se. módulo principal de la asamblea tiene una ubicación sin embargo:

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

por lo que podría escribir algo en la línea de:

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 cualquier otra variante que te agrade más.

+0

Gracias! Esto fue muy útil :) – Elisha

+0

¡Y del autor de Cecil, nada menos! –

Cuestiones relacionadas