如果一个.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”,这在下载包的说明中有明确黑体字说明。


[下载包的说明中有明确的黑体字说明]

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


[在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.*不同,其它文件都完全相同


[比较结果:只有SQLite.Interop.*不同]

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

  最后需要做的就是在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”,共享给大家,欢迎下载使用。

51CTO资源站共享

360云盘共享

出处:http://blog.51cto.com/jamesfancy/1357462

让使用SQLite的.NET应用自适应32位/64位系统的更多相关文章

  1. SQLite在.NET中自适应32位/64位系统

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

  2. SQLite的.NET应用自适应32位/64位系统 z

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

  3. 在代码生成工具Database2Sharp中使用ODP.NET(Oracle.ManagedDataAccess.dll)访问Oracle数据库,实现免安装Oracle客户端,兼容32位64位Oracle驱动

    由于我们开发的辅助工具Database2Sharp需要支持多种数据库,虽然我们一般使用SQLServer来开发应用较多,但是Oracle等其他数据库也是常用的数据库之一,因此也是支持使用Oracle等 ...

  4. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑

    自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问题.相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program Files的区别 ...

  5. 最新Internet Download Manager (IDMan) 6.25 Build 20 32位 64位注册破解补丁

    0x00 IDMan介绍 Internet Download Manager提升你的下载速度最多达5倍,安排下载时程,或续传一半的软件.Internet Download Manager的续传功能可以 ...

  6. 笔记:C语言数据类型在32位与64位机器上的字节数

    读<深入理解计算机系统> 第二章 信息的表示与处理 32位与64位的典型值,单位字节 声明 32位机器 64位机器 char 1 1 short int int 4 4 long int ...

  7. [转]oracle odp.net 32位/64位版本的问题

    本文转自:http://www.cnblogs.com/yjmyzz/archive/2011/04/19/2020793.html 如果你的机器上安装了odp.net,且确信machine.conf ...

  8. Win7 下用 VS2015 编译最新 openssl(1.0.2j)包含32、64位debug和release版本的dll、lib(8个版本)

    Win7 64位系统下通过VS2015编译好的最新的OpenSSL(1.0.2j)所有八个版本的链接库, 包含以下八个版本: 1.32位.debug版LIB: 2.32位.release版LIB: 3 ...

  9. GCC下32位与64位机器类型变量所占字节数

    GCC下32位与64位机器类型变量所占字节数 在C语言中,编译器一般根据自身硬件针对类型变量来选择合适的字节大小,下面列举一下在GCC编译器下32位机器与64位机器各个类型变量所占字节数目: C语言 ...

随机推荐

  1. mysql 给表和字段加注释

    给表加注释: ALTER TABLE table_name COMMENT='这是表的注释'; 给列加注释: ALTER table table_name MODIFY `column_name` d ...

  2. Dll重定向(尚存否?)

    windows核心编程(第五版)的20.6节介绍了Dll重定向. 0x01  Dll重定向简介 产生Dll重定向原因: 应用程序 a.exe 依赖动态链接库 compoent.dll 1.0 版本.但 ...

  3. elk之kibana

    环境: centos7 jdk8 参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.htmlhttp:// ...

  4. 杭电多校第七场 1010 Sequence(除法分块+矩阵快速幂)

    Sequence Problem Description Let us define a sequence as below f1=A f2=B fn=C*fn-2+D*fn-1+[p/n] Your ...

  5. NioEventLoopGroup的构造函数

    loop是对thread的封装,里面记录一个selector 一套打完,看下来,就是loopgroup里面一个loop的数组,每一个loop在 new的时候,传入了selector(第二个箭头), 第 ...

  6. AssetBundle打包详解

    Unity5.x AssetBundle打包详解 在网上查看了很多资料,想详细搞清楚AssetBundle的原理.以实现符合项目需求的打包工具和加载逻辑 1. AssetBundle是什么? Asse ...

  7. 究竟 javascript 错误处理有哪些类型?

    有时候,在自己封装的工具函数中,不传参或传入了错误类型的参数,也要适当的抛出一些错误以示警告:使用框架不正常情况下也会抛出错误,如果对错误一无所知,便无从下手调试.综合上述,了解错误的处理机制是多么必 ...

  8. leetcode第15题:三数之和

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...

  9. MySql笔记之数据备份与还原

    MySQL数据备份.还原与迁移 一.数据备份------mysqldump 1.语法: mysqldump -u user(用户名)-h host(登录用户的主机名称)-p password(登录密码 ...

  10. slaac

    https://zhidao.baidu.com/question/460186176.html slaac是IPv6中的术语.Stateless address autoconfiguration, ...