新的SQLite混合程序集

时间:2011-06-01 17:37:48

标签: .net sqlite iis mixed-mode

以前,.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错误?

4 个答案:

答案 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