2009-07-06 18 views
25

मैं इस तरह पुस्तकालयों में लोड हो रहा है के लिए पूरी तरह से नया हूँ, लेकिन यहाँ है मैं कहाँ खड़े हैं:एक डीएलएल फ़ाइल लोड करें और कक्षा से एक्सेस विधियों को लोड करें?

मैं एक घर का बना DLL फ़ाइल के रूप में यह हो जाता है इसके बारे में के रूप में आसान है, वर्ग ही है और एक विधि है। इस पुस्तकालय को लोड करने वाले घरेलू कार्यक्रम में, मेरे पास है:

Assembly testDLL = Assembly.LoadFile("C:\\dll\\test.dll"); 

यहां से, मैं फंस गया हूं। जहां तक ​​मुझे पता है, यह इसे सही तरीके से लोड कर रहा है क्योंकि जब मैं नाम बदलता हूं तो यह मुझे त्रुटियां देता है।

मैं यहां से क्या करूँ? मैं कक्षा & विधियों को वास्तव में कैसे लोड करूं?

धन्यवाद।

+0

क्या कोई विशेष कारण है कि आपको इस डीएलएल को गतिशील रूप से लोड करने के लिए प्रतिबिंब का उपयोग करने की आवश्यकता है? यदि नहीं, तो लंच के जवाब का उपयोग करें। –

उत्तर

32

किसी विशेष प्रकार के लिए सभी प्रकार के संग्रह, या Assembly.GetType(name) का संग्रह प्राप्त करने के लिए Assembly.GetTypes() का उपयोग करें।

फिर आप Activator.CreateInstance(type) का उपयोग करके पैरामीटर रहित कन्स्ट्रक्टर के साथ प्रकार का उदाहरण बना सकते हैं या Type.GetConstructors का उपयोग करके कन्स्ट्रक्टर प्राप्त कर सकते हैं और उन्हें उदाहरण बनाने के लिए आमंत्रित कर सकते हैं।

इसी तरह आप Type.GetMethods() आदि के साथ तरीकों प्राप्त कर सकते हैं

मूल रूप से, एक बार आप एक प्रकार वहाँ चीजों का भार आप कर सकते हैं मिल गया है - अधिक जानकारी के लिए member list को देखो। यदि आप एक विशेष कार्य करने की कोशिश कर अटक जाते हैं (जेनेरिक मुश्किल हो सकता है) तो बस एक विशिष्ट प्रश्न पूछें, मुझे यकीन है कि हम मदद करने में सक्षम होंगे।

3

आप के लिए गतिशील लोड एक विधानसभा चाहते हैं और फिर वर्गों से विधियां प्रारंभ उसमें तो आप डायनामिक आह्वान के कुछ फार्म प्रदर्शन करने की जरूरत है।

उस पर मूल सलाह के लिए here देखें।

foreach (Type t in assemblyToScan.GetTypes()) 
     { 
      if(condition) 
       //do stuff 
     } 

और आप बस विधानसभा स्थिर (विधानसभा पर उपलब्ध होने से उपयोग करना चाहते हैं:

केवल बिट लापता प्रकार ही है, जो आसानी से इस तरह कोड wth पुनः प्राप्त किया जा सकता है पाने के लिए है संकलन समय), तो इस पृष्ठ पर उत्तर फॉम लॉन्सी जाने का रास्ता है।

11

इस प्रकार आप कक्षाओं को प्राप्त कर सकते हैं यदि आप इस प्रकार को जानते हैं।

Assembly assembly = Assembly.LoadFrom("C:\\dll\\test.dll"); 

// Load the object 
string fullTypeName = "MyNamespace.YourType"; 

YourType myType = assembly.CreateInstance(fullTypeName); 

पूर्ण प्रकार का नाम महत्वपूर्ण है। चूंकि आप .dll नहीं जोड़ रहे हैं, इसलिए आप इसका उपयोग नहीं कर सकते क्योंकि यह आपकी प्रोजेक्ट में नहीं है।

यदि आप चाहते हैं कि मैं सिर्फ जॉन स्कीट उत्तर दूंगा।

+1

क्षमा करें अगर मैं कब्र से तुम्हारा यह जवाब खोदता हूं। मैं सोच रहा हूं कि इंटरफेस को उसी तरह एक्सेस करना संभव है या नहीं। यही है, अगर डीएल में "MyNamespace.MyInterface" है, तो मैं इसे कैसे प्राप्त करूं? यानी, आपके उदाहरण में "योर टाइप" डीएल लोडर के लिए जाना जाता है। क्या होगा यदि यह नहीं है, लेकिन मैं इसे और नाम से इसकी विधियों को जानता हूं, यानी क्योंकि उन्हें कहीं दस्तावेज किया गया है? – manu3d

+0

@ manu3d हाँ आप कर सकते हैं। उसी तरह काम करता है, बस इंटरफ़ेस के साथ अपने प्रकार को प्रतिस्थापित करें। –

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