Можно ли избежать исключения NullReferenceException в SqliteConnection.Open () в sqlite3_open_v2 (...) без явного вызова SQLitePCL.Batteries.Init()?
Проблема
Я получаю исключение NullReferenceException при вызове SQLitePCL.raw.sqlite3_open_v2(String filename, sqlite3& db, Int32 flags, String vfs) с использованием следующего шаблона:
public class DBOpenFails
{
public static void DemoFail()
{
using (var connection = new SqliteConnection("something.db"))
{
connection.Open(); // Throws NullReferenceException in SQLitePCL.raw.sqlite3_open_v2(...)
}
}
}
Но не при использовании этого шаблона:
public class DBOpenSucceeds
{
public static void DemoWorks()
{
SQLitePCL.Batteries.Init(); // This solves the exception
using (var connection = new SqliteConnection("something.db"))
{
connection.Open(); //Works
}
}
}
Есть ли способ избежать этого звонка?
SQLitePCL.Batteries.Init();
Я использую.NET Framework 4.8, и в каталоге bin есть следующие dll:
- v3.1.8 из Microsoft.Data.Sqlite.dll
- Версия 2.0.4 SQLitePCLRaw.batteries_v2.dll
- Версия 2.0.4 из SQLitePCLRaw.core.dll
- Версия 2.0.4 из SQLitePCLRaw.nativelibrary.dll
- Версия 2.0.4 из SQLitePCLRaw.provider.dynamic_cdecl.dll
Судя по моим исследованиям по этой проблеме, похоже, что намерение подключаемого модуля SQLitePCL состоит в том, чтобы иметь возможность "выполнять загрузку" без прямого вызова SQLitePCL.Batteries.Init().
С другой стороны, решением может быть просто прямой вызов Init().
Расследования
- Страница Github здесь для SQLitePCL.raw делает состояние в разделе "Связки", что вызов Init() необходимо.
- Но есть проблема GitHub здесь, который обращается с подобной проблемой. Он предполагает, что решение заключается в добавлении ссылки на пакет на Microsoft.EntityFrameworkCore.Sqlite.
- Моя проблема в том, что я использую не EFCore, а ADO.NET из.NET Framework 4.8.
- Существует дискуссия здесь с автором SQLitePCL.raw улучшить сообщение об ошибке, чтобы показать "Вам нужно позвонить SQLitePCL.raw.SetProvider(). Если вы используете комплектацию, это делается путем вызова SQLitePCL.Batteries. В этом()."