2009-11-17 16 views
5

का उपयोग करने के लिए एमईएफ को निर्देशित करें। मैं System.ComponentModel.Composition से .NET-4.0 से Visual Studio 2010 बीटा 2 में पहली बार प्रबंधित एक्सटेंसिबिलिटी फ्रेमवर्क का प्रयास कर रहा हूं।किसी भी उपलब्ध असेंबली

मैं कंपोज़िशनकंटर को नीचे दो वैकल्पिक दिनचर्या का उपयोग करके अपनी कार्यान्वयन असेंबली खोजने में असमर्थ रहा हूं।

प्रथम प्रयास (इस MEF के एक पुराने codeplex रिलीज में काम किया):

var composition = new CompositionBatch(); 
composition.AddPart(this); 
var container = new CompositionContainer(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
container.Compose(composition); 

दूसरा प्रयास (इस बीटा 1 में काम किया, मुझे लगता है):

var aggregateCatalog = new AggregateCatalog(
    new AssemblyCatalog(Assembly.GetExecutingAssembly()), 
    new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
var compositionContainer = new CompositionContainer(aggregateCatalog); 
compositionContainer.ComposeParts(this); 

वहाँ एक नया तरीका है बीटा 2 में ऐसा करने के लिए?

संपादित करें: यह संरचना के साथ कुछ भी नहीं हुआ।

[Import] public static ILog Log { get; set; } 

जो किया जाना चाहिए था:

[Import] public ILog Log { get; set; } 

मैं क्योंकि अधिक विस्तृत रूप से फैशन में डीबगिंग के ऋषि सलाह समस्या हल के रूप में स्वीकार डैनियल जवाब में चिह्नित मैं एक स्थिर संपत्ति मेरी आयातित कार्यान्वयन का प्रतिनिधित्व किया था।

+0

मैं अब कुछ ही हफ्तों के लिए बीटा 2 का उपयोग कर रहे हैं और किसी भी मुद्दे के बिना अपने 2 उदाहरण का उपयोग किया गया है। क्या आपके पास निष्पादन असेंबली में कोई आंतरिक भाग है या क्या वे बेस डायरेक्टरी में स्थित हैं? क्या आप यह पुष्टि करने में सक्षम हैं कि AppDomain.CurrentDomain.BaseDirectory नक्शे रनटाइम पर क्या हैं? साथ ही, क्या उपरोक्त स्निपेट वाले वर्ग में कोई घोषित आयात शामिल है? बस यह सुनिश्चित कर लें कि कक्षा के उदाहरण (इस) के पास कोई आयात नहीं होने पर कुछ भी नहीं उठाया जाएगा – JamesEggers

+0

मुझे कुछ दिक्कत करनी होगी। कार्यान्वयन सरल हैं जबकि मैं इसे काम करने की कोशिश करता हूं। बेस डायरेक्टरी वैध है, कक्षा में आयात है। फिर भी, थोड़ा और सिरदर्द और मैं अंत में वहां पहुंच जाऊंगा। – grenade

+0

क्या कोई बता सकता है कि एक स्थिर संपत्ति के लिए [आयात] का उपयोग करना क्यों संभव नहीं है? – Dave

उत्तर

1

असफल रहा क्या है? क्या कोई ऐसा आयात है जिसे आप संतुष्ट होने की उम्मीद करते हैं जो संतुष्ट नहीं है? क्या आप GetExports() को कॉल कर रहे हैं और यह असफल रहा है?

कैटलॉग बनने के बाद आप डिबगर में तोड़ सकते हैं, और समग्र सूची सूची पर माउस इसका निरीक्षण करने और इसमें कौन से हिस्से हैं। मेरा अनुमान है कि भागों शायद सूची में हैं, और समस्या आपके कोड में कहीं और है। एक संभावित कारण यह है कि आपके पास एक संग्रह आयात है जो [आयात] की बजाय [आयात] विशेषता का उपयोग कर रहा है, और/या आपके भागों को खारिज कर दिया जा रहा है क्योंकि उनके पास आयात है जो संतुष्ट नहीं हो सकते हैं।

0

मैं SoapBox Core Host में कंपोज़ विधि पर एक नज़र डालता हूं, तो आप निर्देशिका में सभी भागों को खोजने के लिए निर्देशिका निर्देशिका का उपयोग करके इसे देख सकते हैं। हालांकि, इस .NET 4 के खिलाफ संकलित किया गया है नहीं, बस MEF का पूर्वावलोकन रिलीज के खिलाफ:

private bool Compose() 
    { 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new DirectoryCatalog(".")); 

     _container = new CompositionContainer(catalog); 

     try 
     { 
      _container.ComposeParts(this); 
     } 
     catch (CompositionException compositionException) 
     { 
      MessageBox.Show(compositionException.ToString()); 
      return false; 
     } 
     return true; 
    } 
संबंधित मुद्दे