定期我得到以下异常:

无法加载DLL 'SQLite.Interop.dll':无法找到指定的模块。(异常来自HRESULT: 0x8007007E)

我使用的是1.0.82.0。在VS2010, Win7 64操作系统下使用nuget安装。

一旦异常开始出现,它就会不断出现——在调试和发布中,在VS内部或外部运行应用程序。

阻止它的唯一方法就是退出并重新登录。不抛出异常并加载dll。 它可以工作几天,但之后又会坏掉。

有人见过这样的情况吗,有解决方案吗?


当前回答

如果您下载了正确的SQLite二进制文件,则根据项目构建选项将SQLite. interop .dll复制到您的发布或调试文件夹中。

其他回答

我不知道这是否是一个好的答案,但我能够通过在AppDomain下以“本地系统”的身份运行我的应用程序来解决这个问题。

一个对我有效的解决方案是从nuget包中安装System.Data.SQLite。

导入要导入的项目的.dll,并安装System.Data.SQLite。

这将安装与您的解决方案/项目兼容并更新的ddl。

扩展Kugel的回答,这对我来说是有效的(VS2015 Enterprise),利用dll中的SQLite,可以在构建和测试后从主项目中删除Nuget包:

1.安装Nuget包到主项目。

Install-Package System.Data.SQLite

2.构建应用程序并测试Sqlite连接是否正常工作:

select * from sqlite_master

3.从主版本卸载Nuget包。

UnInstall-Package System.Data.SQLite

4.手动删除SQLite和EntityFramework的dll引用:

System.Data.SQLite
System.Data.SQLite.EF6
System.Data.SQLite.Linq

从主项目的“包”中删除Xml引用。配置”XML文件。

这对我来说很有效,使我的项目保持干净。

我想到了一个解决办法。

在我的例子中,我使用的是Microsoft Visual Studio安装程序项目。 安装项目看不到来自主要输出的x64和x86文件夹和内容。

解决方案:

将x64和x86文件夹都添加到安装程序中的应用程序文件夹中。 添加两个文件夹的内容。

这将允许安装程序复制SQLite工作所需的DLL文件。

来自NuGet的多体系结构(x86, x64)版本SQLite的默认安装显示了您所描述的行为。如果你想加载。net运行时选择在你的机器上运行你的应用程序的实际体系结构的正确版本,那么你可以给DLL加载器一个关于在哪里找到正确库的提示,如下所示:

在Program.Main()之前添加kernel32.dll函数调用SetDLLDirectory()的声明:

    [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode, SetLastError = true)]
    [return: System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)]
    static extern bool SetDllDirectory(string lpPathName);

然后使用您自己的方法确定正确的子目录,以找到'SQLite.Interop.dll'的特定于体系结构的版本。我使用以下代码:

    [STAThread]
    static void Main()
    {
        int wsize = IntPtr.Size;
        string libdir = (wsize == 4)?"x86":"x64";
        string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
        SetDllDirectory(System.IO.Path.Combine(appPath, libdir));