天天看點

讓使用了SQLite的.NET應用自适應32位/64位系統

  如果一個.NET應用要自适應32位/64位系統,隻需要在項目的“目标平台”設定為“Any CPU”。但是如果應用中使用了SQLite,情況就不同了。

  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資料庫,就必須選擇合适的安裝包進行安裝。   比如,要在Visual Studio 2010中連接配接SQLite,應該下載下傳“sqlite-netFx40-setup-bundle-x86-2010-1.0.90.0.exe”,這在下載下傳包的說明中有明确黑體字說明。 <a href="http://s3.51cto.com/wyfs02/M00/12/0F/wKioL1L2-2mij_P_AAJV6pRtu7c170.jpg" target="_blank"></a> [下載下傳包的說明中有明确的黑體字說明]   安裝之後就可以在Visual Studio 2010中連接配接SQLite了: <a href="http://s3.51cto.com/wyfs02/M01/12/0F/wKiom1L2-eqwJv4jAAE2HS7eYKM589.jpg" target="_blank"></a> [在Visual Studio中連接配接SQLite]   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替換(看起來很麻煩的樣子~~請看後面的解決辦法~~)。   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.*不同,其它檔案都完全相同

<a href="http://s3.51cto.com/wyfs02/M00/12/0F/wKiom1L3AN-yjXWaAAdjyVYpUAk800.jpg" target="_blank"></a>

[比較結果:隻有SQLite.Interop.*不同]

  然後将兩個包的SQLite.Interop.*分别放在x86和x64子目錄下,合并成一個包。再在不同類型的系統下運作test.exe,結果都是完全通過

<a href="http://s3.51cto.com/wyfs02/M02/12/0F/wKioL1L3AWWiY0tNAAUO5xpmciI727.jpg" target="_blank"></a>

  最後需要做的就是在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

本文轉自邊城__ 51CTO部落格,原文連結:http://blog.51cto.com/jamesfancy/1357462,如需轉載請自行聯系原作者

繼續閱讀