【问题标题】:Unable to load DLL 'SQLite.Interop.dll'无法加载 DLL 'SQLite.Interop.dll'
【发布时间】:2012-10-13 05:52:40
【问题描述】:

我会定期收到以下异常:

Unable to load DLL 'SQLite.Interop.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

我使用的是 1.0.82.0。版本,在VS2010,OS Win7 64下用nuget安装。

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

阻止它的唯一方法是注销和登录。不抛出异常并加载 dll。 它可以工作几天,但它可能会再次中断。

有没有人见过这样的事情,有解决办法吗?

【问题讨论】:

  • 是的,它设置为始终复制。我在 bin/debug 中有 x64 和 x86 文件夹。它主要工作,但有时只是停止工作。可能有什么东西阻止了对 dll 的访问,下次它停止工作时我会尝试找出它。正如我所说,它可能会在几天内没有任何问题。
  • 在将 SQLite nuget 包添加到新的控制台项目后,我立即收到了这个错误。从 x86 文件夹手动复制 SQLite.Interop.dll 上一级允许应用程序运行。对我来说似乎很奇怪,这会如此破碎。
  • @Wayne 是的,这绝对有帮助。但就我而言,我们正在共同开发这个项目,我的朋友使用的是 x86,而我使用的是 x64 操作系统。正如我所注意到的,它有时会停止工作。虽然上个月没有发生在我身上。
  • 如果您为 SQLite 下载了正确的二进制文件,则根据您的项目构建选项将 SQLite.Interop.dll 复制到您的 Release 或 Debug 文件夹中。
  • 这是一个随机的错误...有时会发生,有时不会发生在我的项目中。什么都试过了。

标签: c# visual-studio-2010 sqlite


【解决方案1】:

我正在开发一个简单的控制台应用程序,以将一些测试数据添加到 SQLite 数据库并收到此错误。项目的配置是“任何 CPU”。我通过将 SQLite.Interop.dll 复制到 bin\debug 文件夹来修复它。更好的方法是使用@Wil 的方法,但是如何为“Any CPU”配置指定此方法?

【讨论】:

    【解决方案2】:

    供任何查看此问题的人参考:

    如果您使用 nuget 包,它会安装一个为您执行复制的构建规则。 (参见 System.Data.SQLite.Core.1.0.94.0\build - 或您安装的任何 Core 版本)。

    nuget 安装程序会自动将规则添加到您的项目文件中。

    但这仍然不能解决测试用例问题。 DeploymentItem (https://stackoverflow.com/a/24411049/89584) 方法似乎是唯一可行的方法。

    【讨论】:

      【解决方案3】:

      我在一个包含 WebAPI/MVC5 Web 项目和功能测试项目的解决方案中遇到了这个问题,这两个项目都使用了相同的数据访问(或“核心”)项目。我和这里的许多其他人一样,正在使用通过 NuGet 在 Visual Studio 2013 中下载的副本。

      我所做的是在 Visual Studio 中将 x86 和 x64 解决方案文件夹添加到功能测试和 Web 项目中。然后我做了一个Right Click | Add Existing Item...,并从..\SolutionFolder\packages\System.Data.SQLite.Core.1.0.94.0\build\net451\[appropriate architecture] 为每个文件夹添加了适当的SQLite.interop.dll 库。然后我做了一个Right Click | Properties,并将Copy to Output Directory 设置为Always Copy。下次我需要运行功能测试时,测试运行成功。

      【讨论】:

        【解决方案4】:

        简而言之

        为了让它也能与 NCrunch 一起工作,我必须将 NuGet 包提供的 Interop.dll 版本添加为additional files in NCrunch configuration

        我的情况

        我有一个 C# 解决方案,其中一个项目直接依赖于 SQLite(一个帮助程序库)和一个使用此帮助程序库的单元测试项目。我已将 System.Data.SQLite.Core 版本 1.0.97.0 作为 NuGet 包安装。

        在我的情况下,workaround provided by Marin 让它在 Visual Studio 和 CI 中也能正常工作。但是,这仍然会在 NCrunch 中提供错误。

        在 NCrunch 配置中,我在单元测试项目设置下的“要包含的其他文件”中添加了以下路径:

        ..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\**.dll
        

        【讨论】:

        • 偶然发现了同样的问题,并且知道它与 ncrunch 有关。解决了我的一些时间。
        【解决方案5】:

        由于这个问题的复杂性,我想在这里发帖。我的解决方案是回滚到 .Net 4.0。我已经测试了 3 天,但无法让 System.Data.SQLite.Core.1.0.98.0 与 .Net 4.5 或 .Net 4.5.1 一起使用。

        在 3 台计算机、2 台服务器和一台开发 PC 上进行了详尽的测试。我无法找到问题的根源。我尝试编辑 .vsproj 文件。我实际上已将 SQLite.interop.dll 添加到所有文件夹中。我已将包应用到所有 GAC 文件夹,并单独删除并重新应用。最终被移除。

        我确实有 System.Data.SQLite.Core.1.0.98.0 与 .Net 4.0 一起使用。我打算继续尝试迁移,但我想我会先启动一个新项目,看看我是否可以让它以这种方式工作。这最初是一个 .Net 3.5 网络应用程序,在我的旅行中,我发现大量信息仍然引用该框架。

        【讨论】:

        • 如果您查看 4.5.1 的 nuget 包,它的构建目录中没有 dll。它几乎适用于所有其他版本的 .net。我通过升级到 4.7.1 “修复”了这个问题。
        • FYI 4.7.1 当时不可用。没必要在这么老的帖子上发帖。
        【解决方案6】:

        我的情况有点独特。我在 docker 容器中运行应用程序并不断收到以下错误

        System.DllNotFoundException:无法加载共享库“SQLite.Interop.dll”或其依赖项之一。为了帮助诊断加载问题,请考虑设置 LD_DEBUG 环境变量:libSQLite.Interop.dll: cannot open shared object file: No such file or directory

        所以我设置 LD_DEBUG=libs 以找出 System.Data.SQLite.dll 正在寻找哪些文件夹以找到 SQLite.Interop.dll强>。

        您可以在此处找到有关设置 LD_DEBUG 的信息:http://www.bnikolic.co.uk/blog/linux-ld-debug.html

        一旦我这样做了,我意识到 SQLite.Interop.dll 被发现就好了。未找到的 DLL 是 libSQLite.Interop.dll。我应该已经阅读了整个错误消息。

        经过数小时的谷歌搜索后,我发现了这个guide,关于如何从 SQLite 源代码编译缺少的 DLL。

        请注意,实际上丢失的文件是 libSQLite.Interop.dll.so

        无论如何,当您编译源代码时,您会得到 libSQLite.Interop.so,您需要将其重命名为 libSQLite.Interop.dll.so 并将其放在目录中通过设置 LD_DEBUG 可以找到它正在查找的位置。

        对我来说,System.Data.SQLite.dll 正在查找的目录是 /usr/lib/x86_64-linux-gnu/

        【讨论】:

        • 这在 Linux 机器上对我有用,谢谢!
        【解决方案7】:

        您确实需要通过 NuGet 安装 System.Data.SQLite.Core。 如果您使用 InnoSetup,请确保在 .iss 文件的 [Files] 部分中有以下行:

        Source: "C:\YourProjectPath\bin\Release\x64\*"; DestDir: "{app}\x64"; Flags: ignoreversion recursesubdirs createallsubdirs
        Source: "C:\YourProjectPath\bin\Release\x86\*"; DestDir: "{app}\x86"; Flags: ignoreversion recursesubdirs createallsubdirs
        

        更改“YourProjectPath”作为您项目的路径。

        【讨论】:

        • 以上答案是恕我直言,这是我的问题的唯一解决方案,MS 开发团队无法解决这里是我的问题stackoverflow.com/questions/63679859/… 的链接,强烈建议使用 Inno Setup回到黑暗时代,我们在使用 VB 6 时将这个 dll 称为 HELL,那时我学会了使用 Inno Setup 如果您是初学者,这是一个很好的视频youtube.com/watch?v=z5g_79_nD-g
        【解决方案8】:

        这对我有用。

        1. 打开 Visual Studio,通过 NUGET 包管理器搜索并安装 SQLite.Core。
        2. 转到VS中的解决方案资源管理器,右键单击您的项目名称-->添加-->新建文件夹
        3. 将文件夹命名为 x64
        4. 重复该过程并添加文件夹并将其命名为 x86
        5. 右键单击 x64 文件夹-->添加-->现有项目然后浏览到调试文件夹。您将找到 x64 文件夹。打开它并选择“SQLite.Interop.dll”文件,然后点击确定。
        6. 对 x86 文件夹重复第 5 步。
        7. 右键单击刚刚添加的 DLL 并选择 PROPERTIES。在“复制到输出目录”选项中,选择“始终复制”。
        8. 对 x64 和 x86 文件夹中的两个 DLL 重复第 7 步。

        下次您构建项目并将其带到另一台计算机上时,它应该可以正常工作。

        【讨论】:

        • 对我来说安装 SQLite.Core 就足够了
        【解决方案9】:

        我发现当我允许 Nuget 将 SQLite 更新到 1.0.115.5 时,我的项目不再需要“SQLite.Interop.dll”。

        【讨论】:

          【解决方案10】:

          我自己也遇到过这个问题,后来发现是另外一个原因:

          System.DllNotFoundException was caught 
          Unable to load DLL 'SQLite.Interop.dll': Access is denied. 
          

          在这种情况下,代码是(间接)从 IIS 托管的 Web 服务调用的(配置为 x86 构建)。我终于将其追踪到 IIS 中的应用程序池:最初我使用的是 "ASP.NET V4.0 Integrated" (导致该错误),但是当我将其更改为 “DefaultAppPool”,问题就解决了。

          (呼!)

          【讨论】:

          • 我正在使用 DefaultAppPool 并出现错误,请轻举妄动!
          【解决方案11】:

          所以,我的问题是 SQLite 试图在 WPF 的设计时加载。由于我只关心 x86 环境,因此我将 CPU 首选项设置为该环境,并将 SQLite.Interop.dll 从 Nuget 包复制到解决方案的根目录。重新启动解决方案,所有问题都消失了。因此,如果您遇到设计时问题,请将库放入解决方案的根目录。

          此外,我在运行时遇到了类似的问题,因此我必须将 SQLite.Interop.dll 的副本放入我的项目中,并在属性中将其设置为副本。似乎提供的 x86 和 x64 文件夹完全没用。需要进一步调查,但总的来说......在项目中手动引用 SQLite 比使用 Nuget 包更容易。

          此外,官方常见问题解答说明如下:

          (20) System.Data.SQLite 项目编译运行时 在 Visual Studio 中,为什么会出现 DllNotFoundException 或 BadImageFormatException(对于“sqlite3.dll”或“SQLite.Interop.dll”) 尝试运行或调试应用程序时?

          在 Visual Studio 中编译和运行解决方案时, 使用 System.Data.SQLite 项目(包括测试项目),它 选择正确的构建配置和 平台。首先,要在 Visual 中调试的托管应用程序 Studio 不能使用混合模式程序集(即因为它总是 编译到特定于平台的构建输出目录)。这是 需要正确支持为多个平台构建二进制文件 使用相同的源项目文件。因此,只有 “DebugNativeOnly”或“ReleaseNativeOnly”构建配置应该 从 Visual 内部运行托管应用程序时选择 Studio 依赖于 System.Data.SQLite 程序集。这些建 配置包含一个自定义的构建后步骤,该步骤复制 托管输出目录所需的本机程序集(即 启用就地运行托管二进制文件)。然而,这 只有在选定的平台上才会执行构建后步骤 与操作系统匹配(例如 32 位 Windows 的“Win32” 和“x64”用于 64 位 Windows)。因此,最好的做法是 根据操作系统仔细检查选定的构建平台 在尝试在解决方案中运行托管项目之前。

          https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20

          【讨论】:

            【解决方案12】:

            我的也不适用于单元测试,并且由于某种原因,Michael Bromley 对 DeploymentItem 属性的回答不起作用。但是,我使用测试设置让它工作。在 VS2013 中,将新项目添加到您的解决方案并搜索“设置”并选择“测试设置”模板文件。将其命名为“SqliteUnitTests”或其他名称并打开它。选择右侧的“部署”,然后添加目录/文件。将路径/目录添加到 SQLite.Interop.dll 文件。对我来说,我添加了两条路径,分别用于 Project\bin\Debug\x64 和 Console\bin\Debug\x86。您可能还想添加 Sqlite 文件,具体取决于您希望单元测试/解决方案如何访问该文件。

            【讨论】:

              【解决方案13】:

              扩展对我有用的 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
              
              1. 从主项目的“packages.config”xml 文件中删除 Xml 引用。

              这对我有用,并保持我的项目干净。

              【讨论】:

                【解决方案14】:

                在 SQLLite Core 的 Nuget 包 中有一个文件 System.Data.SQLite.Core.targets 。只需将其包含在使用此库的所有项目以及使用您的库的所有库中即可。

                在您的 .csproj 或 .vbproj 文件中添加: 每次在 bin 中编译时,都会在 x86 和 x64 目录中添加 SQLite.Interop.dll 文件。

                【讨论】:

                  【解决方案15】:

                  刚刚为我工作过:Install-Package System.Data.SQLite.Core 在包管理器控制台上。

                  【讨论】:

                    【解决方案16】:

                    我在这里尝试了几乎所有的解决方案,但没有任何运气。最后通过将与我选择的平台对应的 SQLite.Interop.dll 的副本直接放在我的安装项目的根目录下来解决它。

                    我不知道为什么它会起作用,但它确实起作用了。

                    【讨论】:

                      【解决方案17】:

                      超过 30 个答案,但我以不同的方式解决了它。

                      我有 2 个独立的项目。一个 Windows 服务和一个 Windows 窗体应用程序。该应用程序引用了 WS 项目,并且都引用了 SQLite Core nuget 包。

                      在构建 WS 项目时,x64 和 x32 文件夹就在那里。但是在构建应用程序时,文件夹不显示。

                      在这里检查答案,我无法使它们起作用。但我发现以下 sn-p 存在于 WS 项目中,而在 App 项目中则缺失。我添加了它,文件夹现在可以正确显示。

                      <Import Project="..\packages\System.Data.SQLite.Core.1.0.112.0\build\net46\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.112.0\build\net46\System.Data.SQLite.Core.targets')" />
                      

                      【讨论】:

                        猜你喜欢
                        • 2018-10-17
                        • 1970-01-01
                        • 2018-03-02
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多