EntryPointNotFoundException in SQLite nach dem Anzeigen von FolderBrowserDialog

Bei Verwendung eines 64-Bit-Programms löst System.Data.SQLite die folgende EntryPointNotFoundException aus:

Es konnte kein Einstiegspunkt mit dem Namen "sqlite3_changes_interop" in der DLL "SQLite.Interop.dll" gefunden werden.

Seltsamerweise kommt es nur vor, wennForeign Keys=True wird in der Verbindungszeichenfolge angegeben und was noch wichtiger ist, erst, nachdem ich einFolderBrowserDialog. Ich habe nach einem Ordner gesucht, in dem die zu ladenden Datenbanken angezeigt werden.

Der folgende Code zeigt das Problem an:

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();
}

Verbindung herstellen mitforeign keys=True Funktioniert einwandfrei, wenn das Dialogfeld nicht angezeigt wird oder nachdem eine andere SQLite-Verbindung geöffnet wurde. Der Code funktioniert auch, wenn das Programm als 32-Bit-Prozess ausgeführt wird. Das Verhalten ist auch dasselbe, wenn ich entweder die Single Mixed Mode x64 SQLite-Assembly oder die MSIL + x64-Interop-Assembly verwende. Ich benutze v1.0.92.0 sodiese ist nicht das problem.

Die Frage ist also, warum das zeigen würdeFolderBrowserDialog Auswirkungen auf die System.Data.SQLite-Assembly, die den Einstiegspunkt in ihrer eigenen Interop-Bibliothek findet, und warum tritt sie nur in einem 64-Bit-Prozess auf?

Als Workaround kann ich eine In-Memory-Datenbank laden, bevor ich etwas anderes im Programm mache, aber ich mag diese "Lösung" nicht, da ich EF6 verwende und verschiedene Provider verwenden möchte, die über eine Konfigurationsdatei konfiguriert wurden oder auch zur Laufzeit per Benutzereingabe. Daher befindet sich der gesamte SQLite-spezifische Code in einer anderen Assembly.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage