c# - “无法在 DLL 'SQLite.Interop.dll' 中找到名为 'sqlite3_open_interop' 的入口点。”
问题描述
我正在使用 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 工作的人的帮助!
解决方案
虽然它是一个旧线程,但其他人可能会再次面临类似的问题。就我而言,当我尝试使用密码创建连接字符串时会发生此错误,因为在最新版本的 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
推荐阅读
- python - 如何将列表中的每个项目连接到特定的 URL?
- mysql - 使用紧凑的 laravel 显示数据
- java - 如何修复 Netbeans 中的“未找到 Log4j 2 配置文件”?
- python - 如何在烧瓶应用程序的索引页面中访问另一个网页?
- sql - 连接两个有时缺少连接值的表
- django - POST HTTP 方法在 Apache 和 Django2 生产中出现 500 内部服务器错误
- php - Laravel 5.5 Unknown database type enum requested Doctrine\DBAL 可能不支持
- android - ClassNotFoundException:找不到类“androidx.navigation.NavController$OnNavigatedListener”
- haskell - Haskell - 投影函数的快速命名
- c# - VS 2019 上的 WPF .NET Core 安装程序