讓Sqlite脫離VC++ Runtime獨立運行

  前段時間在開發OrayTalk(傲瑞通企業即時通信系統)的聊天記錄模塊時用到了Sqlite,這是我第一次接觸和使用Sqlite,總體感覺還是非常不錯的。這裏把我使用Sqlite的經驗跟大家分享一下。

一.關於Sqlite  

  Sqlite是一款開源的、適合在客戶端和嵌入式設備中使用的輕量級數據庫,支持標準的SQL。

  不像SqlServer或Oracle的引擎是一個獨立的進程、通過TCP或命名管道等與程序進行通信,SQLite卻是作爲程序的一個部件、一個構成部分,使用Sqlite的方式就是直接在程序中進行API調用。

  原始的Sqlite是沒有一個向SqlServer企業管理器的可視化操作程序的,但是有個第三方開發的應用SqliteStudio非常不錯,基本的建庫、建表、編輯數據、導出數據等功能都支持得很好。SqliteStudio運行截圖如下所示:

  

  Sqlite資源鏈接:

(1)Sqlite官網:可以從官網下載源碼、或下載已經編譯好的二進制版本。支持的系統包括:Linux、MacOS、Windows、.NET。

(2)SqliteStudio:好用的Sqlite可視化管理器。

二.在.NET中使用Sqlite

  從官網下載.NET版本的Sqlite,其主要包括兩個dll:SQLite.Interop.dll、System.Data.SQLite.dll。

(1)System.Data.SQLite.dll是一個標準的託管dll,我們可以直接在.NET項目中引用並使用它,就像使用.NET自帶的System.Data命名空間中的各個對象一樣。

(2)SQLite.Interop.dll是一個非託管的dll,是Sqlite引擎核心,我們需要將其拷貝到運行目錄下,在運行時,它會被System.Data.SQLite.dll調用。

三.讓Sqlite脫離VC++運行時

  我們在項目開發完畢後測試的過程中發現,使用了Sqlite的客戶端程序在某些機器上運行時會報錯,如下所示:

  無法加載 DLL"SQLite.Interop.DLL";由於應用程序配置不正確,應用程序未能啓動。重新安裝應用程序可能會糾正這個問題。(異常來自 HRESULT:0x800736B1)

  經過一番折騰,才發現是這些機器上沒有安裝VC++運行時(Visual C++ 2005 SP1 runtime),而SQLite.Interop.dll的運行是需要VC++運行時支持的。這點太不友好了。我們的項目是基於.NET 2.0開發的,windows xp sp1 及以上版本都自帶了這個Framework,而這些機器不一定安裝了VC++運行時。所以我第一反應就是,嘗試讓Sqlite在沒有安裝VC++運行時的機器上也能正常運行。

1.方案一

  我baidu了一下,有個似乎可行的方案是這樣的:將msvcm80.dll、msvcp80.dll、msvcr80.dll這幾個動態庫也放到運行目錄下。這個方案我不太喜歡,於是我嘗試自己動手解決問題。

2.方案二

  憑藉我還未完全忘記的一點VC++基礎,我知道VC++程序在編譯時可以選擇是動態鏈接到依賴的庫還是靜態鏈接,如果是靜態連接,編譯生成的二進制程序中就相當於包含了一份依賴庫的拷貝。所以,我的想法是,重新編譯SQLite.Interop.dll,使其靜態鏈接到VC++運行庫。我下載了Sqlite的源碼,用VS2010打開,截圖如下:

     

   SQLite.Interop.2010這個項目是核心,我們需要對它的一些設置稍微做些修改,這些小修改我花了一些時間摸索才成功,這裏就略去具體的摸索過程,直接給出摸索成果:

(1)打開SQLite.Interop.2010項目屬性頁面,配置屬性 -> C/C++ -> 代碼生成 -> 運行庫,該項設置爲 多線程調試 (/MTd)。

(2)繼續 配置屬性 -> 清單工具 -> 輸入和輸出 -> 嵌入清單,該項原來是“是”,改成“否”。

(3)顯示所有項目文件,然後找到SQLite.Interop.2010.props文件,並打開。刪掉其中的<INTEROP_MIXED_NAME>配置節點。

(4)從項目中移除“Resource Files”文件夾。

(5)重新編譯項目,生成的SQLite.Interop.dll便是我們所需要的。

 四.下載成果

  除非特別需求,否則大家沒有必要重複這一過程,我把生成的Sqlite二進制版本直接提供給大家下載使用。

  能脫離VC++運行時運行的Sqlite (v1.0.93.0)  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章