Microsoft.Data.Sqlite 是在 SQLitePCLRaw 基础上生成的。 您可以通过使用捆绑包或配置SQLitePCLRaw提供程序来使用 SQLite 原生库的自定义版本。
捆绑
SQLitePCLRaw 提供了方便的捆绑包,使你可以轻松地在不同平台间引入正确的依赖项。 默认情况下,主 Microsoft.Data.Sqlite 包引入 SQLitePCLRaw.bundle_e_sqlite3。 若要使用不同的捆绑,请改为安装 Microsoft.Data.Sqlite.Core 包以及要使用的捆绑包。 软件包由 Microsoft.Data.Sqlite 自动初始化。
| 套餐 | 描述 |
|---|---|
| SQLitePCLRaw.bundle_e_sqlite3 | 在所有平台上提供一个一致的 SQLite 版本。 包括 FTS4、FTS5、JSON1 和 R* 树扩展。 这是默认设置。 |
| SQLitePCLRaw.bundle_e_sqlcipher | 提供 SQLCipher 的非官方开放源码构建版本。 |
| SQLitePCLRaw.bundle_green | 与 bundle_e_sqlite3 相同,不同之处是在 iOS 上使用系统 SQLite 库。 |
| SQLitePCLRaw.bundle_sqlite3 | 使用系统 SQLite 库。 |
| SQLitePCLRaw.bundle_winsqlite3 | 使用 winsqlite3.dll(Windows 10 上的系统 SQLite 库)。 |
| SQLitePCLRaw.bundle_zetetic | 使用 Zetetic 提供的官方 SQLCipher 构建(不包括在内)。 |
例如,若要使用 SQLCipher 的非官方开放源代码内部版本,请使用以下命令。
dotnet add package Microsoft.Data.Sqlite.Core
dotnet add package SQLitePCLRaw.bundle_e_sqlcipher
SQLitePCLRaw 可用的提供程序
在不使用捆绑包时,可以使用 SQLite 的提供程序用于核心程序集。
| 供应商 | 描述 |
|---|---|
| SQLitePCLRaw.provider.dynamic |
dynamic 提供商加载本机库,而不是使用 System.Runtime.InteropServices.DllImportAttribute 属性。 有关使用此提供程序的详细信息,请参阅使用动态提供程序。 |
| SQLitePCLRaw.provider.e_sqlite3 |
e_sqlite3 是默认提供程序。 |
| SQLitePCLRaw.provider.e_sqlcipher |
e_sqlcipher 供应商是非官方且不受支持的 SQLCipher。 |
| SQLitePCLRaw.provider.sqlite3 |
sqlite3 提供者是系统提供的适用于 iOS、macOS 和 Linux 的 SQLite。 |
| SQLitePCLRaw.provider.sqlcipher |
sqlcipher 提供程序适用于来自 SQLCipher 的官方 Zetetic 内部版本。 |
| SQLitePCLRaw.provider.winsqlite3 |
winsqlite3 提供程序适用于 Windows 10 环境。 |
若要使用 sqlite3 提供程序,请使用以下命令:
dotnet add package Microsoft.Data.Sqlite.Core
dotnet add package SQLitePCLRaw.core
dotnet add package SQLitePCLRaw.provider.sqlite3
安装了软件包后,您可以将提供程序设置为 sqlite3 实例。
using Microsoft.Data.Sqlite;
using System;
namespace SqliteProviderSample
{
class Program
{
static void Main()
{
SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_sqlite3());
using var connection = new SqliteConnection();
Console.WriteLine($"System SQLite version: {connection.ServerVersion}");
}
}
}
使用动态提供程序
通过利用 SQLitePCLRaw.provider.dynamic_cdecl 包,可以使用自己的 SQLite 内部版本。 在这种情况下,你负责将原生库随应用程序一起部署。 请注意,随您的应用程序一起部署本机库的详细信息会因所使用的 .NET 平台和运行时的不同而有所差异。
首先,需要实现 IGetFunctionPointer。 .NET Core 上的实现如下:
class NativeLibraryAdapter : IGetFunctionPointer
{
readonly IntPtr _library;
public NativeLibraryAdapter(string name)
=> _library = SQLitePCL.NativeLibrary.Load(name);
public IntPtr GetFunctionPointer(string name)
=> SQLitePCL.NativeLibrary.TryGetExport(_library, name, out var address)
? address
: IntPtr.Zero;
}
接下来,配置 SQLitePCLRaw 提供程序。 确保在应用中使用 Microsoft.Data.Sqlite 之前完成此操作。 另外,请避免使用可能覆盖你的提供程序的 SQLitePCLRaw 捆绑包。
SQLite3Provider_dynamic_cdecl
.Setup("sqlite3", new NativeLibraryAdapter("sqlite3"));
SQLitePCL.raw.SetProvider(new SQLite3Provider_dynamic_cdecl());