首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

讓 SQLite 脫離 VC++ Runtime 獨立執行:靜態連結 SQLite.Interop.dll 完整步驟

     編輯:ASP.NET 基礎

System.Data.SQLite 的非託管核心 `SQLite.Interop.dll` 預設動態連結 VC++ Runtime (MSVCRT),導致未安裝對應 Visual C++ Redistributable 的機器無法執行。解決方案:重新編譯 `SQLite.Interop.dll` 為**靜態連結** (`/MT` 或 `/MTd`),使其內建 Runtime 程式碼,單一 DLL 即可獨立執行。

問題現象

System.DllNotFoundException: 無法載入 DLL 'SQLite.Interop.dll':應用程式組態不正確 (0x800736B1)
-- 通常因目標機器缺少 VC++ 2005/2010/2013/2015/2017/2019 Redistributable

官方現成方案 (推薦優先)

SQLite 官網已提供靜態連結版本下載,無需自行編譯:

  • 下載頁:system.data.sqlite.org/downloads
  • 搜尋關鍵字:static、bundle、Win32/x64
  • 範例檔名:sqlite-netFx47-static-binary-bundle-x64-2017-1.0.117.0.zip
  • 解壓後直接取用 `System.Data.SQLite.dll` + `SQLite.Interop.dll` (x64/x86 子資料夾)

自行編譯靜態連結版 (Visual Studio 2019/2022)

若官方版本不符需求 (如特定 .NET Framework 版本、自訂編譯選項),可自行編譯:

1. 取得原始碼

git clone https://github.com/sqlite/sqlite.git
# 或下載 System.Data.SQLite 官方原始碼套件 (含 VS 專案檔)

2. 開啟 SQLite.Interop 專案屬性修改

設定頁面屬性修改為
C/C++ → 代碼產生執行階段程式庫多執行緒 (/MT) (Release)
多執行緒偵錯 (/MTd) (Debug)
資訊清單工具 → 輸入和輸出內嵌資訊清單否
連結器 → 資訊清單檔產生資訊清單否

3. 移除專案內的 .manifest 與 .rc 資源檔

  • 方案總管 → 顯示所有檔案 → 刪除 `SQLite.Interop.manifest`、`.rc`、資源檔資料夾
  • 避免產生外部 Manifest 檔案,確保單一 DLL 部署

4. 修改 Props 檔 (如有)



5. 建置 x86 與 x64 兩種平台

# 批次建置腳本
msbuild SQLite.Interop.2019.vcxproj /p:Configuration=Release /p:Platform=Win32
msbuild SQLite.Interop.2019.vcxproj /p:Configuration=Release /p:Platform=x64

6. 驗證靜態連結

# 使用 Dependency Walker (depends.exe) 或 dumpbin
dumpbin /imports SQLite.Interop.dll
# 若無 MSVCRT.dll、VCRUNTIME140.dll 等匯入,即為靜態連結成功

部署檢查清單

檔案放置位置說明
System.Data.SQLite.dllBin/ 或 GAC託管包裝層,Any CPU
SQLite.Interop.dll (x86)Bin/x86/32 位元進程載入
SQLite.Interop.dll (x64)Bin/x64/64 位元進程載入
資料庫檔 .db/.sqliteApp_Data/ 或指定路徑連線字串 Data Source=...

連線字串範例

// 相對路徑 (App_Data)
string connStr = "Data Source=|DataDirectory|\\MyDb.sqlite;Version=3;";

// 絕對路徑
string connStr = "Data Source=C:\\Data\\MyDb.sqlite;Version=3;Pooling=true;Cache Size=4096;";

// 加密資料庫 (需 SEE 擴充版)
string connStr = "Data Source=MyDb.sqlite;Version=3;Password=MySecret;";

常見問題

問題原因與解決
BadImageFormatException進程位元數與 Interop.dll 不符。確保專案 Platform target (x86/x64/Any CPU) 與部署的 Interop.dll 一致。Any CPU + Prefer 32-bit 勾選 → 需 x86 Interop。
DllNotFoundException (x64)64 位元機器未部署 x64 版 Interop.dll。檢查 Bin/x64/ 存在。
資料庫鎖定/寫入失敗SQLite 檔案層級鎖定。連線字串加 `Pooling=true`、避免長連線、WAL 模式 `PRAGMA journal_mode=WAL;`。
Entity Framework Core 搭配使用 `Microsoft.Data.Sqlite` (純託管) 或 `Microsoft.EntityFrameworkCore.Sqlite` (內建原生),無需手動管理 Interop.dll。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved