1. 程式人生 > >讓Sqlite脫離VC++ Runtime獨立執行

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

一.關於Sqlite  

  Sqlite是一款開源的、適合在客戶端和嵌入式裝置中使用的輕量級資料庫,支援標準的SQL

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

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

  

  Sqlite資源連結:

  • Sqlite官網:可以從官網下載原始碼、或下載已經編譯好的二進位制版本。支援的系統包括:Linux、MacOS、Windows、.NET。
  • SqliteStudio:好用的Sqlite視覺化管理器。

二.在.NET中使用Sqlite

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

  • System.Data.SQLite.dll是一個標準的託管dll,我們可以直接在.NET專案中引用並使用它,就像使用.NET自帶的System.Data名稱空間中的各個物件一樣。
  • SQLite.Interop.dll是一個非託管的dll,是Sqlite引擎核心,我們需要將其拷貝到執行目錄下,在執行時,它會被System.Data.SQLite.dll呼叫。(讓受管程式碼物件和非受管物件協同工作的過程稱為互用性(interoperability),通常簡稱為 interop)

三.讓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、方案一

  將msvcm80.dll、msvcp80.dll、msvcr80.dll這幾個動態庫也放到執行目錄下

2、方案二

       安裝vc++執行時。

3、方案三

  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便是我們所需要的。