以前,.NET SQLite库可以从http://sqlite.phxsoftware.com
获得,但最近它们已被主要的SQLite团队接管并移动了 System.Data.SQLite Download Page 。新包似乎不再包含混合程序集(包含sqlite3.dll和.NET包装器的单个程序集)。
新的软件包附带了.NET DLL和SQLite.Interop.dll
,桌面上不需要基于文档,但我的应用程序无法加载Unable to load DLL 'SQLite.Interop.DLL': The specified module could not be found.
。我已尝试在IIS / IIS Express下运行应用程序,并将apppool设置为32位。
我尝试将SQLite.Interop.dll
文件复制到bin
文件夹,系统文件夹和ASP.NET临时文件夹中,但仍然会收到相同的错误。
是否有适用于新版本的混合程序集?如果没有,有没有办法解决Unable to load DLL 'SQLite.Interop.DLL
错误?
答案 0 :(得分:24)
downloads page现在包含System.Data.SQLite所有变体的“混合模式”下载,其工作方式与早期版本的SQLite相同,即不需要在项目中包含SQLite.Interop.dll
诀窍是 - 在下载链接中查找“bundle”一词
e.g。源码-netFx35-设置 - 的束强> -x86-2008-1.0.76.0.exe
您还会看到这些链接的说明文字以开头,“此安装程序包具有混合模式程序集”。
我被烧了是因为我没有意识到这真的意味着“如果你想让它按照以前的方式工作,那就下载这个”。
不知道混合模式程序集的含义,其他链接似乎是一个更好的选择 - 因为他们声称“此安装程序包将安装所有必要的运行时组件和依赖项”。
另请注意,判断您是否出现“错误”的唯一方法是按文件大小。 DLL具有完全相同的名称和完全相同的版本号。 混合模式版本要大得多 - 大约700K 。另一个是大约160K。
多么糟糕......
答案 1 :(得分:18)
我找到了解决方案。问题是由于known issue与SQLite.Interop.dll。
这是对我有用的解决方法。
使用Dependency Walker http://dependencywalker.com/看 在SQLite.Interop.dll(x86和x64) 表明它依赖于MSVCR100.dll。
旧的1.0.66.0版本 System.Data.SQLite.dll没有 这种依赖。随着当前 构建,我们将不得不重新分配 MSVCR100.dll也可以运行 来自Microsoft的安装程序。
解决方案:来自: Missing msvcr100.dll
使用静态链接。在里面 SQLite.Interop Visual Studio项目。 转到此属性设置:项目 - >属性 - >配置属性 - > C / C ++ - >代码生成 - >运行时库并将值更改为多线程(/ MT)。 (该 当前源代码(1.0.71.0)有 多线程DLL(/ MD)导致 该DLL依赖于MSVCR100.dll和 DLLImport(和LoadLibary())来 当用户没有它时失败。)
我认为静态链接应该是 已更改,因此它是默认值 SQLite.Interop.dll。
答案 2 :(得分:8)
我在一个不同应用程序的插件中遇到了同样的问题。在我的情况下,我通过在首次引用SQLite之前修改环境变量PreLoadSQLite_BaseDirectory来解决它。
// Make SQLite work... (loading dll from e.g. x64/SQLite.Interop.dll)
System.Environment.SetEnvironmentVariable("PreLoadSQLite_BaseDirectory", System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));
Sql.Data.SQLite...
我不明白为什么这是必需的,因为我认为PreLoadSQLite_BaseDirectory
(嗯,相应的内部变量)将默认为System.Data.SQLite.dll
文件的位置。
答案 3 :(得分:4)
在64位计算机上, AnyCPU 目标.NET应用程序无法加载32位DLL文件。您可能需要将.NET应用程序的平台目标设置为 x86 ,以使其在64位和32位计算机上运行。
编辑:由于与本机SQLite DLL文件的位数不匹配,导致无法加载Interop DLL的原因可能是BadImageFormatException
。