c# - 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 添加到我的项目中。
遗憾的是,事件查看器日志没有提供系统找不到的 DLL。我做了研究,发现的一件事是 .Net 兼容性。我在 4.6.2,在 SQLite v1.08 上不支持,所以我降级到列出的 .Net 4.6。
两台机器都运行带有所有最新更新的 Windows 10 X64。
这是显示文件的应用程序文件夹的屏幕截图。
更新
根据@Plutonix 的评论,这里是显示对我的项目的引用的屏幕截图。缺少的是System.Data.SQLite.Core
,其中包含互操作文件。每个 .Net 版本和操作系统类型都有不同的版本,所以我不能只浏览包文件夹中的文件夹,此外这是一个可怕的 hack。应该有一种干净的方式来添加引用。
为了记录,我短暂地想到了那个文件,但我没有看到它,或者核心和计算版本 1.08 没有使用它,但我猜它确实使用了它。
注意:我手动将文件复制SQLite.Interop.dll
到 VM 并加载了项目。Procman
虽然我过滤掉了除我的应用程序之外的所有内容,但可能没有太多帮助。无论如何,问题是如何获得对 SQLite 核心的引用。
更新 2
从 NuGet 卸载所有 sqlite 组件然后重新安装 SQLite 不会在项目中添加对核心的引用,这很烦人。
更新 3
这篇SO 文章(在答案中)说明了这个问题。基本上,无论出于何种原因,NuGet 都正确地“需要”核心,但随后什么也不做。因此,NuGet 不会分发所需的文件。我看到了“复制”X86/X64 文件夹等的答案。
我首先将其命名为 NuGet SQLite 包中的一个严重缺陷/错误。是的,如果你知道答案,这个问题就变成了引用问题的重复,但我不知道,所以不是。我从未收到有关互操作 DLL 的任何错误消息。
解决方案
(我希望有人想出一个更好的答案,因为我是一个黑客。)
在一个真正优雅和适当的解决方案出现之前,我想到了这个解决方法。将以下内容添加到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
这是一个屏幕截图。
笔记
我还想到了包含 DLL 的项目文件的条件逻辑,但这比简单的 RoboCopy 更复杂。
推荐阅读
- eigen - RcppEigen LLT 产生一个 NaN 向量
- javascript - 对数组的引用在推送操作后返回它的长度
- c# - C# AJAX 序列化 JSON 返回在 Internet Explorer 中不起作用
- c# - 使用 Base64 字符串作为图像 url 的 Azure LUIS Bot 不起作用
- php - 如何在 PHP 扩展中声明 Closure `function use`?
- reactjs - 如何通过反应使x轴标签在d3中工作?
- php - 登录php和mysqli
- xamarin - 如何计算 SQLite Query Xamarin Forms 的结果?
- wordpress - Jetpack 一直在我的一个博客上加载
- python-3.x - AppEng Py Flexi :: 长时间运行的请求 :: 502 错误