SQLite.SQLite3:异常System.DllNotFoundException

时间:2018-07-26 20:22:15

标签: c# visual-studio sqlite exception

我能够在我的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添加到我的项目中。

SQLite added to project using NuGet

遗憾的是,事件查看器日志未提供系统找不到的DLL。我进行了研究,发现的一件事是.Net兼容性。我当时是4.6.2,在SQLite v1.08上不支持,所以我降级为列出的.Net 4.6。

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

这是显示文件的app文件夹的屏幕截图。

Application folder showing SQLite files

更新

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

Project references missing System.Data.SQLite.Core

出于记录目的,我短暂地想到了该文件,但是我没有看到它,或者核心版本1.08没有使用它,但是我想它确实有用。

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

更新2

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

更新3

This SO文章(在答案中)指出了问题所在。基本上,无论出于何种混乱的原因,NuGet都会正确地“需要”内核,但随后却不执行任何操作。因此,NuGet不会分发所需的文件。我看到了“复制” X86 / X64文件夹等的答案。

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

1 个答案:

答案 0 :(得分:0)

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

我想出了一种解决方法,直到真正的优雅和适当的解决方案出现。将以下内容添加到项目设置的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

这是屏幕截图。

Post Build Events Showing robocopy

注意

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