63354


お世話になります。

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)](https://i.stack.imgur.com/Iot49.jpg)


CC BY-SA 4.0
2020-02-25T06:17:57.537
63341
2020-02-27T14:51:11.003
9374
question
c# visual-studio sqlite
C# SQLiteに接続しようとするとBadImageFormatExceptionが出る


回答済みマークをしていただきましたが、あまり詳しい説明ではなくて  
根本的に解決していないようなので追記します。

下記の情報で  
`SQLite.Native` パッケージを インストール薦めているのは 私の知識が古すぎました。  
2016年以降は パッケージの更新がありません。  
最新では `System.Data.SQLite.Core` を使うのが正しいです。

`sqlite3.dll` というのは .NET 以外のアプリが SQLite を使うときに利用します。  
[SQLite の ダウンロードサイト](https://www.sqlite.org/download.html) から 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` 例外が発生しないように 次のような
ディレクトリ構成にすることが[推奨されています。](https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki)

[code]

    <bin>\App.exe (optional, managed-only application executable assembly) 
    <bin>\App.dll (optional, managed-only application library assembly) 
    <bin>\System.Data.SQLite.dll (required, managed-only core assembly) 
    <bin>\System.Data.SQLite.Linq.dll (optional, managed-only LINQ assembly) 
    <bin>\System.Data.SQLite.EF6.dll (optional, managed-only EF6 assembly) 
    <bin>\x86\SQLite.Interop.dll (required, x86 native interop assembly) 
    <bin>\x64\SQLite.Interop.dll (required, x64 native interop assembly) 
    
[/code]

## 訂正

\-- 以下の記述は ちょっと古いのです ---

SqLite で `間違ったフォーマットのプログラムを読み込もうとしました` というエラーメッセージは SqLite ランタイム本体の DLL 読み込みで
x86 x64 を間違えて読み込んだ場合に発生する事が 多いと思います。

[Dependencies](https://github.com/lucasg/Dependencies) を使って DLL の読み込み状況を確認したら
間違ったDLLを想定外のDLLから読み込んでいるのが観察できると思います。

状況から判断すると `SQLite.Interop.dll` の問題ではなくて `sqlite3.dll`
本体の参照がx86,x64で間違っているのだと思います。

`SQLite.Native` [nuget
パッケージ](https://www.nuget.org/packages/SQLite.Native/)を追加すると 実行時ランタイムを
その環境に合わせて自動配置してくれます。

[code]

    Install-Package SQLite.Native -Version 3.12.3
    
[/code]

状況が改善するか試してみてください。


CC BY-SA 4.0
2020-02-25T23:10:36.340
63354
2020-02-27T14:51:11.003
2020-02-27T14:51:11.003
18851
18851
63341
answer