2012-08-07 8 views
8

Ich habe eine Reihe von Klassen, die IDessertPlugin implementieren. Diese befinden sich in verschiedenen DLLs, in denen ich MEF zum Hochdrehen von Instanzen verwende, um sie als Plug-In-Funktionalität in meiner Anwendung zu verwenden.Wie bekomme ich die Versionsnummer jeder DLL, die meine MEF-Plugins hat?

Also was ich will, ist die Versionsnummer der DLLs anzuzeigen, von denen ich Plugins mit MEF geladen habe. Ein oder mehrere Plugins sind in einer oder mehreren DLLs definiert, die ich in meiner Anwendung geladen habe.

Im Moment mache ich so etwas wie so:

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

Und das wird Plugins ganz gut aus dem Plug-Ins-Unterverzeichnis, wo meine Anwendung läuft laden.

tun so etwas wie

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

nur zurückgibt "System.ComponentModel.Composition, Version = 4.0.0.0, ..."

Was ich hatte gehofft, war in der Lage sein zu wissen, dass ich habe Version 1.0 von CakePlugins.dll und Version 1.1 von IceCreamPlugins.dll. Die Plugins selbst haben kein Versionsattribut - ich möchte mich auf die Version der DLL verlassen. Hoffnung, die Sinn macht.

Ich habe nicht herausgefunden, welche DLLs ich dort verwende, so dass ich Assembly.GetName().Version auf ihnen anrufen kann.

Ideen?


Lösung:

die Lösung für mein Problem war also ziemlich einfach, nachdem die Teile zusammengesetzt wurden.

Meine Plugin Verwaltung Code hat einen Eintrag wie folgt:

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

und sobald die Behälterteile Zusammensetzung stattgefunden hat, konnte ich wie so durch meine Plug-in durchlaufen:

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

Sie sollen poste deine Lösung als Antwort und markiere sie als akzeptiert, anstatt sie in deiner Frage zu posten. – tomfanning

Antwort

1

Also, die Lösung für mein Problem war ziemlich einfach, nachdem die Teile komponiert wurden. Ich habe versucht, in die MEF-Objekte selbst zu graben, anstatt in den Container zu schauen, der alle Plug-ins enthält, die ich geladen habe. Die Antwort war, die Tatsache, wie diese Plugins geladen wurden, völlig zu ignorieren und nur die instanziierten Objekte selbst zu betrachten.

Meine Plugin Verwaltung Code hat einen Eintrag wie folgt:

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

und sobald die Behälterteile Zusammensetzung stattgefunden hat, konnte ich wie so durch meine Plug-in durchlaufen:

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

Sie kann Montageinformationen von verschiedenen Eigenschaften erhalten AssemblyVersion, AssemblyFileVersion und AssemblyDescription.

+0

Hey, danke für deine Antwort. Mein Problem war nicht, herauszufinden, wie man die Informationen aus der Assembly herausfindet, sondern wie man Assembly-Informationen von den MEF-Objekten selbst erhält, was nicht der richtige Weg war. Sobald ich die Teile im Container erstellt hatte, wurden meine Objekte erstellt, und dann konnte ich sie einfach durchlaufen und benötigte Informationen abrufen. – itsmatt