VB读取Firefox便携版places.sqlite报SQLite程序集加载错误求解
问题根因
你遇到的Could not load file or assembly 'System.Data.SQLite, Version=1.0.116.0... An attempt was made to load a program with an incorrect format报错,核心触发原因分三类:
- 程序编译的目标平台和引用的System.Data.SQLite版本架构不匹配(x86/x64混载,这是90%场景下的触发原因)
- 只引用了System.Data.SQLite的托管DLL,缺少对应架构的原生互操作依赖文件
- 引用的DLL版本和项目配置的绑定版本不一致
可行解决方案
- 修正项目目标平台配置
打开VB项目的属性页,进入「编译」选项卡,点击「高级编译选项」,将目标CPU从默认的Any CPU切换为和你引用的System.Data.SQLite匹配的架构:如果引用的是32位版本就选x86,64位版本就选x64,同时取消勾选「首选32位」选项。修改完成后清理项目的bin、obj目录,重新编译即可。注意:便携版Firefox本身分32位和64位版本,但places.sqlite文件本身和架构无关,你只需要保证自己的程序和引用的SQLite组件架构统一就行,不需要和Firefox架构对齐。
- 补全SQLite依赖,统一版本
不要单独拷贝System.Data.SQLite.dll到项目目录引用,这个DLL是托管层,运行时必须依赖对应架构的原生SQLite.Interop.dll才能正常加载:- 先移除项目里现存的所有System.Data.SQLite相关引用,删除输出目录里残留的旧版SQLite相关DLL
- 通过NuGet包管理器安装对应1.0.116版本的
System.Data.SQLite.Core包,安装完成后会自动将x86、x64两个版本的互操作DLL配置到输出目录,不需要手动拷贝文件 - 如果不用NuGet手动部署,必须把和你目标平台一致的
SQLite.Interop.dll和System.Data.SQLite.dll一起放到程序EXE同级目录,不能缺文件
- 绕开锁文件问题(解决程序集加载问题后需要注意)
程序集加载正常后,不要直接读取正在运行的Firefox目录下的places.sqlite——Firefox启动时会独占锁定自己的配置数据库,直接读取会报文件占用错误,需要先把该文件拷贝到临时目录,再对拷贝后的文件执行读取操作。 - 替代方案
如果不想处理System.Data.SQLite的架构匹配问题,可以直接用原生sqlite3.dll通过P/Invoke方式调用,也可以选择不依赖额外互操作DLL的轻量SQLite包装库,从根源上避免程序集格式不匹配的问题。
内容的提问来源于stack exchange,提问作者Visula Kavinda
相关产品推荐
相关产品推荐

