SQLite的C#,.NET应用自适应32位/64位系统(未能加载文件或程序集“System.Data.SQLite.dll)

SQLite异常报错

其他信息: 未能加载文件或程序集“System.Data.SQLite, Version=1.0.103.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139”或它的某一个依赖项。试图加载格式不正确的程序。

System.BadImageFormatException: 未能加载文件或程序集“System.Data.SQLite.dll”或它的某一个依赖项。 不是有效的 Win32 应用程序。 (异常来自 HRESULT:0x800700C1)

以上报错都是由于没有正确的引用System.Data.SQLite.dll

在网上找了很多信息,都是很长的文字,有的说安装32位或64位的SQLite环境,这个确实管用,但是安装时还要安装SQLite 32位或64位环境,这个我很不喜欢,今天终于把这个问题解决了 并且同时适用 32位和64位系统

我是一个理科生,不太喜欢长篇文字,喜欢简单

此文章来自http://www.luofenming.com/show.aspx?id=ART2018082900001转载请保留此连接  谢谢

如果一个.NET应用要自适应32位/64位系统,只需要在项目的“目标平台”设置为“Any CPU”。但是如果应用中使用了SQLite,情况就不同了。

SQLite的.NET开发包来自是System.Data.SQLite,完成兼容ADO.NET接口,也提供了Linq和Entity Framework 6实现。但这不重要,重要的是System.Data.SQLite是由两部分代码组成的,一部分是非托管的C++代码实现,一部分是托管代码与.NET 框架接口。由于非托管代码不能构建成“Any CPU”的,所以System.Data.SQLite的下载页面的每个包都是按32位或64位系统进行了区分的。

言归正传,如果要使用“Any CPU”的System.Data.SQLite.dll,就必须使用不带“bundle”字样,即非混合编译的二进制包。 

非混合编译的二进制包有System.Data.SQLite.dll和SQLite.Interop.dll两个动态库。按官方说 明,SQLite.Interop.dll是可以放与System.Data.SQLite.dll相同的目录下,也可以放在x86或x64子目录下,由 System.Data.SQLite.dll根据系统类型调用。为了确认,下载如下两个包来进行比较


sqlite-netFx40-binary-x86-2010-1.0.90.0.zip

sqlite-netFx40-binary-x64-2010-1.0.90.0.zip

 结果发现只有SQLite.Interop.*不同,其它文件都完全相同


在Visual Studio项目中引用System.Data.SQLite.dll,再将x86\SQLite.Interop.dll和x64 \SQLite.Interop.dll拷贝到项目根目录,包含在项目中,在属性中设置“如果较新则复制”或“始终复制”。生成结果就像这样:

源码实例下载地址  https://pan.baidu.com/s/1xs4qT_dw3eQIdDgrnJ-oIw

评论