【轉】關於在.Net開發中使用Sqlite的版本選擇問題

若是一個.NET應用要自適應32位/64位系統,只須要在項目的「目標平臺」設置爲「Any CPU」。可是若是應用中使用了SQLite,狀況就不一樣了。sql

 

  SQLite的.NET開發包來自是System.Data.SQLite,完成兼容ADO.NET接口,也提供了Linq和Entity Framework 6實現。但這不重要,重要的是System.Data.SQLite是由兩部分代碼組成的,一部分是非託管的C++代碼實現,一部分是託管代碼與.NET框架接口。因爲非託管代碼不能構建成「Any CPU」的,因此System.Data.SQLite的下載頁面的每一個包都是按32位或64位系統進行了區分的。數據庫

 

  說到這裏,順便說一下,看着System.Data.SQLite的下載頁面就頭暈。雖然在下載頁面一開始就花了大量的篇幅來講明如何選擇下載,可是估計沒幾我的會把它看完,因此這裏仍是簡單介紹一下。框架

 


  1) 首先是按類型分爲安裝包、非靜態鏈接的二進制包和靜態鏈接的二進制包。安裝包會安裝相關的動態庫到系統內,並註冊到GAC(Global Assembly Cache);兩種二進制包的區別在於非託管部分的鏈接方式不一樣,非靜態鏈接的二進制包在使用時須要VC運行時庫的支持。須要注意的是:若是須要在Visual Studio中鏈接SQLite數據庫,就必須選擇合適的安裝包進行安裝spa

 

  好比,要在Visual Studio 2010中鏈接SQLite,應該下載「sqlite-netFx40-setup-bundle-x86-2010-1.0.90.0.exe」,這在下載包的說明中有明確黑體字說明。sqlite

wKioL1L2-2mij_P_AAJV6pRtu7c170.jpg
[下載包的說明中有明確的黑體字說明]blog

 

  安裝以後就能夠在Visual Studio 2010中鏈接SQLite了:接口

wKiom1L2-eqwJv4jAAE2HS7eYKM589.jpg
[在Visual Studio中鏈接SQLite]ip

 

  2) 每一個類型都按.NET版本分紅了若干小組,目前從.NET 2.0 SP2到.NET 4.5.1,一共支持5個版本的.NET Framework。每一個.NET版本又分爲32位和64位兩組。選用32位仍是64位是根據使用系統來決定的。好比開發的時候是64位系統而發佈後運行在32位系統上,就須要在開發時使用64位System.Data.SQLite.dll,而在發佈時用32位的System.Data.SQLite.dll替換(看起來很麻煩的樣子~~請看後面的解決辦法~~)。ci

 

  3) 在每一個.NET版本分組中都有2個文件包,一個帶有「bundle」字樣,另外一個沒有。其中帶有「bundle」字樣的表示動態庫是按混合模式編譯的,在使用的時候只須要System.Data.SQLite.dll就能夠了,而不帶「bundle」的則是將非託管部分和託管部分分別編譯,System.Data.SQLite.dll不能獨立使用,還須要有SQLite.Interop.dll才能使用資源


 

  言歸正傳,若是要使用「Any CPU」的System.Data.SQLite.dll,就必須使用不帶「bundle」字樣,即非混合編譯的二進制包

 

  非混合編譯的二進制包有System.Data.SQLite.dll和SQLite.Interop.dll兩個動態庫。按官方說明,SQLite.Interop.dll是能夠放與System.Data.SQLite.dll相同的目錄下,也能夠放在x86或x64子目錄下,由System.Data.SQLite.dll根據系統類型調用。爲了確認,下載以下兩個包來進行比較:

sqlite-netFx40-binary-Win32-2010-1.0.90.0.zip

sqlite-netFx40-binary-x64-2010-1.0.90.0.zip

  結果發現只有SQLite.Interop.*不一樣,其它文件都徹底相同

wKiom1L3AN-yjXWaAAdjyVYpUAk800.jpg
[比較結果:只有SQLite.Interop.*不一樣]

 

  而後將兩個包的SQLite.Interop.*分別放在x86和x64子目錄下,合併成一個包。再在不一樣類型的系統下運行test.exe,結果都是徹底經過

wKioL1L3AWWiY0tNAAUO5xpmciI727.jpg

 

  最後須要作的就是在Visual Studio項目中引用System.Data.SQLite.dll,再將x86\SQLite.Interop.dll和x64\SQLite.Interop.dll拷貝到項目根目錄,包含在項目中,在屬性中設置「若是較新則複製」或「始終複製」。生成結果就像這樣:

TestSQLite\bin\Debug

│  System.Data.SQLite.dll

│  TestSQLite.exe

├─x64

│      SQLite.Interop.dll

└─x86

       SQLite.Interop.dll

  組合後的包命名爲「sqlite-netFx40-static-binary-x86-x64-2010-1.0.90.0.zip」,共享給你們,歡迎下載使用。

◆ 51CTO資源站共享

◆ 360雲盤共享

本文出自 「邊城客棧 學海無涯」 博客,請務必保留此出處http://jamesfancy.blog.51cto.com/2516291/1357462

相關文章
相關標籤/搜索