2011-07-07 19 views
5

मैं सी # में एक एकल निष्पादन योग्य एप्लिकेशन बनाने की कोशिश कर रहा हूं, जिसमें SQLite शामिल है। System.Data.SQLite एक अप्रबंधित DLL (SQLite.Interop.dll) पर निर्भर करता है, इसलिए मैं इसे ILMerge से विलय नहीं कर सकता।मैं System.Data.SQLite को एक एकल निष्पादन योग्य प्रोग्राम में कैसे विलय कर सकता हूं?

मैं अपने प्रोजेक्ट में System.Data.SQLite को कैसे बंडल कर सकता हूं ताकि मैं एकल-निष्पादन योग्य एप्लिकेशन का उत्पादन कर सकूं जिसमें डीएलएल के साथ कोई टैग नहीं है?

+0

तरह क्यों आप अपने आवेदन के लिए एक स्थापना फ़ाइल नहीं बनाते हैं? – Serghei

+0

आप नहीं कर सकते। जैसा कि आपने कहा था, यह एक अप्रबंधित डीएल पर निर्भर करता है। अप्रबंधित डीएलएस को एक निष्पादन योग्य में विलय नहीं किया जा सकता है। –

+1

@ सर्गी सिस्टम के चारों ओर एक इंस्टॉलर स्पू डीएलएल होने से यह आपके कोड को बग-फ्री बनाता है। एक निष्पादन योग्य के साथ, यदि उपयोगकर्ता इसे बदल देता है तो आप जानते हैं कि उनके पास नवीनतम संस्करण है। कोई चिंता नहीं है कि इंस्टॉलर में सभी सही डीएलएल शामिल हैं और क्या यह सब उन्हें बदल दिया है या नहीं। साथ ही, मुझे लगता है कि यह एक छोटा सा उपयोगकर्ता अनुभव है जो मेरे छोटे आवेदन को चलाने के लिए विज़ार्ड से गुजरना नहीं है। – spiffytech

उत्तर

4

आप डीएल को निष्पादन योग्य में एम्बेडेड संसाधन के रूप में शामिल कर सकते हैं, फिर रनटाइम पर इसे निकालें (यह मानता है कि प्रोग्राम को डीएलएल निकालने वाली किसी भी निर्देशिका को लिखने की अनुमति है)।

string sqllitefile = "sqllite.dll"; 
Assembly currentAssembly = Assembly.GetExecutingAssembly(); 

using (FileStream fs = fileInfoOutputFile.OpenWrite()) 
using (Stream resourceStream =currentAssembly.GetManifestResourceStream(sqllitefile)) 
{ 
    const int size = 4096; 
    byte[] bytes = new byte[4096]; 
    int numBytes; 
    while ((numBytes = resourceStream.Read(bytes, 0, size)) > 0) 
    { 
     fs.Write(bytes, 0, numBytes); 
    } 
    fs.Flush(); 
    fs.Close(); 
    resourceStream.Close(); 
} 
+0

मेमोरी स्ट्रीम से असेंबली लोड करना भी संभव है। तो आपको इसे डिस्क पर लिखना नहीं है। – bitbonk

+2

@bitbonk - यह किसी तृतीय-पक्ष प्रबंधित असेंबली के साथ कैसे काम करेगा जिसे अप्रबंधित असेंबली का संदर्भ देने की आवश्यकता है (जैसा कि सवाल के बारे में बात कर रहा है)? यदि वह प्रबंधित असेंबली स्मृति से इसे पढ़ने के लिए सेट नहीं है, तो यह इसका उपयोग करने में सक्षम नहीं होगी। –

+0

हां, आप सही हैं, जैसे ही एक असंगत डीएलएल शामिल है, यह दृष्टिकोण काम नहीं करता है। – bitbonk

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