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

问题描述 投票:0回答:5

我正在使用 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

我确实在 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。然而,问题并没有发生在那里。所以显然这个被破坏的名字“问题”是一个转移注意力的话题。我仍然对解决这个问题非常感兴趣,并且感谢从事 System.Data.Sqlite 工作的人的帮助!

c# sqlite system.data.sqlite
5个回答
7
投票

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


3
投票

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

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

  • 系统.Data.SQLite.dll

将以下文件复制到二进制文件夹中:

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

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

  • x64\SQLite.Interop.dll

  • x86\SQLite.Interop.dll

其中“x64”和“x86”是文件夹

  • nuget 上可用的软件包也有同样的问题,因此您需要旧的 dll

2
投票

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

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

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

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

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


0
投票

我遇到了一个非常相似的问题。我知道我迟到了,而且我面临的问题有所不同,但我想有人可能会发现这很有用。我的问题陈述是“无法在 DLL 'SQLite.Interop.dll' 中找到名为 'sqlite3_config' 的入口点。”

我刚刚检查了我的 SQLite NuGet 包版本。您可以在 cs.proj 文件中找到它。看起来像这样:

<Reference Include="System.Data.SQLite, Version=1.0.115.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
  <HintPath>..\packages\System.Data.SQLite.Core.1.0.115.1\lib\net451\System.Data.SQLite.dll</HintPath>
</Reference>

只需为 x86 和 x64 文件夹找到具有相似或旧版本的 SQlite.interop.dll 文件。通过设置项目使其成为您构建的一部分。


0
投票

我的问题是同一主机应用程序 (AutoCAD) 中的 2 个不同插件引用了不同版本的 SQLite DLL。他们需要引用相同的版本。

© www.soinside.com 2019 - 2024. All rights reserved.