我能够在我的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,带有所有最新更新。
这是显示文件的app文件夹的屏幕截图。
更新
基于@Plutonix的评论,下面的屏幕截图显示了对我的项目的引用。缺少System.Data.SQLite.Core
,其中包含互操作文件。每个.Net版本和OS类型都有不同的版本,因此,我不能只浏览packages文件夹内的文件夹,这是一个可怕的黑客。应该有一种干净的方法来添加引用。
出于记录目的,我短暂地想到了该文件,但是我没有看到它,或者核心版本1.08没有使用它,但是我想它确实有用。
注意:我将SQLite.Interop.dll
文件手动复制到了VM,并加载了项目。 Procman
并不是很有帮助,也许信息太多了,尽管我过滤掉了我的应用程序以外的所有内容。无论如何,问题在于如何获得对SQLite核心的引用。
更新2
烦人的是,从NuGet卸载所有sqlite组件,然后重新安装SQLite并不会在项目中添加引用核心。
更新3
This SO文章(在答案中)指出了问题所在。基本上,无论出于何种混乱的原因,NuGet都会正确地“需要”内核,但随后却不执行任何操作。因此,NuGet不会分发所需的文件。我看到了“复制” X86 / X64文件夹等的答案。
我将其命名为NuGet SQLite软件包中的严重缺陷/错误。是的,如果您知道答案,那么这个问题就有点像所引用问题的重复,但我没有,所以不是。我从未在互操作DLL上收到任何错误消息。
答案 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
这是屏幕截图。
注意
我还想到了包含DLL的项目文件的条件逻辑,但是它比简单的RoboCopy更复杂。