2012-02-10 6 views
9

मेरे पास >>System.Data.SQLite.dllएम्बेड संसाधन से डीएलएल लोड का उपयोग कैसे करें? एक DLL

> एक इसे सामान्य तरीके से उपयोग करने के लिए सिर्फ संदर्भ के रूप में जोड़ सकते हैं और

using System.Data.SQLite; 
तो

, मैं सभी कार्यों का उपयोग कर सकते हैं इस डीएलएल के अंदर।

लेकिन, मैं अपने app.exe और एक एकल फाइल में इस DLL मर्ज करना चाहते हैं। मैं ILmerge उपयोग करने की कोशिश की है, लेकिन असफल। जैसा कि मुझे पता है, ILmerge अप्रबंधित DLL को विलय नहीं कर सकता है।

तो, मैं एक और तरीका> embbed संसाधन के रूप में DLL बनाने की कोशिश की। मैं नीचे दिए गए कोड के साथ एक विधानसभा के रूप में यह लोड करने में सक्षम हूँ:

Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyApp.System.Data.SQLite.dll"); 
byte[] ba = null; 
byte[] buffer = new byte[16 * 1024]; 
using (MemoryStream ms = new MemoryStream()) 
{ 
    int read; 
    while ((read = stm.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     ms.Write(buffer, 0, read); 
    } 
    ba = ms.ToArray(); 
} 
Assembly sSQLiteDLL = Assembly.Load(ba); 

लेकिन, मैं कैसे SQLiteDLL में फ़ंक्शन का उपयोग करने के लिए जा रहा हूँ?

public Form1() 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
    InitializeComponent(); 
} 

System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    AppDomain domain = (AppDomain)sender; 
    if (args.Name.Contains("System_Data_SQLite")) 
    { 
     return domain.Load(MyApp.Properties.Resources.System_Data_SQLite); 
    } 
    return null; 
} 

ऊपर बताया गया है मैं अब तक क्या मिल गया है और मैं उपयोग करने के लिए आगे क्या करना है पता नहीं है:

मैं भी इस तरह के गुणों में संसाधन के रूप में DLL जोड़ सकते हैं और लोड इसे करने की कोशिश DLL? मैं अभी भी डीएलएल के अंदर कार्यों का उपयोग नहीं कर सकता।

उदाहरण के लिए

, जब मैं टाइप करें:

SQLiteCommand cmd = new SQLiteCommand(); 

दृश्य स्टूडियो का कहना है:

त्रुटि 21 प्रकार या नाम स्थान का नाम 'SQLiteCommand' नहीं पाया जा सका (यदि आप एक निर्देश का उपयोग याद कर रहे हैं या एक विधानसभा संदर्भ?)

आप अपनी अंतर्दृष्टि साझा कर सकते हैं? धन्यवाद।

+2

आपको इसे प्राप्त करने के लिए ऊपर की विधियों को गठबंधन करने में सक्षम होना चाहिए। यह आवश्यक है कि SQLite असेंबली को संदर्भ के रूप में जोड़ा गया हो, अन्यथा वीएस नहीं जानता कि इसके साथ क्या किया जाए। मुझे यकीन नहीं है कि यह आपकी मूल डीएलएल समस्या को हल करता है। आपको अभी भी रनटाइम पर भौतिक फ़ाइल के रूप में इसकी आवश्यकता होगी। –

+0

आपने एक बहुत ही समान प्रश्न पूछा और कुछ लिंक सहित कई जवाब प्राप्त किए। - क्या आपने इन उत्तरों/लिंक की जांच की? – Yahia

+0

@ याहिया: अध्ययन ... कुछ समय लगेगा। मैंने SmartAssembly कोशिश की है और हाँ यह सफलता है। ** ILmerge ** का उपयोग करने में विफल। शायद कुछ पैरामीटर मिसआउट। ** ILmerge ** के लिए, मैंने उपयोग किए गए पैरामीटर हैं: 'ilmerge /out:MyApp2.exe MyApp.exe System.Data.SQLite.dll' एक त्रुटि उत्पन्न होती है, इसका कहना है कि असेंबली ** System.Data.SQLite.dll ** केवल प्रबंधित कोड युक्त के रूप में चिह्नित नहीं है। अब मैं कोड के भीतर डीएलएल मैन्युअल रूप से मर्ज करने का प्रयास करूंगा। अगर सफलता हो तो मैं आपको बता दूंगा। और हे, आपकी मदद के लिए धन्यवाद। वास्तव में सराहना की। – alont

उत्तर

4

आप एक विधानसभा एम्बेड और एक ही समय में इसे संदर्भ (वी.एस. में) ... जिस तरह से आप इसे उपयोग करने के लिए आप इसे संदर्भ की जरूरत चाहते हैं के लिए कर सकते हैं! किसी भी कारण से आप विधानसभा का संदर्भ नहीं देते हैं?

संदर्भित यह थोड़ा मुश्किल है बिना एक एम्बेडेड विधानसभा (प्रबंधित) से एक प्रकार का उपयोग करना है, लेकिन संभव प्रतिबिंब का उपयोग कर आदि - इन कड़ियों को देखने के (वे संदर्भ सामग्री और कुछ नमूना कोड आदि शामिल हैं):

प्रबंधित डीएलएल एम्बेड करने पर आपके पास कई विकल्प हैं:

  • उपयोग ILMerge (मुक्त)
    howto के लिए देखें here और here

या

  • SmartAssembly (वाणिज्यिक)
    एम्बेड और अन्य बातों के अलावा विलय कर सकते हैं जैसे कुछ उपकरण का उपयोग (आपके स्रोत कोड को बदलने की कोई आवश्यकता नहीं है)

या

  • code that yourself in less than 10 lines (मुक्त लेकिन कम से कम स्रोत कोड परिवर्तन)
    चिह्न के रूप में "एम्बेडेड संसाधन" सभी आवश्यक निर्भरता - इस तरह से वे EXE फ़ाइल में शामिल कर रहे हैं ... आप सेटअप एक AssemblyResolve हैंडलर की जरूरत है जो रनटाइम पर संसाधनों से पढ़ता है और आवश्यक डीएलएल को .NET रनटाइम पर लौटाता है ...
+1

हाय, याहिया, कुछ परियोजनाओं में कुछ सफलता के बाद। मैंने इसके लिए एक ट्यूटोरियल लिखने का फैसला किया है। और पढ़ें: [लिंक] (http://www.codeproject.com/Articles/528178/Load-DLL-From- एम्बेडेड- संसाधन) – alont

+0

@ बहुत अच्छा नहीं :-) – Yahia

+0

आपको बहुत बहुत धन्यवाद। {हाथ मिलाना} :) – alont

0

यह AppDomain में लोड विधानसभाओं उपयोग करने के लिए एक विधि नहीं है। कृपया यह लेख पढ़ें: How to: Load Assemblies into an Application Domain

संक्षेप में

आप GetMethod बुलाना चाहिए() के साथ विधि नाम (उदाहरण के लिए SqlCommand) और फिर .Invoke के माध्यम से इसे कहते() विधि।

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