26

以前は、.NET SQLite ライブラリは から入手できましhttp://sqlite.phxsoftware.comたが、最近メインの SQLite チームに引き継がれ、System.Data.SQLite ダウンロード ページに移動しました。新しいパッケージには混合アセンブリが含まれていないようです (sqlite3.dll と .NET ラッパーを含む単一のアセンブリ)。

新しいパッケージには .NET DLL が付属しておりSQLite.Interop.dll、ドキュメントに基づくとデスクトップでは必要ありませんが、私のアプリケーションは .NET でロードできませんUnable to load DLL 'SQLite.Interop.DLL': The specified module could not be found.。apppool を 32 ビットに設定して、IIS/IIS Express でアプリケーションを実行してみました。

SQLite.Interop.dllファイルをフォルダー、システム フォルダー、および ASP.NET temp フォルダーにコピーしようとしましbinたが、それでも同じエラーが発生します。

新しいリリース用の混合アセンブリはどこでも入手できますか? Unable to load DLL 'SQLite.Interop.DLLそうでない場合、エラーを修正する方法はありますか?

4

4 に答える 4

23

ダウンロードページには、System.Data.SQLiteのすべてのバリエーションの「混合モード」ダウンロードが含まれるようになりました。これは、以前のバージョンのSQLiteと同じように機能します。つまり、プロジェクトにSQLite.Interop.dllを含める必要はありません。

秘訣は、ダウンロードリンクで「バンドル」という単語を探すことです。

例:sqlite-netFx35-setup- bundle -x86-2008-1.0.76.0.exe

また、これらのリンクの説明テキストは、「このセットアップパッケージは混合モードアセンブリを備えています」で始まることがわかります。

これが本当に「以前と同じように動作させたい場合は、これをダウンロードする」という意味だとは知らなかったので、やけどを負いました。

混合モードアセンブリの意味がわからないため、他のリンクは「このセットアップパッケージは、必要なすべてのランタイムコンポーネントと依存関係をインストールする」と主張しているため、より良いオプションのように見えました。

また、「間違った」ものを取得したかどうかを判断する唯一の方法は、ファイルサイズによるものであることに注意してください。DLLの名前はまったく同じで、バージョン番号もまったく同じです。 混合モードバージョンははるかに大きく、約700Kです。もう1つは約160Kです。

なんてめちゃくちゃ...

于 2011-11-02T23:07:06.663 に答える
18

解決策を見つけました。この問題は、SQLite.Interop.dllの既知の問題が原因でした。

これは私のために働いた回避策です。

http://dependencywalker.com/のDependency Walker を使用 して SQLite.Interop.dll (x86 および x64) を調べると、MSVCR100.dll に依存していることがわかります。

System.Data.SQLite.dll の古い 1.0.66.0 バージョンには、この依存関係がありません。現在のビルドでは、MSVCR100.dll も再配布するか、Microsoft のインストーラーを実行する必要があります。

解決策: 差出人: msvcr100.dll がありません

静的リンクを使用します。SQLite.Interop Visual Studio プロジェクト内。このプロパティ設定に移動します: [プロジェクト] -> [プロパティ] -> [構成プロパティ] -> [C/C++] -> [コード生成] -> [ランタイム ライブラリ] に移動し、値をマルチスレッド (/MT) に変更します。(現在のソース コード (1.0.71.0) にはマルチスレッド DLL (/MD) が含まれているため、dll は MSVCR100.dll に依存し、DLLImport (および LoadLibary()) はユーザーが持っていない場合に失敗します)。

SQLite.Interop.dll のデフォルトになるように、静的リンクを変更する必要があると思います。

于 2011-06-02T16:04:19.100 に答える
8

別のアプリケーションのプラグインで同じ問題が発生しました。私の場合、初めて SQLite を参照する前に、環境変数PreLoadSQLite_BaseDirectoryを変更して解決しました。

// Make SQLite work... (loading dll from e.g. x64/SQLite.Interop.dll)
System.Environment.SetEnvironmentVariable("PreLoadSQLite_BaseDirectory", System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));

Sql.Data.SQLite...

PreLoadSQLite_BaseDirectoryただし、 (対応する内部変数) がデフォルトでファイルの場所になると思っていたので、なぜこれが必要なのかわかりませんSystem.Data.SQLite.dll

于 2012-10-24T08:48:39.827 に答える
4

64 ビット マシンでは、AnyCPUをターゲットとする .NET アプリケーションは 32 ビット DLL ファイルをロードできません。64 ビット マシンと 32 ビット マシンの両方で動作させるには、.NET アプリケーションのプラットフォーム ターゲットをx86に設定する必要があります。

編集: 内部で Interop DLL をロードできない理由は、おそらくBadImageFormatExceptionネイティブ SQLite DLL ファイルとのビット数の不一致によるものです。

于 2011-06-01T18:51:23.207 に答える