【问题标题】:Visual Studio C# - SQLite.Interop.dll not foundVisual Studio C# - 找不到 SQLite.Interop.dll
【发布时间】:2016-07-26 16:05:58
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


【解决方案1】:

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

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

我比较了两个环境,发现 DLL 文件“SQLite.Interop.dll”没有发布到客户端机器上,如下图所示。

我在本地环境中搜索了“SQLite.Interop.dll”,发现它保存在以下文件夹“{project}\packages\System.Data.SQLite.Core.1.0.105.2\build\”中,用于特定的.网络框架

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

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

【讨论】:

  • 解决方案适用于为两个 dll 设置的“始终复制”参数。谢谢!
  • 这是迄今为止我见过的最好的解决方案。感觉比将 System.Data.Sqlite 包添加到主项目更干净。仍然不漂亮,但我认为它更好。应该是this more prominent Q/A 上的回答。
【解决方案2】:

请参阅 使用原生库预加载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 本机互操作程序集)
  • bin\x64\SQLite.Interop.dll(必需, x64 本机互操作程序集)

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

【讨论】:

  • 感谢您的帮助!我将 x86 文件夹中的 dll 文件作为现有元素包含在我的项目中,并将其设置为“始终复制”,现在当我发布我的应用程序时它似乎可以正常工作!
  • 为我工作。包含 NUGET 包“SQLite”和“System.Data.SQLite.Core”,然后在项目中包含文件夹 bin\x86 和 bin\x64。之后部署没有错误。 +1
【解决方案3】:

请使用重复问题的答案: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 文件:(即以 &lt;Project Sdk="Microsoft.NET.Sdk.*"&gt; 开头的项目)

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 它实际上是 Nuget 安装附带的
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      如果它是一个可安装的文件。即,如果您正在创建设置文件,那么您必须手动将 dll 添加到主输出文件中。

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

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

      【讨论】:

      • 感谢您的帮助!可悲的是,我在先决条件列表中找不到 SQLite,只有 SQL Server……我错过了什么吗? (我对VS很陌生,我的版本是法语的,这对寻找菜单没有帮助)
      【解决方案7】:

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

      我也试过了,终于成功了。然而,重要的是:

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

      希望这有助于解决这个烦人的错误。

      【讨论】:

        【解决方案8】:

        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>
        

        【讨论】:

          【解决方案9】:

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

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

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

          3. 重建

          【讨论】:

            【解决方案10】:

            另一种解决方案可能是使用 System.Data 中的 System.Data.SQLite.Core.targets 脚本文件替换 xcopy post build .SQLite.Core 包用于执行此操作。 这是我的工作 csproj 文件:

            【讨论】:

              猜你喜欢
              • 2016-03-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-10-03
              • 1970-01-01
              • 1970-01-01
              • 2020-05-01
              • 2022-01-16
              相关资源
              最近更新 更多