BooMark-プログラミングや美術のあれこれ-

半歩ずつでも進めばよろし

【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を要求される点について - スタック・オーバーフロー

▽関連
プロジェクト ファイルの NuGet PackageReference | Microsoft Docs