2013-08-10 6 views
10

मैं वीबीनेट में एक प्रोग्राम विकसित कर रहा हूं, और System.Data.SQLite .NET के लिए प्रीकंपिल्ड बाइनरी का उपयोग कर रहा हूं, हालांकि यह x64 आर्किटेक्चर के लिए काम नहीं कर रहा है, और मुझे क्लासिक संस्कृति समस्या मिल रही है और सही लोड नहीं हो रहा है फ़ाइल।x86/x64 आर्किटेक्चर के लिए SQLite dll

System.BadImageFormatException: 
Could not load file or assembly 'System.Data.SQLite, Version=1.0.65.0, Culture=neutral, 
PublicKeyToken=db937bc2d44ff139' or one of its dependencies. An attempt was made to load a program with an incorrect format. 
File name: 'System.Data.SQLite, 
Version=1.0.65.0, 
Culture=neutral, 
PublicKeyToken=db937bc2d44ff139' 

वहाँ केवल एक dll, हो सकता है का उपयोग करने के एक रास्ता है:

  1. तरह #ifdef वरना 64 कोड (x86 कोड के कुछ हिस्से शामिल हैं) कुछ निर्देशों जोड़े
  2. DLLs शामिल हों केवल एक बनाने के लिए। के रूप में मैं केवल एक संकलन, x32 के लिए नहीं एक और 64 के लिए अन्य करना चाहते हैं
  3. संदर्भ VB.net

में इस dll क्या आपको लगता है, दूसरे को बेहतर आइडिया है।

उदाहरण के लिए (32 बिट):

Private Shared Sub OpenConection(ByRef Conn As SQLite.SQLiteConnection) 
    Conn = New SQLite.SQLiteConnection("Data Source=" & System.Environment.CurrentDirectory & "\database.db") 
    Conn.Open() 
End Sub 

Private Shared Sub CloseConection(ByRef Conn As SQLite.SQLiteConnection) 
    Conn.Close() 
    Conn.Dispose() 
    Conn = Nothing 
End Sub 

Public Shared Function ReturnSelect(ByVal DataTAbleName As String, ByVal sQuery As String, ByVal sWhere As String) As Data.DataTable 
    Dim lDT As New DataTable 
    Dim lTA As New SQLite.SQLiteDataAdapter 
    If DataTAbleName Is Nothing Then Return New DataTable(DataTAbleName) 
    Try 
     OpenConection(conexion) 
     lTA = New SQLite.SQLiteDataAdapter("SELECT " & sQuery & " FROM " & DataTAbleName & IIf(sWhere <> String.Empty, " WHERE ", "") & sWhere, conexion) 
     lTA.Fill(lDT) 
    Catch ex As Exception 
     Throw ex 
    Finally 
     CloseConection(conexion) 
     lTA.Dispose() 
     lTA = Nothing 
    End Try 
    Return lDT 
End Function 

कैसे है कि 64 बिट वास्तुकला पर काम करने के लिए बदलने के लिए? शायद सहित दोनों 32 और 64 dll के और कार्यों में तरह

Try 
    Instance = Me 
    'Check If Homidom Run in 32 or 64 bits 
    If IntPtr.Size = 8 Then _OsPlatForm = "64" Else _OsPlatForm = "32" 
    'continue code 

Catch ex As Exception 
    ' ex.Message 
End Try 

उत्तर

20

.NET असेंबली से SQLite का उपयोग करने के लिए कई विकल्प हैं। आपका पहला कदम प्राचीन 1.0.65 संस्करण से कुछ नया स्थानांतरित करना है। वर्तमान संस्करण यहां से डाउनलोड किए जा सकते हैं: http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki या SQLite NuGet packages के माध्यम से।

आप अंतर्गत चलाने के लिए सक्षम होने के लिए की जरूरत है 32-बिट और 64-बिट, एक ही विकल्प देशी पुस्तकालय प्री-लोडिंग विकल्प है, जहां आप अलग निर्देशिका में देशी बाइनरी वितरित उपयोग करने के लिए है, इसलिए है कि यह इस तरह दिखता है:

  • \ App.exe (वैकल्पिक, प्रबंधित-केवल आवेदन निष्पादन योग्य विधानसभा)
  • \ App.dll (वैकल्पिक, केवल प्रबंधित आवेदन पुस्तकालय विधानसभा)
  • \ System.Data.SQLite .dll (आवश्यक, प्रबंधित-केवल कोर असेंबली)
  • \ System.Data.SQLite.Linq.dll (वैकल्पिक, प्रबंधित-केवल LINQ विधानसभा)
  • \ 86 \ SQLite.Interop.dll (अपेक्षित, 86 देशी इंटरॉप विधानसभा)
  • \ 64 \ SQLite.Interop।dll (अपेक्षित, 64 देशी इंटरॉप विधानसभा)

एक अन्य विकल्प अपने अनुप्रयोग के दो संस्करणों का निर्माण करने की है, और प्रत्येक संस्करण में आप उचित मिश्रित मोड विधानसभा के संदर्भ हैं। फिर आप दो संस्करणों के साथ समाप्त हो जाएंगे, लेकिन इससे निपटने के लिए वे थोड़ा आसान हैं क्योंकि आपको अतिरिक्त उपनिर्देशिका और मूल * .terter.dlls की आवश्यकता नहीं है।

इन मामलों में आपको 32-बिट और 64-बिट के बीच कोई कोड अंतर या वैकल्पिक संकलन की आवश्यकता नहीं होगी। विभिन्न NuGet पैकेजों से स्थापित करने से शायद आप आसानी से शुरू हो जाएंगे।

अंतिम विकल्प सी-एसक्यूलाइट नामक प्रबंधित-केवल क्लोन के लिए जाना है: https://code.google.com/p/csharp-sqlite/। यह प्रबंधित सी # के लिए SQLite इंजन का एक बंदरगाह है, इसलिए पूरी चीज एसीसीपीयू के रूप में चलती है और सीधा कोई मुद्दा नहीं है।

+0

नोट, मुझे .NET लक्ष्य के लिए बाइनरी ज़िप फ़ाइल में इंटरऑप डीएलएल ढूंढना था, जिस पर मैं काम कर रहा हूं। –

1

कुछ नहीं वहाँ एक नहीं है।

ऐसा इसलिए है क्योंकि ये * .dll देशी c/C++ * .dll के लिए केवल रैपर हैं। और 32 बिट, .NET अनुप्रयोग को 32 बिट सी/सी ++ डीएल और 64 बिट का उपयोग करना है, .NET अनुप्रयोग को 64 बिट सी/सी ++ डीएलएल का उपयोग करना होगा।

मैंने लंबे समय तक vb.net का उपयोग नहीं किया है, मुझे यकीन नहीं है कि आप लक्ष्य प्लेटफॉर्म को कॉन्फ़िगर कर सकते हैं जैसे आप सी # में कर सकते हैं। यदि आप कर सकते हैं, तो आपको ऐसा करना चाहिए और सही इंटरऑप डीएल लेना चाहिए। और आपको यह तय करना चाहिए कि आपको 32 बिट या 64 बिट की आवश्यकता है या नहीं।

+0

तो क्या मुझे दो बार संकलित करने की आवश्यकता है, 32 के लिए एक और 64 के लिए अन्य? – cMinor

+0

हां, यदि आप 32 और 64 बिट संस्करण प्रदान करना चाहते हैं। क्योंकि यदि आप "किसी भी सीपीयू" को लक्षित करते हैं तो यह लक्ष्य संस्करण (64 या 32 लक्ष्य विंडो पर निर्भर करता है) पर संकलित होगा। आपको अपना लक्ष्य x86 (32 बिट) या x64 (64 बिट) पर सेट करना होगा। – user743414

6

मैं कुछ साल पहले एक ही समस्या थी और मेरे लिए सबसे अच्छा समाधान है:

  • डाउनलोड पुस्तकालय
  • अपने बिन पथ में केवल System.Data.SQLite.dll और अंततः System.Data.SQLite.Linq.dll
  • डाल डाल के latest versionc:\Windows\SysWOW64
  • में 86 SQLite.Interop.dll पुस्तकालय c:\Windows\System32
  • में 64 SQLite.Interop.dll पुस्तकालय डाल 210
  • Any CPU बिना रनटाइम के दौरान केवल System.Data.SQLite (अपने बिन पथ में dll)

का आनंद इस तरह से नेट ढांचे स्वचालित रूप से सही (x86 x64 बनाम) लोड होगा पुस्तकालय संदर्भित के रूप में अपनी परियोजना के संकलन जीएसी या इसी तरह से कुछ भी पंजीकृत करना।

उम्मीद है कि इससे मदद मिलती है।

+1

कौन सी System.Data.SQLite.dll मुझे बिन फ़ोल्डर, x32 या x64 उपलब्ध डीएलएस पर जोड़ना चाहिए?मैंने x32 और x64 दोनों डाउनलोड किए हैं और प्रत्येक संस्करण में System.Data.SQLite.dll है और उनका आकार अलग है .... – cMinor

+0

एमएम उनके पास एक ही आकार होना चाहिए, आपने कौन से संस्करण डाउनलोड किए हैं? –

+0

मैंने .NET 2 बाइनरी डाउनलोड की, क्योंकि मेरा एप्लिकेशन> .NET 2. का उपयोग नहीं कर सकता है। क्या मैं कुछ गलत कर रहा हूं? – cMinor

1

@Govert और @TobiaZambon द्वारा अन्य उत्तरों यहां जाने का सही तरीका हैं। लेकिन किसी और के लिए पढ़ने के लिए, दूसरा विकल्प System.Data.Sqlite dll के x86 संस्करण का उपयोग करना है और केवल x86 प्लेटफ़ॉर्म के लिए अपना एप्लिकेशन संकलित करना है। यानी किसी भी सीसीपीयू को संकलित न करें, जिसका अर्थ यह है कि जब यह x64 मशीन विंडोज़ पर चलता है तो इसे 32-बिट मोड में चलाएगा और यह 32-बिट डीएल लोड करने में सक्षम होगा।

चाहे यह उपयोगी हो, आपकी स्थिति पर निर्भर करेगा, लेकिन यदि आप वर्कस्टेशन पर तैनात एक ऐप बना रहे हैं तो यह काफी आसान समाधान है।

1

सवाल का कला के राज्य आसानी से Nuget के बाद इसे स्थापित का उपयोग कर हल किया जा सकता, खोज SQLite की तरह:

PM> Install-Package System.Data.SQLite 

मैंने यह किया है एक नया कंप्यूटर और वी.एस. का उपयोग कर, मैं SQLite की जरूरत है और किया यह और सब कुछ ठीक काम किया।

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