26

以前 .NET SQLite 库可从 .NET SQLite 库获得http://sqlite.phxsoftware.com,但最近它们已被主要 SQLite 团队接管,并已移动System.Data.SQLite 下载页面。新包似乎不再包含混合程序集(包含 sqlite3.dll 和 .NET 包装器的单个程序集)。

新软件包附带 .NET DLL,SQLite.Interop.dll桌面上不需要基于文档,但我的应用程序无法加载.NET 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错误?

4

4 回答 4

23

下载页面现在包含 System.Data.SQLite 的所有变体的“混合模式”下载,其工作方式与 SQLite 的早期版本相同,即不需要在您的项目中也包含 SQLite.Interop.dll。

诀窍是 - 在下载链接中查找单词“bundle”

例如 sqlite-netFx35-setup- bundle -x86-2008-1.0.76.0.exe

您还将看到这些链接的描述文本以“此安装程序包具有混合模式程序集”开头。

我被烧死了,因为我没有意识到这真的意味着“如果你想让它像以前一样工作,就下载这个”

由于不知道混合模式程序集的含义,其他链接似乎是一个更好的选择 - 因为他们声称“此安装程序包将安装所有必要的运行时组件和依赖项”。

另请注意,判断您是否得到“错误”的唯一方法是通过文件大小。DLL 具有完全相同的名称和完全相同的版本号。 混合模式版本要大得多 - 大约 700K。另一个是160K左右。

真是一团糟...

于 2011-11-02T23:07:06.663 回答
18

我找到了解决方案。该问题是由于SQLite.Interop.dll的一个已知问题引起的。

这是对我有用的解决方法。

使用 http://dependencywalker.com/中的 Dependency Walker 查看 SQLite.Interop.dll(x86 和 x64)表明它依赖于 MSVCR100.dll。

旧的 1.0.66.0 版本的 System.Data.SQLite.dll 没有这个依赖。对于当前版本,我们还必须重新分发 MSVCR100.dll 或运行 Microsoft 的安装程序。

解决方案:来自: 缺少 msvcr100.dll

使用静态链接。在 SQLite.Interop Visual Studio 项目中。转到此属性设置:项目 -> 属性 -> 配置属性 -> C/C++ -> 代码生成 -> 运行时库并将值更改为多线程 (/MT)。(当前源代码 (1.0.71.0) 具有多线程 DLL (/MD),这会导致 dll 依赖 MSVCR100.dll 和 DLLImport(和 LoadLibary())在用户没有它时失败)。

我相信静态链接应该改变,所以它是 SQLite.Interop.dll 的默认值。

于 2011-06-02T16:04:19.100 回答
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文件的位置。

于 2012-10-24T08:48:39.827 回答
4

在 64 位机器上,面向 AnyCPU的 .NET 应用程序无法加载 32 位 DLL 文件。您可能需要将 .NET 应用程序的平台目标设置为x86,以使其在 64 位和 32 位机器上运行。

编辑:在幕后,您无法加载 Interop DLL 的原因可能是BadImageFormatException由于与本机 SQLite DLL 文件的位数不匹配。

于 2011-06-01T18:51:23.207 回答