.net项目中同时兼容32位和64位SQLlite的方法

在.net项目中同时兼容32位和64位SQLite的方法

    • 在C#中使用SQLite:
      • 1.源代码包(source packages)
      • 2.安装程序包(setup packages)
      • 3.二进制软件包(binary packages)
    • 兼容问题
      • 官方说明
      • 实际问题和解决方案
      • 其它

最近在做导师给的一个VSTO项目,数据库要求使用SQLite。但是在使用的过程中遇到一些问题,故把解决过程做一个记录。博主使用的Visual Studio版本为2019,项目使用的,net框架为4.6版本。

在C#中使用SQLite:

在.net项目中使用SQLite需要引用System.data.SQLite包,System.data.SQLite是SQLite对Ado.NET的支持,官网下载地址:System.data.SQLite官网下载

下载页面中包含了各式各样的下载包,在下载的时候要注意自己应该下哪一种。

1.源代码包(source packages)

主要面向那些对研究与项目的特定发行版本相对应的源代码感兴趣的人。源代码包不包含二进制文件。

2.安装程序包(setup packages)

只打算安装在开发人员计算机上,然后只在需要Visual Studio的设计时组件时安装。理论上,它们也可以安装在客户机上;但是,不建议使用这种部署。

3.二进制软件包(binary packages)

旨在供开发人员使用,以便通过XCOPY部署获得开发应用程序并将其部署到客户机上所需的汇编二进制文件。

‘’所有“bundle”包都包含System.Data.SQLite.dll“混合模式程序集。这些包只能在由于某些原因(例如,为了支持客户机上的某些遗留应用程序)必须将程序集二进制文件部署到全局程序集缓存的情况下使用。

所有的“static”包都包含静态或静态的VisualC++运行时版本的本地或混合模式汇编二进制文件。通常,在客户机可能没有安装VisualC++运行时的必要版本,并且由于特权有限而无法安装时,可以使用这些包。

在下载安装包的时候应该确认应用程序所对应的.net版本。

兼容问题

官方说明

对于在项目中出现的SQLlite对windows系统的兼容问题,官方下载网站作出了以下解释:、

最后一步是确定开发机器和客户机器上的目标处理器体系结构。通常,x86二进制文件将在运行Windows的x64计算机上工作(使用WoW64)。但是,使用托管代码时会出现问题。如果启动进程的可执行文件完全由托管代码组成,则它将使用计算机的本机处理器体系结构运行,该体系结构将是x64计算机上的x64。稍后,这将导致包含为x86编译的任何本机代码的程序集(例如混合模式程序集”“System.Data.SQLite.dll“,本地互操作程序集“SQLite.Interop.dll“”或本地库“sqlite3.dll”)无法加载,通常会导致引发BadImageFormatException

如果开发和客户机可能具有不同的处理器体系结构,则可能需要多个二进制软件包。对于这种情况,强烈建议使用本机库预加载功能(native library pre-loading feature)。它从版本1.0.80.0开始可用,并在默认情况下启用。为了利用此功能,必须将单独的托管程序集和互操作程序集与XCOPY部署一起使用(即,混合模式程序集不支持此功能,也不支持将程序集部署到全局程序集缓存中),从而导致应用程序部署如下所示:

\应用程序.exe(可选,仅托管应用程序可执行程序集)

\应用程序.dll(可选,仅托管应用程序库程序集)

\System.Data.SQLite.dll(必需,仅托管核心程序集)

\System.Data.SQLite系统.Linq.dll(可选,仅限托管LINQ程序集)

\System.Data.SQLite系统.EF6.dll(可选,仅托管EF6程序集)

\x86\SQLite.Interop.dll(必需,x86本机互操作程序集)

\x64\SQLite.Interop.dll(必需,x64本机互操作程序集)

上面的字符串“”表示要在目标计算机上部署应用程序二进制文件的目录。在启用了本机库预加载功能和上面显示的应用程序部署之后System.Data.SQLite仅托管程序集将尝试自动检测当前进程的处理器体系结构并预加载相应的本机库。

实际问题和解决方案

说了这么多,下面放上博主自己在项目中遇到的问题和解决过程:
.net项目中同时兼容32位和64位SQLlite的方法_第1张图片
可以看到第二行现实引发了一个BadImageFormatException异常。后面还显示有TargetInvocationException异常,可以视为是由第一个异常引起的。

我从官网网址上下载了应用于.net Framework 4.6版本的X86和X64版本的SQLite预编译二进制包,如图所示:
.net项目中同时兼容32位和64位SQLlite的方法_第2张图片
包里含有的文件如下图所示,不过我们这里只用到SQLite.Data.SQLite.dll和SQLite.Interop.dll;
.net项目中同时兼容32位和64位SQLlite的方法_第3张图片

打开项目的“解决方案管理器”,右键“引用”->“添加引用
.net项目中同时兼容32位和64位SQLlite的方法_第4张图片

在“引用管理器”中,点击右下角的“浏览”,添加对System.Data.SQLite.dll的引用。这里的System.Data.SQLite.dll可以从下载的两个包中任意选取,因为不管是X86版本还是X64版本,它们的System.Data.SQLite.dll是一样的。
.net项目中同时兼容32位和64位SQLlite的方法_第5张图片
bin文件夹下建立两个新文件夹“x86”和“x64”,将下载的两个版本的预编译二进制文件包里的SQLite.interop.dll分别放在两个文件夹下,如图所示。(博主上图才发现自己放的是Debug文件夹,大概也没差,至于data文件夹是作他用的,不用管)
.net项目中同时兼容32位和64位SQLlite的方法_第6张图片
如果在解决方案资源管理器中看不到文件夹,请查看是否选中了“显示所有文件”
.net项目中同时兼容32位和64位SQLlite的方法_第7张图片
右键这两个SQLite.interop.dl文件,点击“属性”,在“高级”一栏的“复制到输出目录”中,选择“如果较新则复制
.net项目中同时兼容32位和64位SQLlite的方法_第8张图片
这样就可以解决SQLite对不同操作平台的兼容问题了。

其它

其实关于操作平台问题,也可以通过更改VS中Debug和Release的平台来解决问题(默认是Any CPU,可以按需改为X86和X64),可是因为博主同时又使用了VSTO的程序集,这终究是一种治标不治本的方法。把这个解决过程整理出来,希望以后有人遇到相同的问题的时候,这篇博客能帮上一些小忙。

参考博客:SQLite的.NET应用自适应32位/64位系统

你可能感兴趣的:(VSTO)