Пользовательские версии SQLite

Microsoft.Data.Sqlite создается на основе SQLitePCLRaw. Чтобы использовать настраиваемые версии нативной библиотеки SQLite, примените пакет или настройте поставщик SQLitePCLRaw.

Наборы

SQLitePCLRaw предоставляет пакеты, которые упрощают применение правильных зависимостей на разных платформах. Основной пакет Microsoft.Data.Sqlite по умолчанию добавляет SQLitePCLRaw.bundle_e_sqlite3. Чтобы использовать другой пакет, установите вместо него пакет Microsoft.Data.Sqlite.Core и нужный пакет. Пакеты автоматически инициализируются пакетом Microsoft.Data.Sqlite.

Набор Description
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 с основной сборкой.

Provider Description
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());