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

6

我正在使用C#应用程序尝试连接SQLite数据库。应用程序使用System.Data.Sqlite库,版本为108。在Visual Studio 2017中,我的解决方案配置为Debug,解决方案平台为Any CPU。每当我构建和运行应用程序时,都会出现以下运行时异常:

enter image description here

异常没有被处理,应用程序将终止。

当然,在我的bin\Debug目录中有一个SQLite.Interop.dll文件。(如果没有,则异常将不同。)具体地说,有两个,分别位于名为x64和x86的自己的子目录中。我的假设是,由于解决方案平台设置为Any CPU,因此将使用x86目录中的文件。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被广泛使用,所以我必须想办法解决这个问题。

*编辑1:我在家里的电脑上尝试了这个项目,并观察到两个SQLite.Interop.dll文件之间的相同差异。x64版本有一个sqlite3_open_interop,而x86版本有一个_sqlite3_open_interop@20。然而,在那里没有出现这个问题。因此,这个名字混淆的问题似乎是一个红色诱饵。我仍然非常希望解决这个问题,并感谢那些在System.Data.Sqlite工作的人能够提供帮助!


1
BadImageFormatException是由于尝试加载不兼容的库引起的,因此我认为当您将平台设置为x64时,加载的库是x86。请注意,在导入库时要匹配它们的平台。Any CPU并不特指x86。要将其设置为x86,请转到项目属性->生成->平台目标=x86。 - Sohaib Jundi
感谢您的回复。我不知道您所说的“已加载库为x86”是什么意思。是指在内存中加载吗?更改平台是在应用程序运行期间尝试过,而不是在运行期间进行更改。当运行时,平台目标明确设置为x64。 - Scitosol
4个回答

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

3
虽然这是一个旧帖子,但其他人可能会再次遇到类似的问题。在我的情况下,当我尝试使用密码创建连接字符串时,就会出现此错误,因为在最新版本的sqlite中,加密已成为一项付费功能,这就是为什么它在免费版本中不起作用的原因。因此,为了解决这个问题,我恢复了旧版本的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。

1
我自己遇到了这个问题,你的帖子解决了我的问题。我一开始使用的是SQLLite版本1.0.115,然后更新到了1.0.115.5,然后就开始看到了这个错误。重新安装了1.0.115版本,问题就消失了。向你致敬。 - Dion
1
这可能解决了如何获得一个可用的SQLite安装的问题,但它并没有解决如何让SQLite版本1.0.116正常工作的问题。 - Tim Makins
感谢@TimMakins的反馈。我认为在我的答案中已经提到了这是一个付费功能,所以如果您想使用116或最新版本,则必须获取付费许可证。 - S.ATTA.M

2
问题原来是由于McAfee Host Intrusion Prevention堵塞或干扰程序集。活动日志显示以下消息:
攻击类型: DISA McAfee - 防止在用户AppData和ProgramData文件夹中运行意外DLL文件(Sig Id = 7020)
这很奇怪,因为我不认为我的程序在任何这样的文件夹中执行;事实上,就我所知,没有这样的文件夹。我通过将程序移动到“我的文档”中来解决了这个问题。
值得注意的是,在安全扫描器没有干扰的情况下,该异常没有给出任何提示。
叹气。我不知道这个答案有多么有用,但我会留在这里。如果管理员认为适当,他们可以删除它。

1
继续讲述我在使用这个汇编语言时的经验,如果SQLite.Interop.dll和System.Data.SQLite不在同一个输出目录中,你也会遇到这个异常(“无法在DLL 'SQLite.Interop.dll'中找到名为'sqlite3_open_interop'的入口点。”)。我将前者放在了相对于后者的子目录中。如果你发现异常的源是System.Data.SQLite,那可能就是问题所在了。SQLite.Interop.dll在子目录中的原因是有x86和x64版本,我曾经认为我可能需要两个版本。但现在我只会选择x86版本。 - Scitosol

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文件。通过安装项目将其纳入您的构建过程中即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接