“在 DLL 'SQLite.Interop.dll' 中找不到名为 'sqlite3_open_interop' 的入口点。”

Sci*_*sol 6 c# sqlite system.data.sqlite

我正在使用 C# 应用程序尝试连接到 SQLite 数据库。该应用程序使用库 System.Data.Sqlite,版本 108。在 Visual Studio 2017 中,我的解决方案配置是调试,我的解决方案平台是任何 CPU。每当我构建并运行应用程序时,我都会收到以下运行时异常:

在此输入图像描述

异常未处理,应用程序终止。

当然,我的 bin\Debug 目录中有一个 SQLite.Interop.dll 文件。(如果没有,例外情况会有所不同。)具体来说,有两个,每个都位于各自名为 x64 和 x86 的子目录中。我的假设是正在使用 x86 目录中的文件,因为解决方案平台设置为任何 CPU。SQLite.Interop.dll 程序集的版本与 System.Data.SQLite.dll 的版本匹配,为 1.0.108.0。

当我使用以下命令询问程序集时:

dumpbin /exports SQLite.Interop.dll
Run Code Online (Sandbox Code Playgroud)

我确实在 x64 版本的程序集的输出中找到了以下行:

175   AE 00040750 sqlite3_open_interop
Run Code Online (Sandbox Code Playgroud)

但在 x86 版本的输出中我没有。相反,我找到了这一行:

175   26 00037F10 _sqlite3_open_interop@20
Run Code Online (Sandbox Code Playgroud)

很接近,但不匹配。所以程序集确实没有暴露sqlite3_open_interop这样的方法。

我尝试了将解决方案平台更改为 x64 的明显解决方案,但该更改导致了另一个异常 (BadImageFormatException),我不太想应对它。

我尝试删除对 System.Data.SQLite 的引用并使用 Nuget 添加最新版本 1.0.111.0,然后清理并重建解决方案,但都没有效果。同样的问题再次出现。

有人能建议解决这个问题吗?我相信 SQLite 被广泛使用,所以我必须认为有一种方法可以解决它。

*Edit1:我在我的家用计算机上尝试了这个项目,并观察到两个 SQLite.Interop.dll 文件之间存在相同的差异。x64 版本有一个 sqlite3_open_interop,而 x86 版本有一个 _sqlite3_open_interop@20。然而问题并没有出现在那里。所以显然这个被破坏的名字“问题”是一个转移注意力的话题。我仍然对解决这个问题非常感兴趣,并且感谢从事 System.Data.Sqlite 工作的人的帮助!

小智 7

删除 x64 和 x86 目录,然后进行构建。当安装程序进行 NuGet 检查时,它会将正确的版本放入文件夹中。由于某种原因,当您升级到较新版本时,x64 和 x86 文件夹不会更新这些文件夹中的互操作文件(如果已存在)。


Sci*_*sol 2

事实证明,问题在于该程序集被 McAfee Host Intrusion Prevention 以某种方式阻止或中断。活动日志有以下消息:

攻击类型:DISA McAfee - 防止意外 DLL 文件在用户 AppData 和 ProgramData 文件夹中运行(Sig Id = 7020)

这很奇怪,因为我认为我的程序没有在任何一个这样的文件夹中执行;事实上,没有这样的文件夹,因为我正在查看这个问题。我通过将程序移至“我的文档”来解决该问题。

还值得注意的是,该异常并没有暗示安全扫描仪的干扰。

叹。我不知道这个答案有多大用处,但我将其留在这里。它可能对某人有帮助。如果管理员认为合适,可以将其删除。