2012-08-08 18 views
6

पर कक्षा को डाला गया है, मैं कुछ .dll फ़ाइलों को गतिशील रूप से लोड करने का प्रयास कर रहा हूं। फ़ाइलें प्लगइन्स हैं (अब के लिए स्वयं लिखित) जिनमें कम से कम एक वर्ग है जो MyInterface लागू करता है। प्रत्येक फ़ाइल के लिए मैं कर रहा हूँ निम्नलिखित:सी # एक इंटरफेस सूची

Dictionary<MyInterface, bool> _myList; 

    // ...code 

    Assembly assembly = Assembly.LoadFrom(currentFile.FullName); 
    foreach (Type type in assembly.GetTypes()) 
    { 
     var myI = type.GetInterface("MyInterface"); 
     if(myI != null) 
     { 
      if ((myI.Name == "MyInterface") && !type.IsAbstract) 
      { 
       var p = Activator.CreateInstance(type); 
       _myList.Add((MyInterface)p, true); 
      } 
     } 
    } 

यह एक डाली अपवाद का कारण बनता है चल रहा है, लेकिन मैं एक समाधान नहीं मिल रहा। वैसे भी मैं सोच रहा हूं कि यह बिल्कुल क्यों काम नहीं करता है। मैं .NET Framework 3.5 में एक समाधान की तलाश में हूं।

एक और बात यह है कि मुझे क्या हुआ nullp में उपरोक्त कोड में _myList में एक नई प्रविष्टि जोड़ने से पहले बिंदु पर निम्नलिखित चलाने के बाद हो रही थी:

var p = type.InvokeMember(null, BindingFlags.CreateInstance, null, 
          null, null) as MyInterface; 

इस कोड को किया गया था पहला प्रयास लोड हो रहा है पर प्लगइन्स, मुझे नहीं पता था कि क्यों pnull था। मुझे उम्मीद है कि कोई मुझे सही तरीके से ले जा सकता है :)

+1

यह कोड काम नहीं कर रहा है, एक्स क्या है और आप इसे कहां रखते हैं? – devundef

+0

उपरोक्त आपके कोड स्निपेट में, "x" है "if (x! = Null)" वास्तव में "myI" होना चाहिए? –

+0

आपको यह भी सत्यापित करना चाहिए कि इस प्रकार का डिफॉल्ट कन्स्ट्रक्टर है, क्योंकि आपका कोड यह मानता है। –

उत्तर

4

आप वास्तव में जॉन स्कीट जो व्यवहार आप देख सकते हैं और कैसे प्लग में व्यवस्थाएं ठीक से करने के लिए बताते हैं द्वारा Plug-ins and cast exceptions पढ़ना चाहिए।

+0

मैं इससे क्या निकाल सकता था यह था कि प्लगइन की असेंबली मेरे आवेदन की असेंबली के समान नहीं है। – Phil

+0

मेरी इच्छा है कि अधिक लोग इसे वोट देंगे, क्योंकि मुझे लगता है कि शायद ओपी का मुद्दा है। असल में, यदि आप इस बारे में सी ++, और इंटरफ़ेस परिभाषा जैसे .h फ़ाइल की तरह सोचते हैं, तो आप इस त्रुटि में भाग लेंगे। यदि आप इसे "प्रबंधित प्रकारों" तरीके से सोचते हैं तो आप देखेंगे कि दो इंटरफ़ेस हैं, प्रति फ़ाइल एक, अगर इसे संकलित किया जा रहा है (गलत) जिस तरह से लिंक कहता है कि यह हो सकता है। –

5

यह जांचने का एक आसान तरीका है कि आपका प्रकार आपके इंटरफ़ेस पर जाया जा सकता है या नहीं।

Assembly assembly = Assembly.LoadFrom(currentFile.FullName); 
foreach (Type type in assembly.GetTypes()) 
{ 
    if(!typeof(MyInterface).IsAssignableFrom(type)) 
     continue; 

    var p = Activator.CreateInstance(type); 
    _myList.Add((MyInterface)p, true); 
} 

तो IsAssignableFrom गलत है, वहाँ कुछ अपने विरासत है, जो आपके त्रुटियों का सबसे संभावित कारण है साथ कुछ गड़बड़ है।

+0

अच्छी तरह से यह 'झूठा' है। हालांकि मेरे पास अभी केवल एक सदस्य है और वास्तव में यह नहीं पता कि विरासत के साथ क्या गलत हो सकता है। – Phil

+0

क्या आपकी "प्लगइन" असेंबली असेंबली को संदर्भित करती है जहां इंटरफ़ेस परिभाषित किया जाता है? क्या आपका चल रहा कोड (नमूना में कोड) संदर्भ * समान * असेंबली? –

1

कृपया निम्नलिखित कोड देखें। मुझे लगता है कि Type.IsAssignableFrom(Type type) इस स्थिति में आपकी मदद कर सकते हैं।

Assembly assembly = Assembly.LoadFrom(currentFile.FullName); 
///Get all the types defined in selected file 
Type[] types = assembly.GetTypes(); 

///check if we have a compatible type defined in chosen file? 
Type compatibleType = types.SingleOrDefault(x => typeof(MyInterface).IsAssignableFrom(x)); 

if (compatibleType != null) 
{ 
    ///if the compatible type exists then we can proceed and create an instance of a platform 
    found = true; 
    //create an instance here 
    MyInterface obj = (ALPlatform)AreateInstance(compatibleType); 

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