Пользовательские версии SQLite
Microsoft.Data.Sqlite создается на основе SQLitePCLRaw. Чтобы использовать настраиваемые версии нативной библиотеки SQLite, примените пакет или настройте поставщик SQLitePCLRaw.
Пакеты
SQLitePCLRaw предоставляет пакеты, которые упрощают применение правильных зависимостей на разных платформах. Основной пакет Microsoft.Data.Sqlite по умолчанию добавляет SQLitePCLRaw.bundle_e_sqlite3. Чтобы использовать другой пакет, установите вместо него пакет Microsoft.Data.Sqlite.Core и нужный пакет. Пакеты автоматически инициализируются пакетом Microsoft.Data.Sqlite.
| Пакет | Описание |
|---|---|
| SQLitePCLRaw.bundle_e_sqlite3 | Предоставляет согласованные версии SQLite для всех платформ. Включает расширения FTS4, FTS5, JSON1 и R*Tree. Это значение по умолчанию. |
| SQLitePCLRaw.bundle_e_sqlcipher | Предоставляет неофициальную сборку SQLCipher с открытым кодом. |
| SQLitePCLRaw.bundle_green | Аналогично bundle_e_sqlite3, за исключением платформы iOS, где используется системная библиотека SQLite. |
| SQLitePCLRaw.bundle_sqlite3 | Использует системную библиотеку SQLite. |
| SQLitePCLRaw.bundle_winsqlite3 | Использует winsqlite3.dll, то есть системную библиотеку SQLite на платформе Windows 10. |
| SQLitePCLRaw.bundle_zetetic | Использует официальные сборки SQLCipher, предоставляемые Zetetic (не входят в пакет). |
Например, следующие команды позволяют применить неофициальную сборку 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 — это предоставляемая системой реализация SQLite для iOS, macOS и Linux. |
| 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}");
}
}
}
Использование динамического поставщика
Вы можете использовать собственную сборку SQLite, применяя пакет SQLitePCLRaw.provider.dynamic_cdecl. В этом случае вы обязаны самостоятельно развернуть нативную библиотеку вместе с приложением. Обратите внимание, что процедура развертывания нативных библиотек вместе с приложением будет существенно различаться на разных платформах .NET и в разных средах выполнения.
Прежде всего нужно реализовать IGetFunctionPointer. Ниже приведены сведения о такой реализации на .NET Core.
class NativeLibraryAdapter : IGetFunctionPointer
{
readonly IntPtr _library;
public NativeLibraryAdapter(string name)
=> _library = NativeLibrary.Load(name);
public IntPtr GetFunctionPointer(string name)
=> 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());