2011-03-22 14 views
16

मेरे पास एक एमईएफ-आधारित एप्लिकेशन है जिसे प्लगइन के साथ अनुकूलित किया जा सकता है। इस एप्लिकेशन में कई आयातित भाग हैं, और जब मैं उपयोगकर्ता उस प्लगइन से छुटकारा पाने का निर्णय लेता हूं तो मैं उनमें से कुछ को रनटाइम पर हटा सकता हूं (उनमें शामिल डीडी को हटाने में सक्षम होने के लिए)।रनटाइम पर MEF प्लगइन्स को कैसे निकालें?

CompositionBatch मैं क्या जरूरत है क्या करना होगा, लेकिन यह RemovePart() विधि के लिए इनपुट पैरामीटर के रूप में ComposablePart उदाहरणों की जरूरत है, और मैं केवल सादे ऑब्जेक्ट ISomething इंटरफेस, या AggregateCatalog में ComposablePartDefinition उदाहरणों को लागू किया है। तो मेरे सवाल है:

  • मैं ComposablePart उदाहरण है कि आयातित उद्देश्य यह है कि मैं से छुटकारा पाने के लिए चाहते हैं का प्रतिनिधित्व करता है कैसे मिल सकती है?
  • या वैकल्पिक रूप से: मैं कंपोज़ेबलपार्ट ऑब्जेक्ट्स की सूची कैसे प्राप्त करूं जो कि से संबंधित एक निश्चित .dll से संबंधित है?

मैं इस प्रकार की तरह कुछ का प्रयोग करेंगे:

var parts = Container.Catalog.Parts 
      .Where(p => iDontNeed(p)) 
      .Select(p => howDoIConvertComposablePartDefinition2ComposablePart(p)); 
var batch = new CompositionBatch(); 
parts.ToList().ForEach(part => batch.RemovePart(part)); 

आप

उत्तर

28

मैं ComposablePart वस्तुओं कि एक निश्चित .dll के हैं की सूची कैसे मिलता है धन्यवाद?

एक विशेष विधानसभा से भागों निकालने के लिए, तुम सिर्फ हटाने सकता है कि AssemblyCatalogAggregateCatalog.Catalogs.Remove फोन करके। हालांकि आपको Recomposition की अनुमति देने के लिए अपने भागों को डिज़ाइन करना होगा।

हालांकि, यह प्लगइन असेंबली को हटाने में आपकी सहायता नहीं करेगा। असेंबली अभी भी लोड हो जाएगी और लोड होने के दौरान आप .NET असेंबली को बदल या हटा नहीं सकते हैं। को अनलोड करने का एकमात्र तरीका प्रक्रिया को रोक दिए बिना एक असेंबली AppDomain को लोड करके लोड किया गया है। लेकिन यदि आप प्लगइन के लिए एक अलग AppDomain पेश करते हैं तो आपको मूल रूप से उन प्लगइन के साथ रिमोटिंग, इत्यादि के माध्यम से संवाद करना होगा।

यह एप्लिकेशन को रोकने, प्लगइन असेंबली को हटाने और पुनरारंभ करने के लिए शायद अधिक सरल, सुरक्षित और प्रभावी है।

संपादित: वास्तव में, वहाँ प्रक्रिया को रोकने या पूरे appdomain उतारने के बिना प्लगइन dll फ़ाइल को नष्ट करने के लिए एक तरीका है: आप नेट का निर्देश देने की appdomain के लिए shadow copying सक्षम कर सकते हैं इससे पहले कि आप प्रतिलिपि बनाने की असेंबली लोड हो रहा है। प्रतिलिपि लोड रहेगी, लेकिन कम से कम आप मूल फ़ाइल को हटा या बदल सकते हैं।

+0

उत्कृष्ट उत्तर। अगर मैं कर सकता तो मैं इसे कई बार वोट दूंगा। –

+0

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

+1

@ जोश जी: मैं नहीं देखता कि प्रतिबिंब का उपयोग करके अपनी खुद की प्लगइन प्रणाली कैसे लिखना कुछ हल करने जा रहा है। अनलोडिंग के साथ वर्णित समस्याएं एमईएफ तक सीमित नहीं हैं, यह वही है जो .NET काम करता है। –

1

क्या एमएएफ आपको यहां मदद कर सकता है? मैं एक विशेषज्ञ नहीं हूं लेकिन मैं समझता हूं कि एमएएफ के साथ एडिन अपनी प्रक्रिया में रहते हैं और रन टाइम पर अनलोड किए जा सकते हैं। मुझे लगता है कि यह आदर्श प्रदर्शन नहीं देगा क्योंकि आप क्रॉस प्रोसेसिंग कर रहे हैं लेकिन यदि यह कोई बड़ी समस्या नहीं है तो यह देखने के लायक हो सकता है।

संबंधित मुद्दे