C# sqlite 无法加载 sqlite3.dll
C# sqlite Unable to load sqlite3.dll
我已经使用 nuget 安装了 sqlite-net
和 System.Data.SQLite (x86/x64)
。我已经重建并重新启动,但仍然收到以下错误:Unable to load DLL 'sqlite3': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
。这是触发它的行:
db = new SQLiteConnection("Data Source=C:\Users\xxxxxxx\Desktop\mydb.sqlite;Version=3;");
我错过了什么吗?这不应该有用吗?
我认为这可能是您的应用程序与 sqlite 驱动程序之间的体系结构不匹配。
在此处下载与您的体系结构相匹配的预编译二进制包 http://sqlite.org/download.html 并将 .dll 放入 bin\Debug 或 bin\Release 文件夹中。我认为这可能是 x86 和 x64 之间的架构不匹配。
从文档中您可以看到所需的部署结构:
<bin>\App.exe (optional, managed-only application executable assembly)
<bin>\App.dll (optional, managed-only application library assembly)
<bin>\System.Data.SQLite.dll (required, managed-only core assembly)
<bin>\System.Data.SQLite.Linq.dll (optional, managed-only LINQ assembly)
<bin>\System.Data.SQLite.EF6.dll (optional, managed-only EF6 assembly)
<bin>\x86\SQLite.Interop.dll (required, x86 native interop assembly)
<bin>\x64\SQLite.Interop.dll (required, x64 native interop assembly)
您已经安装了两种不同的方式来从 C# 与 SQLite 通信,但它们并不完全兼容:围绕原生 "sqlite3.dll" 程序集的薄 sqlite-net 包装器,以及 "System.Data.SQLite" 全功能的 . SQLite 的 NET 数据提供程序。
sqlite-net 只是将一些源文件添加到您的项目中(SQLite.cs 和 SQLiteAsync.cs)。在这些里面,你会看到很多像这样的 extern
声明:
[DllImport("sqlite3" , EntryPoint = "sqlite3_open_v2", CallingConvention=CallingConvention.Cdecl)]
public static extern Result Open ([MarshalAs(UnmanagedType.LPStr)] string filename, out IntPtr db, int flags, IntPtr zvfs);
sqlite-net 假定在您的输出目录中有一个名为 "sqlite3.dll" 的文件。安装System.Data.SQLite
包不会给你这个文件,虽然这个文件"System.Data.SQLite.dll"其实是一个兼容"sqlite3.dll".
的混合程序集
所以你有两个选择:
下载 sqlite3.dll 本机库
在 sqlite-net 源文件中找到所有引用,这些引用现在是您项目的一部分,并将它们从
[DllImport("sqlite3", ...
到
[DllImport("System.Data.SQLite.dll", ...
选择两种方法之一(sqlite-net 或 System.Data.SQLite)并卸载另一个包(两者各有利弊)可能是个好主意。
我已经使用 nuget 安装了 sqlite-net
和 System.Data.SQLite (x86/x64)
。我已经重建并重新启动,但仍然收到以下错误:Unable to load DLL 'sqlite3': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
。这是触发它的行:
db = new SQLiteConnection("Data Source=C:\Users\xxxxxxx\Desktop\mydb.sqlite;Version=3;");
我错过了什么吗?这不应该有用吗?
我认为这可能是您的应用程序与 sqlite 驱动程序之间的体系结构不匹配。
在此处下载与您的体系结构相匹配的预编译二进制包 http://sqlite.org/download.html 并将 .dll 放入 bin\Debug 或 bin\Release 文件夹中。我认为这可能是 x86 和 x64 之间的架构不匹配。
从文档中您可以看到所需的部署结构:
<bin>\App.exe (optional, managed-only application executable assembly)
<bin>\App.dll (optional, managed-only application library assembly)
<bin>\System.Data.SQLite.dll (required, managed-only core assembly)
<bin>\System.Data.SQLite.Linq.dll (optional, managed-only LINQ assembly)
<bin>\System.Data.SQLite.EF6.dll (optional, managed-only EF6 assembly)
<bin>\x86\SQLite.Interop.dll (required, x86 native interop assembly)
<bin>\x64\SQLite.Interop.dll (required, x64 native interop assembly)
您已经安装了两种不同的方式来从 C# 与 SQLite 通信,但它们并不完全兼容:围绕原生 "sqlite3.dll" 程序集的薄 sqlite-net 包装器,以及 "System.Data.SQLite" 全功能的 . SQLite 的 NET 数据提供程序。
sqlite-net 只是将一些源文件添加到您的项目中(SQLite.cs 和 SQLiteAsync.cs)。在这些里面,你会看到很多像这样的 extern
声明:
[DllImport("sqlite3" , EntryPoint = "sqlite3_open_v2", CallingConvention=CallingConvention.Cdecl)]
public static extern Result Open ([MarshalAs(UnmanagedType.LPStr)] string filename, out IntPtr db, int flags, IntPtr zvfs);
sqlite-net 假定在您的输出目录中有一个名为 "sqlite3.dll" 的文件。安装System.Data.SQLite
包不会给你这个文件,虽然这个文件"System.Data.SQLite.dll"其实是一个兼容"sqlite3.dll".
所以你有两个选择:
- 下载 sqlite3.dll 本机库
在 sqlite-net 源文件中找到所有引用,这些引用现在是您项目的一部分,并将它们从
[DllImport("sqlite3", ...
到
[DllImport("System.Data.SQLite.dll", ...
选择两种方法之一(sqlite-net 或 System.Data.SQLite)并卸载另一个包(两者各有利弊)可能是个好主意。