启用FTS5的已发布VSTO应用中System.Data.SQLite查询执行失败
解决VSTO应用中SQLite FTS5模块发布后无响应的问题
这种开发正常但发布后FTS5功能失效(甚至出现无响应/无限循环)的问题,大多和FTS5模块部署不完整、架构不匹配有关,结合你的64位Office环境,给你几个针对性的解决方案:
1. 放弃Any CPU,锁定目标架构为x64
虽然Any CPU看起来通用,但VSTO和Office的位数绑定很严格——你的客户端是64位Office,直接把项目架构改成x64能避免很多interop库加载的歧义:
- 右键项目 → 属性 → 生成 → 目标平台选择
x64 - 取消勾选「首选32位」(如果该选项存在)
- 重新编译并发布,确保输出目录下的
x64文件夹中包含SQLite.Interop.dll
2. 确保FTS5模块文件被正确部署
System.Data.SQLite.Core.FTS5 NuGet包提供的FTS5原生模块,很容易在发布时被遗漏:
- 检查项目中
packages\System.Data.SQLite.Core.FTS5.*\build\x64路径下的sqlite3_fts5.dll,将其添加到项目中 - 设置该文件的「复制到输出目录」为「始终复制」,确保发布时它会被打包到应用运行目录的
x64子文件夹中 - 发布后在客户端机器上确认:应用根目录的
x64文件夹里同时存在SQLite.Interop.dll和sqlite3_fts5.dll
3. 显式加载FTS5模块(避免自动加载失效)
有时候自动加载扩展的逻辑会在发布环境中失效,建议在打开连接后手动加载FTS5:
try { // 注意在连接字符串中添加启用扩展的配置 string connectionstring = "Data Source=your_db_path.db;EnableExtensions=True"; using (SQLiteConnection connection = new SQLiteConnection(connectionstring)) { connection.Open(); // 显式启用扩展并加载FTS5模块 connection.EnableExtensions(true); // 注意模块文件名要和你部署的一致,部分版本可能是sqlite3_fts5.dll connection.Execute("SELECT load_extension('sqlite3_fts5.dll')"); using (SQLiteDataAdapter adapter = new SQLiteDataAdapter("SELECT * FROM Categories order by Name", connection)) { adapter.Fill(Globals.ThisAddIn.Categories_Table); } } } catch (SQLiteException ex) { MessageBox.Show($"{ex.Message}\nError code: {ex.ResultCode}\nHResult: {ex.HResult}\nSource: {ex.Source}\nStack trace:\n{ex.StackTrace}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (Exception ex) { MessageBox.Show($"{ex.Message}\nHResult: {ex.HResult}\nSource: {ex.Source}\nStack trace:\n{ex.StackTrace}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); }
4. 排查隐藏错误(开启SQLite日志)
如果还是无响应,开启SQLite的日志功能,能帮你找到到底卡在了哪一步:
// 在创建连接前添加日志监听 SQLiteConnection.Log += (sender, args) => { // 将日志写入文件或临时弹窗,方便客户端排查 File.AppendAllText("sqlite_log.txt", $"{DateTime.Now}: {args.Message}\n"); };
发布后查看生成的sqlite_log.txt,就能看到模块加载、查询执行的详细过程,定位问题根源。
内容的提问来源于stack exchange,提问作者Mr_Palenoff
相关产品推荐
相关产品推荐

