EntryPointNotFoundException в SQLite после отображения FolderBrowserDialog
При использовании 64-битной программы System.Data.SQLite выдает следующее исключение EntryPointNotFoundException:
Не удалось найти точку входа с именем «sqlite3_changes_interop» в DLL «SQLite.Interop.dll».
Странно, это только происходит, еслиForeign Keys=True
указывается в строке подключения и, что более важно, только после отображенияFolderBrowserDialog
, Я искал папку для отображения баз данных для загрузки.
Следующий код отображает проблему:
public Form1()
{
InitializeComponent();
// Exception below if this is displayed
using (var diag = new FolderBrowserDialog())
{
diag.ShowDialog(this);
}
var conn = new SQLiteConnection("data source=':memory:'");
conn.Open(); // Works fine
conn.Close();
// No exception below if displayed here instead
//using (var diag = new FolderBrowserDialog())
//{
// diag.ShowDialog(this);
//}
conn = new SQLiteConnection("data source=':memory:';foreign keys=True");
conn.Open(); // EntryPointNotFoundException thrown here
conn.Close();
}
Открытие связи сforeign keys=True
работает нормально, если диалоговое окно не отображается или отображается после открытия любого другого соединения SQLite. Код также работает нормально, если программа работает как 32-битный процесс. Поведение также то же самое, если я использую либо сборку SQLite с одинарным смешанным режимом x64, либо сборку взаимодействия MSIL + x64. Я использую v1.0.92.0 такэтот это не проблема.
Так что вопрос в том, почему бы показыватьFolderBrowserDialog
влияет на сборку System.Data.SQLite, находящую точку входа в собственной библиотеке взаимодействия, и почему это происходит только в 64-битном процессе?
В качестве обходного пути я могу загрузить базу данных в памяти, прежде чем делать что-либо еще в программе, но мне не нравится это «решение», так как я использую EF6 и хотел бы иметь возможность использовать разных провайдеров, настроенных через файл конфигурации или даже во время выполнения через пользовательский ввод. Следовательно, весь специфичный для sqlite код находится в другой сборке.