मैंने अभी एमईएफ का उपयोग करना शुरू कर दिया है और प्रारंभिक समस्या पर हिट किया है।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
यह कोई मतलब है कि यह इंटरफ़ेस है कि यह के लिए डिजाइन किया गया था करने के लिए असाइन नहीं कर सकते बनाने के लिए प्रतीत नहीं होता !
एक बार इस समस्या को हल किया जाता है, मेरे अगले अंक कैसे एक चुनना है और इसे का एक उदाहरण पाने के लिए ...
आप सही डैनियल थे, मैंने SQLServer और Oracle प्लगइन वाली परियोजनाओं के लिए IDataService को फिर से संकलित किया था, लेकिन मुख्य ऐप में पुराने संस्करण का संदर्भ दे रहा था। मैंने आईडीटा सेवा को एक अलग वर्ग पुस्तकालय परियोजना में स्थानांतरित कर दिया और संदर्भित किया कि सभी तीन परियोजनाओं और सभी कार्यों से पूरी तरह से काम करता है। बहुत बहुत धन्यवाद। – hermiod
यह काफी कठिन समस्या है। यह केवल आपके exe प्रोजेक्ट की जांच करने के लिए पर्याप्त नहीं है बल्कि यह सभी सैटेलाइट असेंबली की परियोजनाओं को भी लोड करता है। मेरे मामले में 50+ अन्य उपग्रह असेंबली की परियोजनाओं को लोड किया गया था और मुझे मुश्किल समय ट्रैकिंग थी, जो इस डुप्लिकेट लोडिंग का कारण बनता है। यदि डैनियल द्वारा शानदार संकेत नहीं है, तो मुझे नहीं पता कि मैं इसे हल करने में कितना समय व्यतीत कर सकता हूं। –