SQLite System.DllNotFoundException: e_sqlite3 с использованием sqlite-net-pcl

Здравствуйте, я пытаюсь использовать SQLite в проекте Xamarin Forms. Но мне трудно заставить его работать. Я собираюсь предоставить информацию о конфигурации моего проекта:

  1. Версия Xamarin -> 4.6.0.726
  2. Стратегия совместного использования кода -> стандарт .NET
  3. sqlite-net-pcl 1.6.292

Проблема: при попытке установить соединение выдается следующее исключение -> {system.typeinitializationexception: инициализатор типа для sqlite.sqliteconnection выдал исключение. ---> system.dllnotfoundexception: e_sqlite3 at (оболочка, управляемая в собственный) sqlitepcl.sqlite3provider_e_sqlite3+nativemethods.sqlite3_libversion_number() at sqlitepcl.sqlite3provider_e_sqlite3.sqlitepcl.isqlite3provider.sqlite3_libversion_number () [0x00000] in :0 at sqlitepcl.raw. setprovider (sqlitepcl.isqlite3provider imp) [0x00008] in :0 at sqlitepcl.batteries_v2.init () [0x00005] in :0 at sqlite.sqliteconnection..cctor () [0x00016] in ‹84b9c9e630fa45bd8ac799333976ebbf>:0 --- конец внутренняя трассировка стека исключений --- в sqlite.sqliteconnectionwithlock..ctor (sqlite.sqliteconnectionstring строка соединения) [0x0000b] в ‹84b9c9e630fa45bd8ac799333976ebbf>:0 в sqlite.sqliteconnectionpool+entry.connect () [0x0001c] в ‹84b9c07ebb39fa493bd8ac .sqliteconnectionpool.getconnection (sqlite.sqliteconnectionstring строка соединения) [0x00048] в ‹84b9c9e630fa45bd8ac799333976ebbf>:0 в sqlite.sqliteasyncconnection.getconnection () [0x00005] в ‹84b9c9e630fa45bd8ac799333976ebbf>:0 :0 в sqlite.sqliteasyncconnection.get_tracer() [0x00000] в ‹84b9c9e630fa45bd8ac799333976ebbf>:0 }

Я провел интенсивное исследование и не нашел ничего подходящего для меня. Последнее сообщение, которое я посетил, было следующим: Android — инициализатор типа для SQLite.SQLiteConnection вызвал исключение. ---› System.DllNotFoundException: e_sqlite3 принятый ответ просто говорит, что установка самородка в проекте Android решит проблему (что я уже сделал)

Я покажу код и то, как выглядят мои самородки. Пакеты дроидов

<package id="sqlite-net-pcl" version="1.6.292" targetFramework="monoandroid90" />
<package id="SQLitePCLRaw.bundle_green" version="2.0.1" targetFramework="monoandroid90" />
<package id="SQLitePCLRaw.core" version="2.0.1" targetFramework="monoandroid90" />
<package id="SQLitePCLRaw.lib.e_sqlite3" version="2.0.1" targetFramework="monoandroid90" />
<package id="SQLitePCLRaw.lib.e_sqlite3.osx" version="1.1.14" targetFramework="monoandroid90" />
<package id="SQLitePCLRaw.provider.e_sqlite3" version="2.0.1" targetFramework="monoandroid90" />

Пакеты проектов с общим кодом

  <package id="sqlite-net-pcl" version="1.6.292" targetFramework="portable45-net45+win8+wpa81" />
  <package id="SQLitePCLRaw.bundle_green" version="1.1.13" targetFramework="portable45-net45+win8+wpa81" />
  <package id="SQLitePCLRaw.core" version="1.1.13" targetFramework="portable45-net45+win8+wpa81" />
  <package id="SQLitePCLRaw.lib.e_sqlite3.osx" version="1.1.14" targetFramework="portable45-net45+win8+wpa81" />

Интерфейс, используемый для получения пути

using SQLite;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UISampleApp.Interfaces
{
    public interface ISQLitePlatform
    {
        SQLiteConnection GetConnection();
        SQLiteAsyncConnection GetConnectionAsync();
        String GetPath();
    }
}

Реализация дроидов

using System;
using System.IO;
using Android.OS;
using SQLite;
using SQLitePCL;
using UISampleApp.Interfaces;
using UISampleApp.Models;

[assembly: Xamarin.Forms.Dependency(typeof(UISampleApp.Droid.Implementations.SQLitePlatform))]
namespace UISampleApp.Droid.Implementations
{
    public class SQLitePlatform : ISQLitePlatform
    {
        public string GetPath() {
            var dbName =Constantes.DatabaseFileName;
            var path = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),dbName);

            return path;
        }

        public SQLiteConnection GetConnection()
        {

            return new SQLiteConnection(GetPath());
        }

        public SQLiteAsyncConnection GetConnectionAsync()
        {
            return new SQLiteAsyncConnection(GetPath());
        }
    }
}

Код, генерирующий исключение

            string path = DependencyService.Get<ISQLitePlatform>().GetPath();
            SQLite.SQLiteAsyncConnection x = DependencyService.Get<ISQLitePlatform>().GetConnectionAsync();
            try
            {
                await x.Table<TodoItem>().ToListAsync();
            }
            catch (Exception e)
            {
                throw e;
            }

Я надеюсь, что кто-то может помочь мне, если потребуется дополнительная информация, просто скажите мне, и я предоставлю ее. PS: Делать то же самое в проекте со стратегией совместного использования кода PCL, но мне нужно, чтобы это работало в проекте со стандартом .NET в качестве стратегии совместного использования кода. Спасибо.

GitHub: https://github.com/jesse0099/Hackathon2019-Movil.git


person Jesé Abraham Chavez Rivas    schedule 12.05.2020    source источник
comment
если ваш общий проект .NET Standard, ваши ссылки на пакеты не должны выглядеть так. С новейшим sqlite nuget вам также не нужно использовать DependencyService для создания соединения. См. docs.microsoft.com/en-us/xamarin/get. -started/быстрый запуск/   -  person Jason    schedule 13.05.2020
comment
@Jason Я следовал этому руководству и выбираю стандартный вариант .NET, заданный мастером, когда вы собираетесь создать новый проект. Как вы думаете, что я мог пропустить?   -  person Jesé Abraham Chavez Rivas    schedule 13.05.2020
comment
этот учебник не использует DependencyService, почему вы? Откройте диалоговое окно параметров проекта для общего проекта и убедитесь, что это .NET Standard. Также попробуйте удалить и повторно добавить пакеты nuget.   -  person Jason    schedule 13.05.2020
comment
@Jason Я уже пытался удалить и прочитать пакет NuGet. Ну, мой VS2017 говорит, что это стандарт .NET, я также сделал новый проект с той же конфигурацией, и у меня та же проблема.   -  person Jesé Abraham Chavez Rivas    schedule 13.05.2020
comment
@JeséAbrahamChavezRivas Я тестирую код без службы зависимостей и добавляю код x.CreateTableAsync<TodoItem>().Wait(); для создания таблицы перед await x.Table<TodoItem>().ToListAsync(); в операторе try. Он хорошо работает на моем ПК. Я не смог воспроизвести ошибку, не могли бы вы предоставить более подробную информацию? Вы загружаете образец кода, предоставленный Джейсоном, по ссылке: docs.microsoft.com/en-us/xamarin/get-started/quickstarts/ Выдает ли это такое же исключение?   -  person Wendy Zang - MSFT    schedule 13.05.2020
comment
@WendyZang-MSFT Ну, пример кода работает отлично, и я использую ту же структуру (не принимая во внимание сервис зависимостей), я собираюсь поместить свой репозиторий GitHub, есть только ветка, и работает только одна фиксация. Предпоследний. Спасибо github.com/jesse0099/Hackathon2019-Movil.git   -  person Jesé Abraham Chavez Rivas    schedule 14.05.2020
comment
@JeséAbrahamChavezRivas Из-за некоторых ошибок я не смог протестировать предоставленный вами код. Но для примера кода не выдавайте ту же ошибку, что и у вас. Не могли бы вы предоставить некоторые подробности о том, какая строка кода вызвала ошибку, или простой пример, который может воспроизвести ошибку для меня?   -  person Wendy Zang - MSFT    schedule 18.05.2020
comment
@WendyZang-MSFT Само соединение поставляется с исключением, но оно выдается до тех пор, пока я не вызову GetItemsAsync. Я поместил свой репозиторий GitHub в конец вопроса, вы можете воспроизвести проблему, клонируя его, спасибо   -  person Jesé Abraham Chavez Rivas    schedule 18.05.2020