System.DllNotFoundException Unable to load DLL SQLite.Interop.dll解决办法

最近在写一个c#的sdk,用到了sqlite for .net!

写完之后,打包给别人调用,结果在两台客户机上面死活不可用。然后开始查原因,最后定位到问题:

System.DllNotFoundException Unable to load DLL SQLite.Interop.dll

在不能正常运行的客户机上面,尝试执行sqlite的官方例子,得到同样的结果,排除我代码的问题。

猜测是依赖的动态库缺失。

dependence Walker查了一下:

System.DllNotFoundException Unable to load DLL SQLite.Interop.dll解决办法_第1张图片

应该是编译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打开,截图如下:

System.DllNotFoundException Unable to load DLL SQLite.Interop.dll解决办法_第2张图片
   SQLite.Interop.2010这个项目是核心,我们需要对它的一些设置稍微做些修改,这些小修改我花了一些时间摸索才成功,这里就略去具体的摸索过程,直接给出摸索成果:
(1)打开SQLite.Interop.2010项目属性页面,配置属性 -> C/C++ -> 代码生成 -> 运行库,该项设置为 多线程调试 (/MTd)。
(2)继续 配置属性 -> 清单工具 -> 输入和输出 -> 嵌入清单,该项原来是“是”,改成“否”。
(3)显示所有项目文件,然后找到SQLite.Interop.2010.props文件,并打开。删掉其中的配置节点。
(4)从项目中移除“Resource Files”文件夹。
(5)重新编译项目,生成的SQLite.Interop.dll便是我们所需要的。




你可能感兴趣的:(c#)