2012-08-07 16 views
8

Mam kilka klas, które implementują IDessertPlugin. Znajdują się one w różnych bibliotekach DLL, w których używam MEF, aby zakodować instancje, których używają jako wtyczek w mojej aplikacji.Jak uzyskać numer wersji każdej biblioteki DLL z wtyczkami MEF?

Co chcę zrobić, to wyświetlić numer wersji bibliotek DLL, z których załadowałem wtyczki za pomocą MEF. Jedna lub więcej wtyczek jest zdefiniowanych w jednej lub wielu bibliotekach DLL, które ładuję w mojej aplikacji.

Teraz robię coś tak:

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

I to będzie załadować wtyczki dobrze z podkatalogu Plugins gdzie mój działa aplikacja.

Uprawiając jak

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

tylko zwraca "System.ComponentModel.Composition, Version = 4.0.0.0, ..."

Co miałem nadzieję być w stanie wiedzieć, że ja” ma wersję 1.0 pliku CakePlugins.dll i wersję 1.1 IceCreamPlugins.dll. Same wtyczki nie mają atrybutu wersji o nich - chcę polegać na wersji biblioteki DLL. Mam nadzieję, że ma to sens.

Nie zorientowałem się, które biblioteki DLL używam, aby móc na nich zadzwonić pod numer Assembly.GetName().Version.

Pomysły?


Rozwiązanie:

Więc rozwiązanie mojego problemu było całkiem proste po części zostały składzie.

Mój kod zarządzający Wtyczka posiada wpis tak:

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

a gdy kompozycja części zbiornika nastąpiło, mógłbym iterację moich wtyczek tak:

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

Powinieneś umieść swoje rozwiązanie jako odpowiedź i zaznacz je jako zaakceptowane, zamiast zamieszczać je w swoim pytaniu. – tomfanning

Odpowiedz

1

Tak więc, rozwiązanie mojego problemu było dość proste po skomponowaniu części. Próbowałem zagłębić się w obiekty MEF, zamiast zaglądać do pojemnika zawierającego wszystkie wtyczki, które wczytałem. Odpowiedzią było całkowite zignorowanie tego, jak te wtyczki zostały załadowane i po prostu patrzenie na same obiekty.

Mój kod zarządzający Wtyczka posiada wpis tak:

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

a gdy kompozycja części zbiornika nastąpiło, mógłbym iterację moich wtyczek tak:

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

Ty można uzyskać informacje o montażu z różnych właściwości AssemblyVersion, AssemblyFileVersion i 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

Hej, dziękuję za odpowiedź. Mój problem polegał nie na tym, żeby dowiedzieć się, jak znaleźć informacje z zespołu, ale jak uzyskać informacje na temat montażu z samych obiektów MEF, co i tak nie było możliwe. Kiedy skomponowałem części w kontenerze, moje obiekty zostały utworzone, a następnie mogłem po prostu przejrzeć je i uzyskać potrzebne informacje. – itsmatt