【C#】(未解決)SQLiteで「'SQLite.Interop.dll' を読み込めません」
▽▼起こったこと▼▽
SQLiteのSQLiteConnection生成のあたりで実行時にエラーが発生する。
■発生場所
using (var connection = new SQLiteConnection(@"Data Source=C:\Users\(略)\〇〇.db;Version=3;"))
■エラー内容
例外がスローされました: 'System.DllNotFoundException' (System.Data.SQLite.dll の中) 型 'System.DllNotFoundException' の例外が System.Data.SQLite.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした DLL 'SQLite.Interop.dll' を読み込めません:指定されたモジュールが見つかりません。 (HRESULT からの例外:0x8007007E)
SQLite.Interop.dllが必要だけれど探せていないらしい。
SQLiteが使えているプロジェクトを見ると
binフォルダ(の中のDebugフォルダ)にx86、x64フォルダがあり、その中にそれぞれSQLite.Interop.dllが入っている。
両フォルダをSQLiteがエラーのプロジェクトにコピペしたところSQLiteに接続できるようになった。
▽▼疑問▼▽
x86、x64フォルダはどうして作られなかったのか?
今回WPFのプロジェクトでエラーが起きた。
Nugetパッケージをインストールしてもpackages.configは作られないので調べてみると、プロジェクトファイル(〇〇.csproj)にPackageReferenceがある。
パッケージ参照にはPackageReferenceを採用しているぽい。
これだとSQLite.Interop.dllは作られないのかな
■〇〇.csproj
<ItemGroup> <PackageReference Include="System.Data.SQLite"> <Version>1.0.115.5</Version> </PackageReference> </ItemGroup>
packages.configがあるWindowsフォームのプロジェクトにはx86、x64フォルダができた。
何がだめなんだろう。SQLiteはPackageReferenceには対応していない..? わからない。。
■packages.config
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="EntityFramework" version="6.4.4" targetFramework="net461" /> <package id="Stub.System.Data.SQLite.Core.NetFramework" version="1.0.115.5" targetFramework="net461" /> <package id="System.Data.SQLite" version="1.0.115.5" targetFramework="net461" /> <package id="System.Data.SQLite.Core" version="1.0.115.5" targetFramework="net461" /> <package id="System.Data.SQLite.EF6" version="1.0.115.5" targetFramework="net461" /> <package id="System.Data.SQLite.Linq" version="1.0.115.5" targetFramework="net461" /> </packages>
▽ヒント
sqlite - C# SQLiteを操作するクラスをクラスライブラリ化したときにInterop.dllを要求される点について - スタック・オーバーフロー