如何在VSIX项目中使用System.Data.SQLite?运行时遇DLL加载失败
在VSIX项目中使用System.Data.SQLite的正确方案
问题本质
SQLite.Interop.dll是原生非托管DLL,并非.NET程序集——这就是你尝试通过VSIX清单添加“程序集资产”时报错的原因。同时VSIX打包流程默认不会自动复制这类原生DLL到输出目录,导致运行时触发DllNotFoundException。
分步解决步骤
1. 确认NuGet包安装正确
通过NuGet安装System.Data.SQLite元包(或单独安装System.Data.SQLite.Core),安装过程会自动下载对应平台的SQLite.Interop.dll,并生成x64/x86目录结构。
2. 配置原生DLL的打包规则
- 找到项目输出目录(如
bin/Debug)下的x64和x86文件夹,每个文件夹内都有SQLite.Interop.dll。 - 将这两个文件夹完整复制到VSIX项目的根目录中。
- 在Visual Studio中选中这两个文件夹,修改属性:
- 生成操作:设置为
内容 - 复制到输出目录:设置为
始终复制
- 生成操作:设置为
3. 修改VSIX清单添加内容资产
打开source.extension.vsixmanifest:
- 切换到「资产」标签页,点击「新建」。
- 类型选择
内容,源选择「文件系统」,路径选择刚才复制到项目根目录的x64和x86文件夹(可分别添加两个资产)。 - 部署路径保持默认(和项目中的目录结构一致),确保打包后VSIX内保留
x64/x86的层级结构。
4. 验证打包结果
生成VSIX包后,将其解压,检查内部是否存在x64和x86文件夹,且每个文件夹内都包含SQLite.Interop.dll。
5. 可选:手动加载DLL(极端情况)
如果仍出现加载问题,可在扩展启动时手动指定DLL路径:
using System.IO; using System.Runtime.InteropServices; // 根据进程位数匹配对应目录 var archDir = Environment.Is64BitProcess ? "x64" : "x86"; var dllFullPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, archDir, "SQLite.Interop.dll"); NativeLibrary.Load(dllFullPath);
避坑提醒
- 绝对不要把
SQLite.Interop.dll当作.NET程序集添加到VSIX资产中,它没有程序集元数据,编辑器必然报错。 - 必须保留
x64/x86的目录结构,System.Data.SQLite运行时会自动根据当前进程位数到对应目录加载DLL。
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

