让使用SQLite的.NET应用自适应32位/64位系统

el/2024/7/24 2:02:50
Windows 7 64 bit(刚扩到4G内存,果断换64位的,那速度杠杠的)
Microsoft Visual Studio 2010 Ultimate 32bit(在64位系统里运行正常)
sqlite-netFx40-setup-bundle-x64-2010-1.0.90.0
首先要先下载SQLite的开发环境安装包(我是这么理解的,貌似只搞到System.Data.SQLite.dll这个文件引用过去都行),下载页面:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
根据自己的VS版本,我下载的是
 
Setups for 64-bit Windows (.NET Framework 4.0)
 sqlite-netFx40-setup-bundle-x64-2010-1.0.90.0.exe 
(12.00 MiB)
 This setup package features the mixed-mode assembly and will install all the necessary runtime components and dependencies for the x64 version of the System.Data.SQLite 1.0.90.0 (3.8.2) package. The Visual C++ 2010 SP1 runtime for x64 is included. The .NET Framework 4.0 is required. 
(sha1: 518be2c4029f7602dd01b6bb24939a5da861e2aa)
下载这个安装文件的时候有个小插曲,就是直接在搜狗浏览器中点这个链接的时候调用迅雷下下来的是一个html文件,显然有问题,后来用IE访问,在新标签页中打开才出来真实的下载地址
搞下来这个文件后运行安装,一路下一步就行了,默认安装到了C:Program FilesSystem.Data.SQLite,打开这个路径可以看到下面的2010bin文件夹下还有个演示用的程序test.exe,运行一下可以看到效果,这里还有最核心的System.Data.SQLite.dll文件,这个文件就是SQLite数据库的引擎了,其实后面访问数据库的时候也就用这一个文件,很方便嵌入的.

 

 

 

如果一个.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位系统进行了区分的。

 

  说到这里,顺便说一下,看着System.Data.SQLite的下载页面就头晕。虽然在下载页面一开始就花了大量的篇幅来说明如何选择下载,但是估计没几个人会把它看完,所以这里还是简单介绍一下。

 


  1) 首先是按类型分为安装包、非静态连接的二进制包和静态连接的二进制包。安装包会安装相关的动态库到系统内,并注册到GAC(Global Assembly Cache);两种二进制包的区别在于非托管部分的连接方式不同,非静态连接的二进制包在使用时需要VC运行时库的支持。需要注意的是:如果需要在Visual Studio中连接SQLite数据库,就必须选择合适的安装包进行安装。

 

  比如,要在Visual Studio 2010中连接SQLite,应该下载“sqlite-netFx40-setup-bundle-x86-2010-1.0.90.0.exe”,这在下载包的说明中有明确黑体字说明。

wKioL1L2-2mij_P_AAJV6pRtu7c170.jpg
[下载包的说明中有明确的黑体字说明]

 

  安装之后就可以在Visual Studio 2010中连接SQLite了:

wKiom1L2-eqwJv4jAAE2HS7eYKM589.jpg
[在Visual Studio中连接SQLite]

 

  2) 每个类型都按.NET版本分成了若干小组,目前从.NET 2.0 SP2到.NET 4.5.1,一共支持5个版本的.NET Framework。每个.NET版本又分为32位和64位两组。选用32位还是64位是根据使用系统来决定的。比如开发的时候是64位系统而发布后运行在32位系统上,就需要在开发时使用64位System.Data.SQLite.dll,而在发布时用32位的System.Data.SQLite.dll替换(看起来很麻烦的样子~~请看后面的解决办法~~)。

 

  3) 在每个.NET版本分组中都有2个文件包,一个带有“bundle”字样,另一个没有。其中带有“bundle”字样的表示动态库是按混合模式编译的,在使用的时候只需要System.Data.SQLite.dll就可以了,而不带“bundle”的则是将非托管部分和托管部分分别编译,System.Data.SQLite.dll不能独立使用,还需要有SQLite.Interop.dll才能使用。


 

  言归正传,如果要使用“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-Win32-2010-1.0.90.0.zip

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

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

wKiom1L3AN-yjXWaAAdjyVYpUAk800.jpg
[比较结果:只有SQLite.Interop.*不同]

 

  然后将两个包的SQLite.Interop.*分别放在x86和x64子目录下,合并成一个包。再在不同类型的系统下运行test.exe,结果都是完全通过

wKioL1L3AWWiY0tNAAUO5xpmciI727.jpg

 

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

TestSQLite\bin\Debug

│  System.Data.SQLite.dll

│  TestSQLite.exe

├─x64

│      SQLite.Interop.dll

└─x86

       SQLite.Interop.dll

  组合后的包命名为“sqlite-netFx40-static-binary-x86-x64-2010-1.0.90.0.zip”,共享给大家,欢迎下载使用。


http://www.ngui.cc/el/5545746.html

相关文章

C#使用DataContractJsonSerializer来进行JSON解析

在使用DataContractJsonSerializer进行解析之前,我们首先需要将两个包引入进来: using System.Runtime.Serialization; using System.Runtime.Serialization.Json; 接下来需要新建一个class,DataContractJsonSerializer可以将JSON字符串转化…

QT操作sqlite概念

SQLite数据库 增、删、改、查 1. 数据库简介 数据库指的是以一定方式存储在一起,能为多个用户共享,具有尽可能小的冗余度的特点,是与应用程序彼此独立的数据集合。 // 一定方式:可以理解为策略、算法 // 网盘相同的文件是以 MD…

QT中全局变量的定义和使用

多的就不说了,本来就是一个简单地内容,只是不会的话会很头疼 我们首先新建两个文件,文件名可以自定义,我们在这里定义为variate.h 和 variate.cpp 当然了,后缀是不能变的。 和函数一样,我们在variate.h中…

C语言中指针动态内存的申请和释放

什么是动态内存的申请和释放? 当程序运行到需要一个动态变量时,需要向系统的堆中申请一块内存,用来存储这块变量,这就是内存的申请。当程序不需要这个变量时,就需要把申请的这块内存释放掉,这就是内存的释放…

Qt中QPainter基本绘图

QWidget 派系的只能在paintEvent中进行重绘;如果你想要很好的交互功能的话推荐QGraphicsView框架,自定义Item的绘制在paint函数;如果你想利用线程绘制的话,你可以创建个QPixmap或者QImage,然后在把图片当画布在线程中绘…

QSqlQuery类操作SQLite(创建、查询、删除、修改)详解

Qt 提供了 QtSql 模块来提供平台独立的基于 SQL 的数据库操作。这里我们所说的“平台 独立”,既包括操作系统平台,也包括各个数据库平台,Qt支持以下几种数据库: QT自带SQLITE数据库,不需要再安装QTDS在Qt4.7起已经被移除 1.QtSql 要使用QtSql 模块的话…

三极管工作原理图解,快速了解三极管结构和工作原理

了解三极管工作原理前&#xff0c;先看一张三极管内部结构原理图&#xff1b;从图中可以清晰的看出NPN和PNP内部结构的区别。 三极管NPN型和PNP型的工作原理&#xff1a; NPN三极管&#xff1a; Vb<Ve &#xff08;截止状态&#xff09; Vc>Vb>Ve&#xff08;放大…

C#图片保存与读取,以及图片另存操作

照片的保存与读取 /// <summary>/// 图片转二进制/// </summary>/// <param name"imgPhoto">图片对象</param>/// <returns>二进制</returns>public static byte[] PhotoImageInsert(System.Drawing.Image imgPhoto){//将Image转…

qt调用opencv汇总(2)

OpenCV3.4.3Qt5.9.4(QtCreator)开发环境搭建 之前有过对OpenCV3.4.2VS2015编译及环境搭建&#xff0c;今天使用OpenCV3.4.3QtCreator5.9.4编译及环境搭建。编译过程比较曲折&#xff0c;大部分编译错误都可以查得到解决方法&#xff0c;也遇到了Google无果的错误&#xff0c;好…

QT5.10.0安装教程图文教程以及安装成功QT5.10.0后环境配置图文步骤

引用&#xff1a;https://www.cnblogs.com/chenmingjun/p/8392713.html QT5.10.0安装教程图文教程以及安装成功QT5.10.0后环境配置图文教程 文章目录 QT5.10.0安装包下载QT5.10.0环境配置 qt5.0安装时下一步为灰色&#xff0c;可先断网再安装就可以点击下一步了 QT是一个非常…