我目前正在尝试使用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 但我似乎没有为我工作。
谢谢!
答案 0 :(得分:7)
请参阅https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
上的使用本机库预加载您可能需要在其他SQLite DLL下包含x86和x64文件夹。
编辑:我已添加以下相关信息,以防上述链接死亡/更改。
如果开发和客户机器可能有不同的处理器 架构,可能需要多个二进制包。为了这 情况,使用本机库预加载功能是非常高的 推荐的。它从版本1.0.80.0开始提供并启用 默认。为了利用这个功能,单独进行 托管和互操作程序集必须与XCOPY部署一起使用 (即,混合模式组件也不支持此功能 当程序集部署到全局程序集缓存时,产生 在应用程序部署中看起来像这样:
上面的字符串“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”尚未发布到我们可以在下图中看到的客户端计算机上。
我在本地环境中搜索了“SQLite.Interop.dll”,发现它保存在以下文件夹“{project} \ packages \ System.Data.SQLite.Core.1.0.105.2 \ build \”中。 Net FrameWork
所以,我的解决方案是将这两个DLL库添加到项目中,然后使用ClickOnce将它们发布到客户端计算机。
(注意:所选的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但是我似乎没有为我工作。”
我也试过了,终于让它运转了。但重要的是:
希望有助于击败那个烦人的错误。
答案 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不可引用,您必须:
在VS项目中添加现有文件:Sqlite.Interop.dll实际 位置是。\ bin \ Debug \ x86或\ bin \ Debug \ x64
选择属性并在“内容”中设置“编译操作”并复制 到输出目录=“始终复制”
重建