让Sqlite脱离VC++ Runtime独立运行

  前段时间在开发OrayTalk(傲瑞通)的聊天记录模块时用到了Sqlite,这是我第一次接触和使用Sqlite,总体感觉还是非常不错的。这里把我使用Sqlite的经验跟大家分享一下。

一.关于Sqlite  

  Sqlite是一款开源的、适合在客户端和嵌入式设备中使用的轻量级数据库,支持标准的SQL。

  不像SqlServer或Oracle的引擎是一个独立的进程、通过TCP或命名管道等与程序进行通信,SQLite却是作为程序的一个部件、一个构成部分,使用Sqlite的方式就是直接在程序中进行API调用。

  原始的Sqlite是没有一个向SqlServer企业管理器的可视化操作程序的,但是有个第三方开发的应用SqliteStudio非常不错,基本的建库、建表、编辑数据、导出数据等功能都支持得很好。SqliteStudio运行截图如下所示:

  

  Sqlite资源链接:

(1)Sqlite官网:可以从官网下载源码、或下载已经编译好的二进制版本。支持的系统包括:Linux、MacOS、Windows、.NET。

(2)SqliteStudio:好用的Sqlite可视化管理器。

二.在.NET中使用Sqlite

  从官网下载.NET版本的Sqlite,其主要包括两个dll:SQLite.Interop.dll、System.Data.SQLite.dll。

(1)System.Data.SQLite.dll是一个标准的托管dll,我们可以直接在.NET项目中引用并使用它,就像使用.NET自带的System.Data命名空间中的各个对象一样。

(2)SQLite.Interop.dll是一个非托管的dll,是Sqlite引擎核心,我们需要将其拷贝到运行目录下,在运行时,它会被System.Data.SQLite.dll调用。

三.让Sqlite脱离VC++运行时

  我们在项目开发完毕后测试的过程中发现,使用了Sqlite的客户端程序在某些机器上运行时会报错,如下所示:

  无法加载 DLL"SQLite.Interop.DLL";由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。(异常来自 HRESULT:0x800736B1)

  经过一番折腾,才发现是这些机器上没有安装VC++运行时(Visual C++ 2005 SP1 runtime),而SQLite.Interop.dll的运行是需要VC++运行时支持的。这点太不友好了。我们的项目是基于.NET 2.0开发的,windows xp sp1 及以上版本都自带了这个Framework,而这些机器不一定安装了VC++运行时。所以我第一反应就是,尝试让Sqlite在没有安装VC++运行时的机器上也能正常运行。

1.方案一

  我baidu了一下,有个似乎可行的方案是这样的:将msvcm80.dll、msvcp80.dll、msvcr80.dll这几个动态库也放到运行目录下。这个方案我不太喜欢,于是我尝试自己动手解决问题。

2.方案二

  凭借我还未完全忘记的一点VC++基础,我知道VC++程序在编译时可以选择是动态链接到依赖的库还是静态链接,如果是静态连接,编译生成的二进制程序中就相当于包含了一份依赖库的拷贝。所以,我的想法是,重新编译SQLite.Interop.dll,使其静态链接到VC++运行库。我下载了Sqlite的源码,用VS2010打开,截图如下:

     

   SQLite.Interop.2010这个项目是核心,我们需要对它的一些设置稍微做些修改,这些小修改我花了一些时间摸索才成功,这里就略去具体的摸索过程,直接给出摸索成果:

(1)打开SQLite.Interop.2010项目属性页面,配置属性 -> C/C++ -> 代码生成 -> 运行库,该项设置为 多线程调试 (/MTd)。

(2)继续 配置属性 -> 清单工具 -> 输入和输出 -> 嵌入清单,该项原来是“是”,改成“否”。

(3)显示所有项目文件,然后找到SQLite.Interop.2010.props文件,并打开。删掉其中的<INTEROP_MIXED_NAME>配置节点。

(4)从项目中移除“Resource Files”文件夹。

(5)重新编译项目,生成的SQLite.Interop.dll便是我们所需要的。

 四.下载成果

  除非特别需求,否则大家没有必要重复这一过程,我把生成的Sqlite二进制版本直接提供给大家下载使用。

  能脱离VC++运行时运行的Sqlite (v1.0.93.0)

  

 

时间: 2024-11-30 00:15:00

让Sqlite脱离VC++ Runtime独立运行的相关文章

让Sqlite脱离VC++ Runtime独立运行的方法_基础应用

目前手头上的一个.NET项目用到了Sqlite,这是我第一次接触和使用Sqlite,总体感觉还是非常不错的.这里把我使用Sqlite的经验跟大家分享一下. 一.关于Sqlite Sqlite是一款开源的.适合在客户端和嵌入式设备中使用的轻量级数据库,支持标准的SQL. 不像SqlServer或Oracle的引擎是一个独立的进程.通过TCP或命名管道等与程序进行通信,SQLite却是作为程序的一个部件.一个构成部分,使用Sqlite的方式就是直接在程序中进行API调用. 原始的Sqlite是没有一

强大的按键精灵V7.0用现成脚本独立运行软件

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   按键精灵是一个模拟鼠标键盘动作的软件.通过制作脚本,可以让按键精灵代替您的双手,自动执行一系列鼠标键盘动作.按键精灵简单易用,不需要任何编程知识就可以作出功能强大的脚本.只要您在电脑前用双手可以完成的动作,按键精灵都可以替您完成.按键精灵用途广泛,具有大量脚本资源.欢迎大家访问按键精灵网下载脚本.交流脚本制作心得. 如果您玩过网络游戏,那么一定听过"按

如何在IIS中绑定两个域名并且独立运行

有两个网站,采用两个域名访问,可是服务器只有一个固定IP地址,如何在一个服务器上同时加上两个网站,并且独立运行? 首先在IIS中将两个网站按照正常的方式添加.随后选中第二个站点名称并单击右键,在弹出的菜单中选择"属性",在"网络标志"项下单击"IP地址"右侧的"高级"按钮,打开"高级网站标志"对话框,单击"添加"按钮后,在"IP地址"中选中本地IP地址,在"

vc++编程问题-谁能帮忙把这个VC++程序上运行的纵坐标改动一下啊,跪求,急用……

问题描述 谁能帮忙把这个VC++程序上运行的纵坐标改动一下啊,跪求,急用-- 把第一个纵坐标改成0-20,第二个改成0-500,现在不能改动,而且已改动两个都会同时变化,且图形并不随改动值的变化而变化,急用,跪求了--不胜感激-- void CScope::DrawAxis(CDC *pDC) { CFont *pOldFont; int i,nPosY; CString str; pOldFont = pDC->SelectObject(&m_FontAxis); pDC->SetT

hadoop:将WordCount打包成独立运行的jar包

hadoop示例中的WordCount程序,很多教程上都是推荐以下二种运行方式: 1.将生成的jar包,复制到hadoop集群中的节点,然后运行 $HADOOP_HOME/bin/hadoop xxx.jar xxx.WordCount /input/xxx.txt /output 2.或者直接在IDE环境中调试(参见eclipse/intellij idea 远程调试hadoop 2.6.0)   但是生产环境中,更多的情况是:没有ide环境,且各应用最终生成的jar包部署在应用服务器上(应用

vc++编程问题-vc++6.0 运行出现dedug assertion failed

问题描述 vc++6.0 运行出现dedug assertion failed File:viewform.cpp Line:69 这要怎么解决? 解决方案 这是代码中主动抛出的异常,一般来说,表示你某个参数不正确,你需要检查一下代码 比如: CHAR *p = NULL; ASSERT(p==NULL); 执行到这段就会出现你这个错误提示

vc++6.0运行出错问题,简单程序都不行;

问题描述 vc++6.0运行出错问题,简单程序都不行: 我的简单程序编译连接什么的都没有问题,最后运行时来了个c1083,百度又看不懂,求解决方法:(初学c,不会用): 解决方案 贴出你的程序到codepad.org,看看能不能运行. 如果不行,把地址贴在这里帮你看看. 解决方案二: 简单程序,具体是什么程序呢? 说说你的操作步骤吧. 解决方案三: 什么程序拿出来给看 解决方案四: 分析dump等,结合你的程序pdb,用windbg查看具体代码行数 解决方案五: 贴出代码来,光说个有问题别人怎么

c语言-在VC编的程序如何在非VC环境下运行呢?

问题描述 在VC编的程序如何在非VC环境下运行呢? 小白一枚,用C抄了一个猜拳游戏,生成的exe文件貌似不能在别的电脑上运行,有什么方法可以解决呢?静态链接如何实现呢? 解决方案 在VC中,是静态.还是动态,在工程的设置中修改一些设置即可.生成的 EXE 不能在另的电脑上运行,也就是说可以在自己的电脑上运行了.是不是?如果是,先修改为静态链接试试. 解决方案二: 解决方案三: 一个办法是在项目属性里改为MFC静态连接.另一个办法是新电脑运行时缺什么你就拷什么. 解决方案四: 看什么程序,如果是控

变换-麻烦各位帮我改下程序吧,输入#include &amp;amp;quot;stdafx.h&amp;amp;quot;在VC++上面不能运行呀~~

问题描述 麻烦各位帮我改下程序吧,输入#include "stdafx.h"在VC++上面不能运行呀~~ #include ""stdafx.h""#include #include #include #include #include #define N 1000 /*定义复数类型*/ typedef struct { double real; double img; }complex; void fft(); /*快速傅里叶变换*/ void