"Unable to find an entry point named 'sqlite3_open_interop' in DLL 'SQLite.Interop.dll'."

"Unable to find an entry point named 'sqlite3_open_interop' in DLL 'SQLite.Interop.dll'."

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

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

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

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

dumpbin /exports SQLite.Interop.dll

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

175   AE 00040750 sqlite3_open_interop

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

175   26 00037F10 _sqlite3_open_interop@20

接近,但不匹配。所以确实没有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。但是,那里没有出现问题。很明显,这个损坏的名字 "issue" 是一个转移注意力的问题。我仍然对解决这个问题很感兴趣,并希望得到 System.Data.Sqlite!

工作人员的帮助

事实证明,问题是程序集被 McAfee Host Intrusion Prevention 以某种方式阻止或中断。 Activity 日志包含以下消息:

Attack type: DISA McAfee - Prevent unexpected DLL files from Running in User AppData and ProgramData folders (Sig Id = 7020)

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

同样值得注意的是,该异常没有暗示安全扫描器的干扰。

唉。我不知道这个答案有多普遍有用,但我会把它留在这里。它可能会帮助某人。管理员认为合适的可以删除它。

虽然这是一个旧线程,但其他人可能会再次遇到类似的问题。就我而言,当我尝试使用密码创建连接字符串时会发生此错误,因为在最新版本的 sqlite 中,ecnryption 是一项付费功能,这就是它在免费版本中不起作用的原因。所以,为了规避这个问题,我恢复了旧版本的 sqlite(从我的旧项目中挑选)并且它工作正常。

在您的项目中添加以下引用:

  • System.Data.SQLite.dll

复制二进制文件夹中的以下文件:

  • System.Data.SQLite.dll.config(可选)

  • System.Data.SQLite.xml(可选)

  • x64\SQLite.Interop.dll

  • x86\SQLite.Interop.dll

其中 'x64' 和 'x86' 是文件夹

  • nuget 上可用的包有同样的问题所以你需要旧的 dll