Visual Studio C# - 找不到SQLite.Interop.dll

时间:2016-07-26 16:05:59

标签: c# sqlite dll visual-studio-2015

我目前正在尝试使用Visual Studio创建一个使用SQLite的C#应用​​程序。我使用NuGet为我的程序安装了SQLite,并且在解决方案资源管理器中出现了三个引用(System.Data.SQLite,System.Data.SQLite.EF6,System.Data.SQLite.Linq)。

当我在VS中执行我的应用程序时,一切正常。但是,每当我发布它(使用ClickOnce)并尝试运行应用程序时,它都会崩溃并出现以下错误: System.DllNotFoundException:无法加载DLL' SQLite.Interop.dll' :找不到指定的模块(HRESULT异常:0x8007007E)

经过一番研究,我在Debug文件夹中找到了这个dll并将其复制到" .exe"创建我的程序版本(在发布和执行" setup.exe"之后)。这样,应用程序运行良好。

但我对此解决方案并不满意,因为它看起来很脏。我不希望将来的用户在安装我的应用时必须手动执行此操作!

因此,我的问题是:我该怎么做才能确保这个dll与我的程序一起安装?

注意:我试过这篇文章的第一个答案: unable to load dll sqlite interop dll WPF 但我似乎没有为我工作。

谢谢!

9 个答案:

答案 0 :(得分:7)

请参阅https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

上的使用本机库预加载

您可能需要在其他SQLite DLL下包含x86和x64文件夹。

编辑:我已添加以下相关信息,以防上述链接死亡/更改。

  

如果开发和客户机器可能有不同的处理器   架构,可能需要多个二进制包。为了这   情况,使用本机库预加载功能是非常高的   推荐的。它从版本1.0.80.0开始提供并启用   默认。为了利用这个功能,单独进行   托管和互操作程序集必须与XCOPY部署一起使用   (即,混合模式组件也不支持此功能   当程序集部署到全局程序集缓存时,产生   在应用程序部署中看起来像这样:

  • bin \ App.exe(可选,仅限托管应用程序可执行文件 组件)
  • bin \ App.dll(可选,仅限托管的应用程序库 组件)
  • bin \ System.Data.SQLite.dll(必需的,仅限托管的核心 组件)
  • bin \ System.Data.SQLite.Linq.dll(可选,仅限托管 LINQ程序集)
  • bin \ System.Data.SQLite.EF6.dll(可选, 仅管理的EF6组装)
  • bin \ x86 \ SQLite.Interop.dll(必填, x86 native interop assembly)
  • bin \ x64 \ SQLite.Interop.dll(必填, x64 native interop assembly)
  

上面的字符串“bin”表示应用程序所在的目录   二进制文件将部署在目标计算机上。与原生   启用库预加载功能和应用程序部署   如上所示,System.Data.SQLite仅托管程序集将尝试   自动检测当前的处理器架构   处理并预加载适当的本机库。

答案 1 :(得分:5)

默认情况下,dll sqlite.interop.dll没有附带SQLite的NuGet安装。要解决此问题,您需要添加dll,x86和x64。 在SQLite网站下载包含必要dll的包。在分发之前将它们安装在客户端或将这些dll复制到您的项目中。

答案 2 :(得分:5)

我在Visual Studio 2017和.NET Framework 4.5的环境中也遇到了类似的问题,情况是:

我正在使用ClickOnce开发Outlook Add Ins以将其发布并将SQLite作为数据库发布。从NuGet将SQLite库安装到项目中后,它在本地环境中完美运行,但在客户端计算机上弹出异常错误消息“无法加载DLL'SQLite.Interop.dll'。”

我对这两个环境进行了比较,发现DLL文件“SQLite.Interop.dll”尚未发布到我们可以在下图中看到的客户端计算机上。 enter image description here

我在本地环境中搜索了“SQLite.Interop.dll”,发现它保存在以下文件夹“{project} \ packages \ System.Data.SQLite.Core.1.0.105.2 \ build \”中。 Net FrameWork enter image description here

所以,我的解决方案是将这两个DLL库添加到项目中,然后使用ClickOnce将它们发布到客户端计算机。 enter image description here

(注意:所选的DLL版本应与您环境中的.NET Framework版本相同。)

答案 3 :(得分:4)

请使用重复问题的答案:https://stackoverflow.com/a/60176344/3634867

不要自己存储dll并将其手动复制到/ bin,它将失去对版本更新和依赖的控制。

TL; DR;

对于旧的csproj文件:

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

对于新的csporj文件:(即,以<Project Sdk="Microsoft.NET.Sdk.*">开头的项目)

<PackageReference Include="System.Data.SQLite.Core" Version="1.0.110" PrivateAssets="none"/>

答案 4 :(得分:1)

将System.Data.SQLite.Core Nuget软件包升级到版本1.0.109.2修复了我的错误。

答案 5 :(得分:0)

如果是可安装文件。即,如果您正在创建安装文件,则必须手动将dll添加到主输出文件。

转到安装项目的属性,在配置设置中,选择先决条件SQLLite,选择(Checkbox)从项目位置安装它。

看看这是否解决了您的问题。

答案 6 :(得分:0)

“注意:我尝试了这篇文章的第一个答案:无法加载dll sqlite interop dll WPF但是我似乎没有为我工作。”

我也试过了,终于让它运转了。但重要的是:

  1. 将sqlite.interop.dll作为现有项插入到您要构建的项目的根目录中。
  2. 在该文件的属性中,确保其构建处理是“内容”(不是建议的嵌入资源),当然,也始终复制到输出目录。
  3. 希望有助于击败那个烦人的错误。

答案 7 :(得分:0)

System.Data.SQLite nuget软件包包括一个Build文件夹,该文件夹带有一个目标文件,该文件将复制这些互操作dll。为了解决这个问题,我们必须告诉项目我们将其打包到我们自己的nuget中,而不要排除此构建目标/文件夹。

如果您要确保不包括分析器,则我们的项目(打包并在其他地方使用的项目)需要具有PrivateAssets =“ None”或PrivateAssets =“ Analyzers”。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
    <RootNamespace>MyNamespace</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="ServiceStack.OrmLite.Sqlite.Core" Version="5.6.0" />
    <PackageReference Include="System.Data.SQLite.Core" Version="1.0.111"  PrivateAssets="Analyzers" />
   </ItemGroup>

</Project>

答案 8 :(得分:0)

SQlite.Interop不可引用,您必须:

  
      
  1. 在VS项目中添加现有文件:Sqlite.Interop.dll实际   位置是。\ bin \ Debug \ x86或\ bin \ Debug \ x64

  2.   
  3. 选择属性并在“内容”中设置“编译操作”并复制   到输出目录=“始终复制”

  4.   
  5. 重建

  6.