2010-10-17 16 views
5

मैंने अभी एमईएफ का उपयोग करना शुरू कर दिया है और प्रारंभिक समस्या पर हिट किया है।MEF 'निर्यात टाइप करने के लिए असाइन करने योग्य नहीं है' त्रुटि

मैं एक अंतरफलक DataService कहा जाता है:

namespace DataAccess 
{ 
    interface IDataService 
    { 
    string Name { get; } 
    string Description { get;} 

    List<String> GetPeople(); 
    } 
} 

इस इंटरफेस के 2 कार्यान्वयन, एसक्यूएल सर्वर के लिए एक और Oracle के लिए एक कर रहे हैं। नीचे ओरेकल कार्यान्वयन है, SQL सर्वर कार्यान्वयन बिल्कुल वही है।

namespace DataAccess 
{ 
[Export(typeof(IDataService))] 
[ExportMetadata("Name","Oracle")] 
[ExportMetadata("Description","Oracle Data Service")] 
public class Oracle : IDataService 
{ 

    #region IDataService Members 

    public string Name 
    { 
     get { return "Oracle"; } 
    } 

    public string Description 
    { 
     get { return "Provides data access to Oracle database"; } 
    } 

    public List<string> GetPeople() 
    { 
     return new List<String>() { "Oracle boo", "Oracle boo1" }; 
    } 

    #endregion 
} 
} 

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

रचना एक भी रचना त्रुटि का उत्पादन:

private static CompositionContainer _container; 
    private const string ASSEMBLY_PATTERN = "*.dll"; 
    private AggregateCatalog _catalog; 

    [ImportMany] 
    IEnumerable<DataAccess.IDataService> services { get; set; } 

    private void button3_Click(object sender, EventArgs e) 
    { 


     _catalog = new AggregateCatalog(
      new DirectoryCatalog(txtLibPath.Text, ASSEMBLY_PATTERN), 
      new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
     _container = new CompositionContainer(_catalog); 
     _container.ComposeParts(this); 
     MessageBox.Show(services.Count().ToString()); 
    } 

यह त्रुटि है कि उत्पादन किया जाता है:

इस कोड मैं विधानसभाओं की खोज के लिए उपयोग कर रहा हूँ है। मूल कारण नीचे प्रदान किया गया है। अधिक विस्तृत जानकारी के लिए CompositionException.Errors प्रॉपर्टी की समीक्षा करें।

1) निर्यात 'DataAccess.Oracle (ContractName = "DataAccess.IDataService")' DataAccess.IDataService 'टाइप करने के लिए असाइन नहीं किया जा सकता है।

परिणामस्वरूप: 'MEFTest.Form1' पर आयात 'MEFTest.Form1.services (ContractName = "DataAccess.IDataService") आयात नहीं कर सकता। तत्व: MEFTest.Form1.services (ContractName = "DataAccess.IDataService") -> MEFTest.Form1

यह कोई मतलब है कि यह इंटरफ़ेस है कि यह के लिए डिजाइन किया गया था करने के लिए असाइन नहीं कर सकते बनाने के लिए प्रतीत नहीं होता !

एक बार इस समस्या को हल किया जाता है, मेरे अगले अंक कैसे एक चुनना है और इसे का एक उदाहरण पाने के लिए ...

उत्तर

6

यह अपने अनुबंध विधानसभा (DataAccess.IDataService के साथ) के दो विभिन्न संस्करणों की तरह लग रहा है कर रहे हैं लोड हो रहा है। एक शायद आपके निष्पादन योग्य पथ से और दूसरा आपके प्लगइन पथ से है। मैं इस मुद्दे पर How to Debug and Diagnose MEF Failures पर अपने ब्लॉग पोस्ट में थोड़ा सा स्पर्श करता हूं, और Best Practices for Assembly Loading पर एमएसडीएन पृष्ठ अधिक जानकारी में जाता है।

+0

आप सही डैनियल थे, मैंने SQLServer और Oracle प्लगइन वाली परियोजनाओं के लिए IDataService को फिर से संकलित किया था, लेकिन मुख्य ऐप में पुराने संस्करण का संदर्भ दे रहा था। मैंने आईडीटा सेवा को एक अलग वर्ग पुस्तकालय परियोजना में स्थानांतरित कर दिया और संदर्भित किया कि सभी तीन परियोजनाओं और सभी कार्यों से पूरी तरह से काम करता है। बहुत बहुत धन्यवाद। – hermiod

+0

यह काफी कठिन समस्या है। यह केवल आपके exe प्रोजेक्ट की जांच करने के लिए पर्याप्त नहीं है बल्कि यह सभी सैटेलाइट असेंबली की परियोजनाओं को भी लोड करता है। मेरे मामले में 50+ अन्य उपग्रह असेंबली की परियोजनाओं को लोड किया गया था और मुझे मुश्किल समय ट्रैकिंग थी, जो इस डुप्लिकेट लोडिंग का कारण बनता है। यदि डैनियल द्वारा शानदार संकेत नहीं है, तो मुझे नहीं पता कि मैं इसे हल करने में कितना समय व्यतीत कर सकता हूं। –

0

मेरे लिए यह एक बहुत ही सरल तय था।

यहां a link है! जो मूल कारण बताता है।

मेरे मामले में, मैंने अपना असेंबली संस्करण बंद कर दिया, लेकिन मेरा फ़ाइल संस्करण यात्रा करता है। मेरा nuget पैकेज आईडी मेरे असेंबली फ़ाइल संस्करण से मेल खाता है।

अंतिम परिणाम यह है कि मैं लगातार निर्माण कर सकता हूं, नए न्यूजेट्स बना सकता हूं, और यह एमईएफ इंटीफेस समस्या नहीं है।

0

मुझे यह बताना होगा कि मुझे पूरी तरह से बेवकूफ संदर्भ में ऐसी त्रुटि थी। गलती से, मैं निर्यात के निर्देश गलत और वर्ग के अंदर वर्ग पर लेकिन एक समारोह पर यह नहीं डाल:

interface MyInterface 
{ 
    void MyFunction(); 
} 

public class MyClass : MyInterface 
{ 
    [Export(typeof(MyInterface))] 
    void MyFunction() { } 
} 

हैरानी की बात है, कोड किसी भी चेतावनी के बिना बहुत ठीक संकलित। लेकिन फिर मैंने यह पता लगाने की कोशिश कर घंटों बिताए कि क्यों एमईएफ मेरे मूर्खतापूर्ण गलत छाप पर विफल रहता है!

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