2012-08-07 33 views
8

我有很多類實現IDessertPlugin。這些可以在各種DLL中找到,我使用MEF將它們的實例作爲我的應用程序中的插件功能使用。如何獲取每個具有我的MEF插件的DLL的版本號?

所以我想要做的是顯示我已經使用MEF加載插件的DLL的版本號。一個或多個插件在我的應用程序中加載的一個或多個DLL中定義。

現在我做一些事情,像這樣:

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

這將加載插件從plugins子目錄在我的應用程序運行得很好。

做這樣的事情

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

剛剛返回 「System.ComponentModel.Composition,版本= 4.0.0.0,...」

我希望能夠知道的是,我已經有1.0版本的CakePlugins.dll和IceCreamPlugins.dll版本1.1。插件本身沒有關於它們的版本屬性 - 我想要依賴於DLL的版本。希望這是有道理的。

我還沒有想知道我正在使用哪個DLL,因此我可以在其上調用Assembly.GetName().Version

想法?


解決方案:

所以,解決我的問題是非常簡單的部件已經組成了。

我的插件管理代碼中有一個條目,像這樣:

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

,一旦容器部件組成已經發生了,我可以像這樣通過我的插件迭代:

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

你應該將您的解決方案作爲答案發布,並將其標記爲已接受,而不是將其發佈到您的問題中。 – tomfanning 2012-08-07 15:44:34

回答

1

因此,解決我的問題是非常簡單的,在部分組成之後。我試圖深入MEF對象本身,而不是看看容納所有我加載的插件的容器。答案是完全忽略了這些插件如何被加載的事實,而只是看看實例化的對象本身。

我的插件管理代碼中有一個條目,像這樣:

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

,一旦容器部件組成已經發生了,我可以像這樣通過我的插件迭代:

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

你可以從不同的屬性AssemblyVersion,AssemblyFileVersionAssemblyDescription獲得組裝信息。

   /// <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

嘿,謝謝你的回覆。我的問題不在於如何從程序集中找出信息,而是如何從MEF對象本身獲取程序集信息,而不是以任何方式來完成它。一旦我編寫了容器中的部件,創建了我的對象,然後我可以遍歷它們並獲取我需要的信息。 – itsmatt 2012-08-07 15:50:05