2012-08-07 9 views
8

Tengo varias clases que implementan IDessertPlugin. Estos se encuentran en varias DLL que utilizo MEF para aumentar las instancias de ellos para usar como funcionalidad de complemento en mi aplicación.¿Cómo obtengo el número de versión de cada DLL que tiene mis complementos MEF?

Entonces, lo que quiero hacer es mostrar el número de versión de las DLL desde las que he cargado los complementos utilizando MEF. Uno o más complementos se definen en uno o más DLL que cargo en mi aplicación.

En este momento hago algo así:

var catalog = new AggregateCatalog(); 
catalog.Catalogs.Add(
    new DirectoryCatalog(Path.Combine(
     Path.GetDirectoryName(Assembly.GetExecutingAssembly().location), "Plugins"))); 

var container = new CompositionContainer(catalog); 

container.ComposeParts(this); 

Y eso va a cargar plugins simplemente finas desde el subdirectorio plugins donde mis ejecuta la aplicación.

Hacer algo como

catalog.Catalogs.First().Parts.First().GetType().Assembly.FullName 

sólo devuelve "System.ComponentModel.Composition, Version = 4.0.0.0, ..."

lo que estaba esperando a ser capaz de saber que era yo' Tengo la versión 1.0 de CakePlugins.dll y la versión 1.1 de IceCreamPlugins.dll. Los plugins en sí mismos no tienen un atributo de versión sobre ellos. Estoy deseando confiar en la versión de la DLL. Espero que tenga sentido.

No he descubierto las DLL que estoy utilizando allí para poder llamar al Assembly.GetName().Version en ellas.

Ideas?


Solución:

Por lo tanto, la solución a mi problema era bastante sencillo después de que las partes se han compuesto.

Mi código de gestión plugin tiene una entrada de este modo:

[ImportMany(typeof(IDessertPlugin)] 
private IEnumerable<IDessertPluing> dessertPlugins; 

y una vez que la composición de piezas de contenedores ha tenido lugar, podría iterar a través de mis plug-ins, así:

foreach(var plugin in dessertPlugins) 
{ 
    Console.WriteLine(Assembly.GetAssembly(plugin.GetType()).GetName().Version.ToString()); 
} 
+0

Usted debe publique su solución como una respuesta y márquela como aceptada en lugar de publicarla en su pregunta. – tomfanning

Respuesta

1

Por lo tanto, la solución a mi problema fue bastante sencilla una vez que se han compuesto las partes. Intenté profundizar en los objetos MEF en lugar de mirar en el contenedor que contiene todos los complementos que he cargado. La respuesta fue ignorar por completo el hecho de cómo se estaban cargando los complementos y simplemente observar los objetos instanciados.

Mi código de gestión plugin tiene una entrada de este modo:

[ImportMany(typeof(IDessertPlugin)] 
private IEnumerable<IDessertPluing> dessertPlugins; 

y una vez que la composición de piezas de contenedores ha tenido lugar, podría iterar a través de mis plug-ins, así:

foreach(var plugin in dessertPlugins) 
{ 
    Console.WriteLine(Assembly.GetAssembly(plugin.GetType()).GetName().Version.ToString()); 
} 
2

Usted puede obtener información de ensamblaje de diferentes propiedades AssemblyVersion, AssemblyFileVersion y AssemblyDescription.

   /// <summary> 
       /// This class provide inforamtion about product version. 
       /// </summary> 
       public class ProductVersion 
       { 
        private readonly FileVersionInfo fileVersionInfo; 

        private readonly AssemblyName assemblyName; 


        private ProductVersion(Type type) 
        { 
         // it done this way to prevent situation 
         // when site has limited permissions to work with assemblies. 
         var assembly = Assembly.GetAssembly(type); 
         fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location); 
         assemblyName = new AssemblyName(assembly.FullName); 
        } 

        public string AssemblyFileVersion 
        { 
         get 
         { 
          return fileVersionInfo.FileVersion; 
         } 
        } 

        public string AssemblyVersion 
        { 
         get 
         { 
          return assemblyName.Version.ToString(); 
         } 
        } 



       } 
+0

Hola, gracias por tu respuesta. Mi problema no era averiguar cómo encontrar la información del ensamblaje, sino cómo obtener la información de ensamblaje de los propios objetos MEF, que de todos modos no era la manera de hacerlo. Una vez que había compuesto las partes en el contenedor, mis objetos se crearon y luego pude iterar a través de ellos y obtener la información que necesitaba. – itsmatt

Cuestiones relacionadas