SQLite.SQLite3:异常 System.DllNotFoundException

Sar*_*ger 5 c# sqlite exception visual-studio

我能够在我的开发盒上构建并执行我的 Winforms 应用程序,但是当我尝试在另一个干净的盒(虚拟机)上运行我的应用程序时,我遇到了此错误。

Application: MyApp.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.DllNotFoundException
   at System.Data.SQLite.UnsafeNativeMethods.sqlite3_config_none(System.Data.SQLite.SQLiteConfigOpsEnum)
   at System.Data.SQLite.SQLite3.StaticIsInitialized()
   at System.Data.SQLite.SQLiteLog.Initialize()
   at System.Data.SQLite.SQLiteConnection..ctor(System.String, Boolean)
   at System.Data.SQLite.SQLiteConnection..ctor()
   at DittoSql.SQL..ctor()
   at MyApp.Program..cctor()

Exception Info: System.TypeInitializationException
   at MyApp.Program.Main(System.String[])
Run Code Online (Sandbox Code Playgroud)

我使用 Nuget 将 SQLite 添加到我的项目中。

使用 NuGet 将 SQLite 添加到项目中

遗憾的是,事件查看器日志没有提供系统找不到的 DLL。我做了研究,发现的一件事是 .Net 兼容性。我当时使用的是 4.6.2,在 SQLite v1.08 上不支持该版本,因此我降级到 .Net 4.6(已列出)。

两台机器都运行 Windows 10 X64 以及所有最新更新。

这是显示文件的应用程序文件夹的屏幕截图。

显示 SQLite 文件的应用程序文件夹

更新

根据 @Plutonix 的评论,这里是一个屏幕截图,显示了对我的项目的引用。缺少System.Data.SQLite.Core,其中包含互操作文件。每个.Net版本和操作系统类型都有不同的版本,所以我不能只浏览packages文件夹内的文件夹,除此之外,这是一个可怕的黑客行为。应该有一种干净的方法来添加引用。

项目引用缺少 System.Data.SQLite.Core

作为记录,我简要地想到了该文件,但我没有看到它或核心,并认为 1.08 版本没有使用它,但我猜它确实如此。

注意:我SQLite.Interop.dll手动将文件复制到虚拟机并加载项目。Procman没有那么有帮助,也许信息太多,尽管我过滤掉了除我的应用程序之外的所有内容。无论如何,问题是如何获得 SQLite 核心的引用。

更新2

从 NuGet 卸载所有 sqlite 组件然后重新安装 SQLite 不会在项目中添加对核心的引用,这很烦人。

更新3

这篇SO 文章(在答案中)说明了这个问题。基本上,NuGet 出于任何混乱的原因正确地“需要”核心,但随后不对它执行任何操作。因此,NuGet 不会分发所需的文件。我看到“复制”X86/X64文件夹等的答案。

我将其称为 NuGet SQLite 包中的一个严重缺陷/错误。是的,如果您知道答案,那么这个问题就有点像所引用问题的重复,但我不知道,所以它不是。我从未收到过有关互操作 DLL 的任何错误消息。

Sar*_*ger 1

(我希望有人能提出更好的答案,因为我的答案是一个黑客。)

在出现真正优雅且正确的解决方案之前,我想到了这个解决方法。将以下内容添加到Post-build event command line" on项目设置的“构建事件”选项卡中。

使用我的命令行的任何人显然都必须设置net46为项目中使用的 .Net 版本并设置 SQLite 版本,这里1.0.108.0设置为任何版本。

robocopy "$(ProjectDir)\..\packages\System.Data.SQLite.Core.1.0.108.0\build\net46\$(PlatformName)" $(TargetDir) SQLite.Interop.dll
Run Code Online (Sandbox Code Playgroud)

这是一个屏幕截图。

显示 robocopy 的构建后事件

笔记

我还想到了包含 DLL 的项目文件的条件逻辑,但这比简单的 RoboCopy 更复杂。