2012-08-07 7 views
8

मुझे कई कक्षाएं मिली हैं जो IDessertPlugin लागू करती हैं। ये विभिन्न डीएलएल में पाए जाते हैं जिन्हें मैं अपने आवेदन में प्लग-इन कार्यक्षमता के रूप में उपयोग करने के उदाहरणों को स्पिन करने के लिए एमईएफ का उपयोग करता हूं।मैं अपने एमईएफ प्लगइन वाले प्रत्येक डीएलएल का संस्करण संख्या कैसे प्राप्त करूं?

तो मैं जो करना चाहता हूं वह डीएलएल का संस्करण संख्या प्रदर्शित करता है जिसमें से मैंने MEF का उपयोग करके प्लगइन लोड किए हैं। एक या अधिक प्लगइन्स एक या अधिक डीएलएल में परिभाषित किए गए हैं जिन्हें मैं अपने आवेदन में लोड करता हूं।

अभी मैं बहुत कुछ ऐसा कार्य करें:

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

और वह प्लगइन्स प्लगइन्स उपनिर्देशिका है, जहां अपने आवेदन रन से ठीक ऊपर लोड होगा।

कर की तरह

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

कुछ सिर्फ रिटर्न "System.ComponentModel.Composition, संस्करण = 4.0.0.0, ..."

क्या मुझे उम्मीद थी पता करने के लिए सक्षम होने के लिए कि मैं था केकप्लगिन्स.dll के संस्करण 1.0 और IceCreamPlugins.dll के संस्करण 1.1 मिला है। प्लगइन के पास उनके बारे में संस्करण विशेषता नहीं है - मैं डीएलएल के संस्करण पर भरोसा करना चाहता हूं। उम्मीद है कि समझ में आता है।

मुझे पता नहीं चला है कि मैं कौन से डीएलएल का उपयोग कर रहा हूं ताकि मैं उन पर 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

उत्तर

1

तो, भागों की रचना के बाद मेरी समस्या का समाधान काफी सरल था। मैं कंटेनर को देखने के बजाय एमईएफ ऑब्जेक्ट्स में खुद को खोदने की कोशिश कर रहा था जिसमें मैंने लोड किए गए सभी प्लग-इन रखे हैं। इसका जवाब इस तथ्य को पूरी तरह से अनदेखा करना था कि उन प्लग-इन को कैसे लोड किया जा रहा था और केवल तत्काल वस्तुओं को देखें।

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

और एक बार कंटेनर भागों रचना हुई है, मैं इतना की तरह मेरे प्लग-इन के माध्यम से पुनरावृति सकता है::

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

आप विभिन्न गुणों से असेंबली जानकारी प्राप्त कर सकते हैं AssemblyVersion, AssemblyFileVersion और 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

अरे, आपकी प्रतिक्रिया के लिए धन्यवाद। मेरा मुद्दा यह नहीं पता था कि असेंबली से जानकारी कैसे प्राप्त करें, लेकिन एमईएफ वस्तुओं से खुद को असेंबली जानकारी कैसे प्राप्त करें, जो किसी भी तरह से ऐसा करने का तरीका नहीं था। एक बार जब मैं कंटेनर में भागों को बना लेता, तो मेरी ऑब्जेक्ट्स जहां बनाई गईं और फिर मैं बस उनके माध्यम से पुन: प्रयास कर सकता था और मुझे आवश्यक जानकारी प्राप्त कर सकता था। – itsmatt