2011-07-31 15 views
5

से एक असेंबली लोड करें मैं एक असेंबली के रूप में एक डीएलएल फ़ाइल (Test.dll) लोड करना चाहता हूं। मैं प्रत्यक्ष दृश्य स्टूडियो संदर्भों (यानी मेरे सी # अनुप्रयोग के संदर्भ के रूप में डीएल लोड करना) के साथ-साथ Assembly.LoadFile(filename) विधि का उपयोग करके डीएल लोड करने के लिए ऐसा करने में सक्षम हूं। अब, मैं अपने डीएलएल फ़ाइल को एम्बेडेड संसाधन के रूप में अपने विजुअल स्टूडियो एप्लिकेशन में जोड़ना चाहता हूं, और डीएलएल फ़ाइल को असेंबली के रूप में लोड करना चाहता हूं। मुझे पता है कि इस संसाधन को बाइट सरणी के रूप में कैसे लोड किया जाए, क्या बाइट सरणी और असेंबली के बीच कुछ सहसंबंध है जिसका मैं उपयोग कर सकता हूं? इसके अलावा, मुझे डीएलएल फ़ाइल में स्थित एक विधि को कॉल करने में सक्षम होना चाहिए। नीचे दिया गया कोड देखें - यह आगे बताएगा कि मैं क्या कर रहा हूं।एम्बेडेड संसाधन

Assembly SampleAssembly = Assembly.LoadFrom("WindowsFormsApplication2.ThisisaTESTDLL.dll"); 
Type myType = SampleAssembly.GetTypes()[0]; 
MethodInfo Method = myType.GetMethod("myVoid"); 
object myInstance = Activator.CreateInstance(myType,null); 
Method.Invoke(myInstance,new object[] { "param1", "param1"}); 

यदि मुझे यहां कुछ याद आ रही है, तो कृपया मुझे सम्मान से बताएं और मैं मूल पोस्ट संपादित करूंगा।

उत्तर

5

Assembly.GetExecutingAssembly()। GetManifestResourceStream (...)

है कि आप एक स्ट्रीम वस्तु मिलना चाहिए। आप उस से एक बाइट सरणी पढ़ सकते हैं।

आप लोड कर सकते हैं कि मेरे exe में Assembly.Load

+0

मेरा मानना ​​है कि मैंने सवाल में कहा है, मैं पहले से ही बाइट सरणी में पढ़ने में सक्षम हूं, क्या इस बाइट सरणी से असेंबली को पढ़ने का कोई तरीका है? –

+0

हां। असेंबली का उपयोग करें। लोड (...) –

+0

यह वह जगह है जहां मैं अज्ञानी लग रहा हूं .... मैंने असेंबली के लिए प्रलेखन पढ़ा। लोड और "अधिभार" में से एक "बाइट []" कहता है। फिर, जब मैं "असेंबली.लोड" टाइप करता हूं तो वीएस पैरामीटर के रूप में "स्ट्रिंग" कहता है? क्या निर्दिष्ट करने का कोई तरीका है? –

1

मैं AxInterop.WMPLib.dll और Interop.WMPLib.dll एम्बेडेड का उपयोग कर और उन्हें निम्नलिखित कोड का उपयोग करके लोड कर ली। यह कोड प्रोग्राम.cs फ़ाइल में स्थिर शून्य मुख्य() की शुरुआत में ही रखा गया है। लक्ष्य ढांचा मेरे मामले में .NET 3.5 है। इस कोड ने मुझे इंस्टॉलरों के माध्यम से उन्हें तैनात किए बिना स्वयं को डीएलएस में बंडल करने में मदद की। मैंने अपने नाम कड़ी मेहनत की है। नीचे दिए गए कोड में "res" मेरे संसाधन "res.resx" का नाम है जिसमें दो एम्बेडेड डीएल शामिल हैं।

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler( 
(s, a) => 
{ 
    if (a.Name.Substring(0, a.Name.IndexOf(",")) == "AxInterop.WMPLib") 
    { 
     return Assembly.Load(res.AxInterop_WMPLib); 
    } 

    if (a.Name.Substring(0, a.Name.IndexOf(",")) == "Interop.WMPLib") 
    { 
     return Assembly.Load(res.Interop_WMPLib); 
    } 

    return null; 
} 

);

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