質問: お世話になります。 Windowsは10,64bit、 C#(2019Community .Net4.5)で、System.Data.SQLiteを参照して、SQLiteのDBに接続使 しようととすると、BadImageFormatExceptionが発生します。 自分なりにネットで調べ、Windowsのビットの違いで出る...というところまでは突き止めたのですが、 それをどう回避すればよいのかが解りません。 実は、この例外が出たのは二度目で、違うアプリを組んでいた時にも出ていたのですが、何かを やったらうまく動くようになったため、安心しきってそのままにしていました。 しかし、本日別のアプリを組み始めたところ、過去にあったケースと同じ状態になり、果たして 前回は自分で何をして動くようになったのか、まったくわかっていません。 System.Data.SQLite.dllを32ビットと64ビット両方入れ替えて試してみたり、構成マネージャーを AnyCpuからX86にしてみたり等、いろいろやってみたのですが解決しません。 具体的な解決法をお教えください。 よろしくお願いいたします。 ![画像の説明をここに入力](https://i.stack.imgur.com/Iot49.jpg)
回答: 回答済みマークをしていただきましたが、あまり詳しい説明ではなくて 根本的に解決していないようなので追記します。 下記の情報で `SQLite.Native` パッケージを インストール薦めているのは 私の知識が古すぎました。 2016年以降は パッケージの更新がありません。 最新では `System.Data.SQLite.Core` を使うのが正しいです。 `sqlite3.dll` というのは .NET 以外のアプリが SQLite を使うときに利用します。 SQLite の ダウンロードサイト から Windows 用に x86 用と x64 用 sqlite-dll-win32-x86-3310100.zip sqlite-dll-win64-x64-3310100.zip の中に入っていて、x86 の アプリから使う場合と x64 のアプリから使う場合で 利用する `sqlite3.dll` を正しく選ぶ必要があります。 通常は `PATH` の通った場所にある `sqlite3.dll` を読み込むので、間違った dll を読み込んでいないか確認してトラブルの解決を行います。 ### .net の場合は `System.Data.SQLite.Core` パッケージの中にある `System.Data.SQLite.dll` が `SQLite.Interop.dll` を 自動的に `x86` `x64` フォルダの中にあるものを探して それを読み込むようになっています。 `SQLite.Interop.dll` は `sqlite3.dll` とほぼ同じ機能を持った native な DLL です。 `BadImageFormatException` 例外が発生しないように 次のような ディレクトリ構成にすることが推奨されています。 ``` \App.exe (optional, managed-only application executable assembly) \App.dll (optional, managed-only application library assembly) \System.Data.SQLite.dll (required, managed-only core assembly) \System.Data.SQLite.Linq.dll (optional, managed-only LINQ assembly) \System.Data.SQLite.EF6.dll (optional, managed-only EF6 assembly) \x86\SQLite.Interop.dll (required, x86 native interop assembly) \x64\SQLite.Interop.dll (required, x64 native interop assembly) ``` 訂正 -- 以下の記述は ちょっと古いのです --- SqLite で `間違ったフォーマットのプログラムを読み込もうとしました` というエラーメッセージは SqLite ランタイム本体の DLL 読み込みで x86 x64 を間違えて読み込んだ場合に発生する事が 多いと思います。 Dependencies を使って DLL の読み込み状況を確認したら 間違ったDLLを想定外のDLLから読み込んでいるのが観察できると思います。 状況から判断すると `SQLite.Interop.dll` の問題ではなくて `sqlite3.dll` 本体の参照がx86,x64で間違っているのだと思います。 `SQLite.Native` nuget パッケージを追加すると 実行時ランタイムを その環境に合わせて自動配置してくれます。 ``` Install-Package SQLite.Native -Version 3.12.3 ``` 状況が改善するか試してみてください。