System.DllNotFoundException Unable to load DLL SQLite.Interop.dll解决办法
2015-10-26 20:48
459 查看
最近在写一个c#的sdk,用到了sqlite for .net!
写完之后,打包给别人调用,结果在两台客户机上面死活不可用。然后开始查原因,最后定位到问题:
System.DllNotFoundException Unable to load DLL SQLite.Interop.dll
在不能正常运行的客户机上面,尝试执行sqlite的官方例子,得到同样的结果,排除我代码的问题。
猜测是依赖的动态库缺失。
dependence Walker查了一下:
应该是编译sqlite的时候动态依赖了vc8的库文件。然后我把该目录的msvc80相关的动态库拷贝到SQLite.Interop.dll目录。居然不管用,这是怎么了?简直在侮辱我的智商。难道依赖的版本不是vc8?不清楚,后面未尝试链接其他版本的vc库。
最后的办法,在代码中静态链接mfc相关库。下载了sqlite源码,自己重新编译一个静态链接vc库的sqlite动态库。编译选项的配置参考了这个博客
1.方案一
我baidu了一下,有个似乎可行的方案是这样的:将msvcm80.dll、msvcp80.dll、msvcr80.dll这几个动态库也放到运行目录下。这个方案我不太喜欢,于是我尝试自己动手解决问题。【这个方案我尝试有问题】
2.方案二
重新编译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便是我们所需要的。
写完之后,打包给别人调用,结果在两台客户机上面死活不可用。然后开始查原因,最后定位到问题:
System.DllNotFoundException Unable to load DLL SQLite.Interop.dll
在不能正常运行的客户机上面,尝试执行sqlite的官方例子,得到同样的结果,排除我代码的问题。
猜测是依赖的动态库缺失。
dependence Walker查了一下:
应该是编译sqlite的时候动态依赖了vc8的库文件。然后我把该目录的msvc80相关的动态库拷贝到SQLite.Interop.dll目录。居然不管用,这是怎么了?简直在侮辱我的智商。难道依赖的版本不是vc8?不清楚,后面未尝试链接其他版本的vc库。
最后的办法,在代码中静态链接mfc相关库。下载了sqlite源码,自己重新编译一个静态链接vc库的sqlite动态库。编译选项的配置参考了这个博客
1.方案一
我baidu了一下,有个似乎可行的方案是这样的:将msvcm80.dll、msvcp80.dll、msvcr80.dll这几个动态库也放到运行目录下。这个方案我不太喜欢,于是我尝试自己动手解决问题。【这个方案我尝试有问题】
2.方案二
重新编译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便是我们所需要的。
相关文章推荐
- MySQL server has gone away
- PLSQL Developer报“动态执行表不可访问,本会话的自动统计被禁止”的解决方案
- Sqoop导mysql库到Hive中com.mysql.jdbc.RowDataDynamic错误解决
- mysql使用load命令 报错:ERROR 13 (HY000): Can't get stat of '/root/mysql/mysql/data/datatotestproc' (Errco
- mybatis sqlmap中property遇到的问题
- 使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务
- MySQL server has gone away
- mysql 第23章 监控
- 32位的PL/SQL developer如何连接64位的ORACLE 11g
- Oracle数据库备份、恢复 - 使用PL/SQL Developer 导入、导出Oracle数据库
- 理解MySQL——架构与概念
- PostgreSQL数据库 OLTP高并发请求性能优化
- MySQL主从架构配置案例
- PowerDesigner16建表在SQL SERVER 2008报 对象名 'sysproperties' 无效。
- go mysql
- adb文件copy及sqlite3:not found篇
- LR通过snmp监控linux下的mysql
- Sql 2005 维护笔记
- MySQL中delete,truncate与drop的区别
- 监控MySQL服务是否正常