首页 > 解决方案 > SQLite.SQLite3:异常 System.DllNotFoundException

问题描述

我能够在我的开发框上构建和执行我的 Winforms 应用程序,但是当我尝试在另一个干净的框(VM)上运行我的应用程序时遇到了这个错误。

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[])

我使用 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 版本和操作系统类型都有不同的版本,所以我不能只浏览包文件夹中的文件夹,此外这是一个可怕的 hack。应该有一种干净的方式来添加引用。

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

为了记录,我短暂地想到了那个文件,但我没有看到它,或者核心和计算版本 1.08 没有使用它,但我猜它确实使用了它。

注意:我手动将文件复制SQLite.Interop.dll到 VM 并加载了项目。Procman虽然我过滤掉了除我的应用程序之外的所有内容,但可能没有太多帮助。无论如何,问题是如何获得对 SQLite 核心的引用。

更新 2

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

更新 3

这篇SO 文章(在答案中)说明了这个问题。基本上,无论出于何种原因,NuGet 都正确地“需要”核心,但随后什么也不做。因此,NuGet 不会分发所需的文件。我看到了“复制”X86/X64 文件夹等的答案。

我首先将其命名为 NuGet SQLite 包中的一个严重缺陷/错误。是的,如果你知道答案,这个问题就变成了引用问题的重复,但我不知道,所以不是。我从未收到有关互操作 DLL 的任何错误消息。

标签: c#visual-studiosqliteexception

解决方案


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

在一个真正优雅和适当的解决方案出现之前,我想到了这个解决方法。将以下内容添加到Post-build event command line" on项目设置的 Build Events` 选项卡中。

显然,任何使用我的命令行的人都必须设置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

这是一个屏幕截图。

显示 robocopy 的构建后事件

笔记

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


推荐阅读