240

我定期收到以下异常:

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

我正在使用 1.0.82.0。版本,在VS2010,操作系统Win7 64中使用nuget安装。

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

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

有没有人看到过这样的事情并且有解决方案吗?

4

47 回答 47

149

我知道我参加聚会迟到了,但在我今天下载最新的 x86/x64(版本 1.0.88.0)后就遇到了这个问题。我在 VS2012 中的本地 IIS 默认运行 32 位,没有简单的方法可以切换到 x64。我的生产服务器运行 64 位。

无论如何,我将 NuGet 包安装到 DLL 项目中,但出现此错误。我必须做些什么才能让它工作,我也必须将它安装到主站点项目中。即使它根本不涉及 SQLite 类。

我的猜测是 SQLite 使用入口程序集来检测要加载的 Interop 版本。

于 2013-09-01T14:03:06.767 回答
82

我遇到了这个问题,因为我使用的 dll 将 Sqlite 作为依赖项(在 NuGet 中配置,只有 Sqlite 核心包。)。该项目编译并复制除“SQLite.Interop.dll”(x86 和 x64 文件夹)之外的所有 Sqlite dll-s。

解决方案非常简单:只需将 System.Data.SQLite.Core 包作为依赖项(使用 NuGet)添加到您正在构建/运行的项目中,然后将复制 dll-s。

于 2015-01-22T15:26:41.657 回答
73

因此,添加 NuGet 后,部署不会复制 Interops。您可以将其添加到您的 csproj 文件中,它应该可以修复该行为:

 <PropertyGroup> 
    <ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles>
    <CopySQLiteInteropFiles>false</CopySQLiteInteropFiles>
    <CleanSQLiteInteropFiles>false</CleanSQLiteInteropFiles>
    <CollectSQLiteInteropFiles>false</CollectSQLiteInteropFiles>
 </PropertyGroup>

如果您查看 NuGet for SQLite 的源代码,您可以看到它们具体在做什么。这使我能够使用 ASP.Net Core 进行部署。

于 2018-02-28T21:54:51.873 回答
51

在平台目标为Any CPU. 我按照以下步骤修复了它:

  1. 在 Visual Studio 中打开项目设计器。可以在此处找到有关如何执行此操作的详细信息。
  2. 单击构建选项卡。
  3. 禁用该prefer 32-bit选项。

或者,您可以将平台目标设置为x86x64。我认为这个问题是由System.Data.SQLite库使用平台目标来获取“SQLite.Interop.dll”文件的位置引起的。

更新:

如果无法联系到项目设计者,只需*.csproj从文本编辑器打开项目 ( ) 文件并将值添加<Prefer32Bit>false</Prefer32Bit><PropertyGroup>...</PropertyGroup>标签中。

示例代码

<PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>[Set by Visual Studio]</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>[Set by Visual Studio]</RootNamespace>
    <AssemblyName>[Set by Visual Studio]</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>[Set by Visual Studio]</FileAlignment>
    <!--Add the line below to your project file. Leave everything else untouched-->
    <Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
于 2013-03-03T20:54:31.217 回答
34

这就是我在项目中修复它的方式。

它工作正常,当一位同事提交他的更改时,我收到“无法加载 DLL 'SQLite.Interop.dll'”异常。

比较项目的 .csproj 文件,这是在非工作版本中:

<ItemGroup>
     <Content Include="x64\SQLite.Interop.dll" />
     <Content Include="x86\SQLite.Interop.dll" />
</ItemGroup>

这就是 WORKING 版本的内容:

<ItemGroup>
     <Content Include="x64\SQLite.Interop.dll">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
      <Content Include="x86\SQLite.Interop.dll">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
</ItemGroup>

恢复后,我没有收到异常。DLL 文件被转储在适当的 Debug\x64 (etc) 文件夹中。

于 2013-09-25T23:52:02.900 回答
27

当您进入此状态时,请尝试执行 Rebuild-All。如果这可以解决问题,您可能会遇到与我相同的问题。

一些背景(我的理解)

  • SQLite 有 1 个托管程序集 (System.Data.SQLite.dll) 和几个特定于平台的程序集 (SQLite.Interop.dll)。使用 Nuget 安装 SQLite 时,Nuget 会将特定于平台的程序集添加到您的项目中(在几个文件夹中:\x86、\x64),并将这些 dll 配置为“始终复制”。

  • 加载后,托管程序集将在 \x86 和 \x64 文件夹中搜索特定于平台的程序集。你可以在这里看到更多。例外是这个托管程序集试图在这些文件夹中找到相关的(SQLite.Interop.dll)(并且失败)。

我的场景

我的解决方案中有 2 个项目;一个 WPF 应用程序和一个类库。WPF 应用程序引用类库,类库引用 SQLite(通过 Nuget 安装)。

我的问题是当我只修改 WPF 应用程序时,VS 尝试进行部分重建(意识到依赖的 dll 没有改变)。在这个过程中的某个地方,VS 清理了 \x86 和 \x64 文件夹的内容(吹走 SQLite.Interop.dll)。当我进行完整的 Rebuild-All 时,VS 会正确复制文件夹及其内容。

我的解决方案

为了解决这个问题,我最终添加了一个使用 xcopy 的 Post-Build 进程,以强制将类库中的 \x86 和 \x64 文件夹复制到我的 WPF 项目 \bin 目录中。

或者,您可以使用构建配置/输出目录做一些更有趣的事情。

于 2014-06-04T17:33:06.777 回答
19

我在运行 Visual Studio Express 2013 时遇到了同样的问题。我尝试了这里和其他地方提到的几种解决方案,但无济于事。我希望此修复对其他人有所帮助。

我通过在测试基于 SQLite 的服务的测试类上使用DeploymentItem属性来修复它。

例子:

[TestClass]
[DeploymentItem(@"x86\SQLite.Interop.dll", "x86")] // this is the key
public class LocalStoreServiceTests
{

    [TestMethod]
    public void SomeTestThatWasFailing_DueToThisVeryIssue()
    {
         // ... test code here
    }
}

这会导致需要SQLite.Interop.dll将其复制到x86相应的“TestResults”文件夹中的目录中。

一切都是绿色的。一切都很好。

于 2014-06-25T14:12:50.067 回答
16

Tools -> Extension and updates从SQLite.Core更新 NuGet并使用PM> Update-Package -reinstall System.Data.SQLite.Core为我修复的命令重新安装它。

于 2015-12-23T15:51:39.933 回答
10

我在多项目解决方案中遇到了类似的问题。SQLite.Interop.dll 对于使用 ClickOnce 与软件一起分发的插件之一是必需的。

至于在 Visual Studio 中调试,一切正常,但部署的版本缺少包含该 DLL 的文件夹 x86/ 和 x64/。

使用 ClickOnce 部署后使其工作的解决方案是在解决方案的启动项目(也是正在发布的项目)中创建这两个子文件夹,将 DLL 复制到其中并将它们设置为始终复制内容。

这样,ClickOnce 发布工具会自动将这些文件和文件夹包含在清单中,并使用它们部署软件

于 2014-05-27T18:56:18.857 回答
9

旧项目文件格式

即项目以<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

将以下内容添加到您的“主”/根项目上的 csproj

<PropertyGroup> 
    <ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles>
    <CopySQLiteInteropFiles>false</CopySQLiteInteropFiles>
    <CleanSQLiteInteropFiles>false</CleanSQLiteInteropFiles>
    <CollectSQLiteInteropFiles>false</CollectSQLiteInteropFiles>
</PropertyGroup>

新的 SDK 项目文件格式

即项目以<Project Sdk="Microsoft.NET.Sdk.*">

将依赖链中的每个 ProjectReference/PackageImport添加PrivateAssets="none"到 System.Data.Sqlite PackageImport

前任:

<PackageReference Include="System.Data.SQLite.Core" Version="1.0.110" PrivateAssets="none"/>
于 2020-02-11T19:49:20.723 回答
8

这里确实有很多答案,但我的答案很简单明了,没有 GAC-playing-around

问题是,可执行文件需要权限(x86 或 x64)的副本SQLite.Interop.dll才能访问我们的数据库。

大多数架构都有层,在我的情况下,数据层具有 SQLite 连接所需的 DLL。

所以我简单地将一个后期构建脚本放入我的数据层解决方案中,一切正常。


TL;博士;

  1. 将解决方案的所有项目设置为x86x64在构建选项中。

  2. 将以下内容添加Post-Build-Script到项目中SQLite nuget Package

    xcopy "$(TargetDir)x64" "$(SolutionDir)bin\Debug\" /y

当然,您必须更改脚本Release Buildx86构建。


STL;博士;

把你的SQLite.Interop.dll下一个*.exe文件。

于 2016-08-30T17:14:56.503 回答
7

NuGet 中 SQLite 的多架构(x86、x64)版本的默认安装展示了您描述的行为。如果您想为 .NET 运行时选择在您的机器上运行您的应用程序的实际体系结构加载正确的版本,那么您可以向 DLL 加载程序提供有关在何处找到正确库的提示,如下所示:

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

    [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));
于 2013-07-09T22:50:36.943 回答
5

即使它是一个旧帖子,我也想分享我在这里找到的解决方案:http: //system.data.sqlite.org/index.html/info/54e52d4c6f

如果您不想阅读所有问题,解决方案是将文件“msvcr100.dll”(可以在 Windows\System32 目录中找到)复制到与 SQLite.Interop.dll 相同的路径中。

我建议阅读该问题以了解原因,并将该文件包含在您的设置中,但仅在发生错误时才安装它,我将其设置为可选组件,可在设置选项中选择。

HTH,福门茨

于 2013-11-22T12:33:52.060 回答
5

我不知道为什么还没有包括在内,但是我必须自己进行研究并找出答案,所以希望有人能找到这个答案并免去麻烦。这是针对 WPF 应用程序的。Unable to load DLL 'SQLite.Interop.dll'它在我的开发盒上运行良好,但在我复制它并出现错误的计算机上不起作用。当我运行它时遇到与 OP 相同的错误时,我将其所有相关目录和文件直接从我的“调试”文件夹移植到另一台计算机。包含我的 DLL 的“bin”文件夹已被复制到“Debug\bin”,并且当我使用此路径复制到另一台计算机时,所有文件以及我的应用程序文件都包含在内,因此它没有丢失任何文件。

我在其他不适用的答案中看到的内容:

  • 我没有使用 NuGet 包,也不需要创建看起来是 NuGet 包创建的 x86 或 x64 文件夹。我的 DLL(System.Data.SQLite 和 SQLite.Interop.dll,以及 System.Data.SQLite.config)位于我项目的“bin”文件夹中,并手动复制(在解决方案资源管理器中创建“bin”文件夹) VS,在 Windows 资源管理器中将 DLL 粘贴到此文件夹中,使用 Add > Existing Item 将文件放入 VS 文件夹/项目中)。然后我在我的项目中使用该位置将它们引用为引用程序集(“引用”>“添加引用”,然后浏览到一个,冲洗,其余部分重复)。这可以确保我的项目确切地知道它们在哪里。
  • 我不需要在我的 app.config 中引用任何 SQLite DLL 文件,甚至不需要触摸我的 MyProject.csproj 文件。
  • 我什至不需要指定特定的处理器!我的项目是为“任何 CPU”构建的,即使我只有混合或 64 位 DLL,并且只能在 64 位操作系统的 Windows 7+ 上运行。(没有 x86-only/32-bit only DLLs)
  • 当我遇到 OP 的错误时,我已经将它们指定为这些 DLL 的“内容”和“如果更新则复制”。

我发现的是这个,来自https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20

(11) 为什么在尝试运行我的应用程序时会出现 DllNotFoundException(对于“sqlite3.dll”或“SQLite.Interop.dll”)?

找不到指定的动态链接库 (DLL),或者由于缺少依赖项而无法加载它。确保命名的动态链接库位于应用程序目录或系统 PATH 沿线的目录中,然后重试。此外,请确保已安装必要的 Visual C++ 运行时可再发行组件,除非您使用的是静态链接到它的动态链接库。

强调我在段落中的粗体部分。目标计算机是新的,除了 .NET 4.0 之外没有加载任何程序。一旦我安装了 C++,它就能够完成对 SQLite 的命令。这应该是第一个常见问题解答和先决条件的一部分,但它被埋在#11。我的开发计算机已经加载了它,因为它带有 Visual Studio,所以这就是它在那里工作的原因。

下载:
Visual Studio 2015 的 Visual C++ Redistributable:
https ://www.microsoft.com/en-us/download/details.aspx?id=48145

更新 3(累积更新):
https ://www.microsoft.com/en-us/download/details.aspx?id=53587

于 2017-02-03T18:56:46.450 回答
5

正如SQLite wiki所说,您的应用程序部署必须是:

应用部署

所以你需要遵守规则。找到与您的目标平台匹配的 dll 并将其放置在图片中描述的位置。Dll 可以在 YourSolution/packages/System.Data.SQLite.Core.%version%/ 中找到。

我在应用程序部署方面遇到了问题,所以我只是在我的项目中添加了正确的 SQLite.Interop.dll,在安装项目中将 x86 文件夹添加到 AppplicationFolder 并添加了对 dll 的文件引用。

于 2017-09-13T06:42:13.297 回答
5

我遇到过同样的问题。请按照以下步骤操作:

  1. 确保您已通过from安装System.Data.SQLite.Core软件包 。SQLite Development TeamNuGet
  2. 转到项目解决方案并尝试在文件夹中找到build文件packages
  3. 检查您的项目框架并选择所需的 SQLite.Interop.dll 并将其放在您的调试/发布文件夹中

参考

于 2020-12-03T07:34:20.767 回答
4

在调试文件夹中复制 x86 和 x64 的“SQLite.Interop.dll”文件。这些文件应复制到调试文件夹中的“x86”和“x64”文件夹中。

于 2017-01-17T15:03:09.397 回答
3

如果您尝试在 64 位项目中运行 32 位 dll,您也可能会收到此错误。

当我在 x86 和 x64 文件夹中放置相同的文件(32 位版本的 SQLite.Interop.dll)时,我得到了这个。

于 2013-11-01T07:50:56.907 回答
3

如果您下载正确的二进制文件,然后根据您的项目构建选项SQLite复制SQLite.Interop.dll到您的ReleaseDebug文件夹中。

于 2014-03-02T07:22:02.293 回答
3

我已经开始使用 Costura.Fody 来打包 (.net) 程序集并嵌入和预加载本机 dll。这也有助于以后分发,因为您可以发送一个文件。

  1. 从 Nuget 安装 Costura Fody。

  2. 在您的 C# 项目中,创建一个名为 costrua32 的文件夹。在那里添加您要加载的 C# 的任何本机 dll。

  3. 将它们添加到此文件夹后。单击属性窗口并将构建操作更改为“嵌入式资源”

  4. 最后,您需要修改名为 FodyWeavers.xml 的 XML 文件,如下所示。在这里,我指定首先加载 sql dll。(注意你删除了.dll)

    Weavers
     Costura
      PreloadOrder
       SQLite.Interop
       tbb_debug
       tbb
      /PreloadOrder>
     /Costura
    /Weavers
    

这样做的好处是您不必编写任何构建前或构建后的事件,并且最终产品完全封装在一个更大的文件中。

于 2015-01-26T15:31:03.633 回答
3

还将dll添加到测试项目(通过Nuget Manager)并修复它。

于 2018-08-29T11:38:34.870 回答
2

会不会有争夺大会的机会?检查是否有另一个应用程序在 DLL 上具有文件锁定。

如果是这个原因,应该很容易使用像Sysinternal 的 Process Explorer这样的工具来发现有问题的程序。

HTH,粘土

于 2012-10-23T18:31:20.417 回答
2

我遇到了这个问题,因为我的 PC 中没有安装 Visual C++ 2010 可再发行组件。如果您尚未安装 Visual c++ 2010 可再发行组件下载并安装它(检查 x86 或 64 dll)。

于 2015-01-25T12:03:54.830 回答
2

我遇到了同样的问题。但是,最后,我可以修复它。目前,我使用 Visual Studio 2013 社区版。我只是使用Add->Existing Item...并浏览到 SQLite.Data.SQLite 文件所在的位置(我的情况是 'C:\Program Files (x86)\System.Data.SQLite\2013\bin')。请不要忘记将要包含的内容类型更改为Assembly Files (*.dll; *.pdb)。在该文件夹中选择“ SQLite.Interop.dll ”。从那时起,我可以毫无问题地继续。祝大家好运。^_^ PS 我创建网络表单应用程序。我还没有尝试过窗体应用程序或其他应用程序。

于 2015-08-16T11:58:42.520 回答
2

在构建之前尝试将平台目标设置为 x86 或 x64(而不是任何 CPU):Visual Studio 中的 Project->Properties->Build->Platform target。

于 2015-12-22T09:50:11.003 回答
2

将 SQLite.Interop.dll 复制到项目目录中。

src\
  project\
      bin\   <-- Past in bin
         x64\
           SQLite.Interop.dll <-- Copy this if 64
         x86\
           SQLite.Interop.dll <-- Copy this if 32
于 2016-09-19T06:39:09.603 回答
2

我为此苦苦挣扎了很长时间,偶尔发现测试设置不正确。看这张图片: 测试设置

我只是取消选中测试设置,问题就消失了。否则会发生异常。希望这会对某人有所帮助。不确定这是根本原因。

于 2016-10-22T10:46:49.003 回答
2

我的应用程序是一个 Web 应用程序 (ASP.NET MVC),我必须将应用程序池更改为LocalSystemApplicationPoolIdentity. 去做这个:

  1. 打开 IIS 管理器
  2. 找到您的站点正在运行的应用程序池。
  3. 单击操作中的高级设置
  4. 将身份更改为LocalSystem

我不知道为什么这可以解决问题。

于 2017-07-28T20:52:13.620 回答
2

升级到 Visual Studio 2019 版本。16.10 对我造成了这个问题,其中 msbuild 报告了 -package 的以下内容System.Data.SQLite.Core

CopySQLiteInteropFiles:
Skipping target "CopySQLiteInteropFiles" because it has no outputs.

https://github.com/dotnet/msbuild/issues/6493

微软表示该错误已通过版本修复。16.10.4。现在只需要等待 AppVeyor 更新他们的 Visual Studio 图像(在那之前可以使用Previous Visual Studio 2019)。

现在 AppVeyor 正在为当前和以前的 Visual Studio 2019-image 使用损坏的 dotnet-build-engine。现在必须显式安装 dotnet sdk ver。5.0.302:

Invoke-WebRequest -Uri 'https://dot.net/v1/dotnet-install.ps1' -UseBasicParsing -OutFile "$env:temp/dotnet-install.ps1"; & $env:temp\dotnet-install.ps1 -Architecture x64 -Version 5.0.302 -InstallDir "$env:ProgramFiles\dotnet"
于 2021-06-21T23:04:15.373 回答
1

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

于 2013-03-31T22:31:30.783 回答
1

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

于 2013-10-17T18:07:38.697 回答
1

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

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

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

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

于 2015-01-08T20:44:53.073 回答
1

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

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

于 2015-02-23T16:57:41.677 回答
1

简而言之

为了使它也能与NCrunch一起工作,我必须将随 NuGet 包提供的 Interop.dll 版本添加为NCrunch 配置中的附加文件

我的情况

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

在我的例子中,Marin 提供的解决方法使它在 Visual Studio 和 CI 中也能正常工作。但是,这仍然会在 NCrunch 中提供错误。

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

..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\**.dll
于 2015-07-20T11:46:16.220 回答
1

由于这个问题的复杂性,我想在这里发布。我的解决方案是回滚到 .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 网络应用程序,在我的旅行中,我发现大量信息仍然引用该框架。

于 2015-08-27T16:22:29.000 回答
1

我的情况有点独特。我在 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。我应该已经阅读了整个错误信息。

经过数小时的谷歌搜索后,我找到了有关如何从 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/

于 2018-09-27T21:57:07.410 回答
1

您确实需要通过 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 ”。

于 2019-09-10T10:53:22.087 回答
1

这对我有用。

  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。

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

于 2020-10-06T20:06:31.617 回答
1

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

于 2021-11-12T11:18:16.900 回答
0

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

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

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

(呸!)

于 2015-07-21T19:41:24.310 回答
0

所以,我的问题是 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”)或调试应用程序?

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

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

于 2015-09-22T05:23:35.600 回答
0

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

于 2015-09-27T02:02:36.240 回答
0

扩展对我有用的 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 引用。

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

于 2016-09-22T11:50:37.147 回答
0

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

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

于 2018-03-06T05:20:55.597 回答
0

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

于 2019-09-06T09:28:42.107 回答
0

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

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

于 2021-09-08T19:41:57.563 回答
0

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

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

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

在这里检查答案,我无法让它们工作。但是我发现以下代码片段存在于 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')" />
于 2021-09-13T23:11:39.637 回答