240

定期的に次の例外が発生します。

Unable to load DLL 'SQLite.Interop.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

1.0.82.0 を使用しています。バージョン、VS2010、OS Win7 64 で nuget を使用してインストールします。

例外が発生し始めると、それは常に表示されます - VS の内外でアプリケーションをデバッグおよびリリースし、実行しています。

停止する唯一の方法は、ログオフしてログオンすることです。例外はスローされず、dll が読み込まれます。数日間は機能しますが、その後また壊れる可能性があります。

誰かがこのようなものを見たことがありますか?それに対する解決策はありますか?

4

47 に答える 47

149

私はパーティーに遅れていることを知っていますが、今日最新の x86/x64 (バージョン 1.0.88.0) をプルダウンした直後にこの問題が発生しました。VS2012 のローカル IIS はデフォルトで 32 ビットで実行されており、x64 に切り替える簡単な方法はありません。私の運用サーバーは 64 ビットで実行されています。

とにかく、NuGet パッケージを DLL プロジェクトにインストールしたところ、このエラーが発生しました。それを機能させるために私がしなければならなかったこと 私はそれをメインサイトプロジェクトにもインストールしなければなりませんでした。SQLite クラスにまったく触れていなくても。

私の推測では、SQLite はエントリ アセンブリを使用して、ロードする Interop のバージョンを検出します。

于 2013-09-01T14:03:06.767 に答える
82

私が使用していたdllには依存関係としてSqliteがあったため、この問題が発生しました(SqliteコアパッケージのみでNuGetで構成されました)。プロジェクトは、'SQLite.Interop.dll' (x86 フォルダーと x64 フォルダーの両方) を除くすべての Sqlite dll-s をコンパイルしてコピーします。

ソリューションは非常に簡単でした。ビルド/実行しているプロジェクトに System.Data.SQLite.Core パッケージを依存関係として (NuGet を使用して) 追加するだけで、dll-s がコピーされます。

于 2015-01-22T15:26:41.657 に答える
51

プラットフォーム ターゲットがAny CPU. 次の手順に従って修正しました。

  1. Visual Studio でプロジェクト デザイナーを開きます。方法の詳細については、こちらを参照してください
  2. [ビルド] タブをクリックします。
  3. オプションを無効にしprefer 32-bitます。

または、プラットフォーム ターゲットをx86またはに設定することもできますx64。この問題はSystem.Data.SQLite、プラットフォーム ターゲットを使用して「SQLite.Interop.dll」ファイルの場所を取得するライブラリが原因であると考えられます。

アップデート:

プロジェクト デザイナーと連絡が取れない場合は、プロジェクト ( *.csproj) ファイルをテキスト エディターで開き、値<Prefer32Bit>false</Prefer32Bit><PropertyGroup>...</PropertyGroup>タグに追加します。

サンプルコード

<PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>[Set by Visual Studio]</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>[Set by Visual Studio]</RootNamespace>
    <AssemblyName>[Set by Visual Studio]</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>[Set by Visual Studio]</FileAlignment>
    <!--Add the line below to your project file. Leave everything else untouched-->
    <Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
于 2013-03-03T20:54:31.217 に答える
16

コマンドを使用してNuGetを更新Tools -> Extension and updatesし、SQLite.Coreを再インストールすると、PM> Update-Package -reinstall System.Data.SQLite.Core修正されました。

于 2015-12-23T15:51:39.933 に答える
10

複数のプロジェクト ソリューションで同様の問題が発生しました。SQLite.Interop.dll は、ClickOnce を使用してソフトウェアと共に配布されたプラグインの 1 つに必要でした。

Visual Studio でのデバッグに関する限り、すべて正常に機能しましたが、展開されたバージョンには、その DLL を含むフォルダー x86/ および x64/ がありませんでした。

ClickOnce を使用して展開後に機能させるための解決策は、ソリューションのスタートアップ プロジェクト (公開されているプロジェクトでもあります) にこれら 2 つのサブフォルダーを作成し、それらに DLL をコピーして、Content Copy Always として設定することでした。

このようにして、ClickOnce 発行ツールは、これらのファイルとフォルダーをマニフェストに自動的に含め、ソフトウェアをそれらと共に展開します。

于 2014-05-27T18:56:18.857 に答える
8

ここには本当にたくさんの答えがありますが、私の答えはシンプルで明確で、GAC-playing-aroundはありません。

問題は、実行可能ファイルがSQLite.Interop.dllデータベースにアクセスする権利 (x86 または x64) のコピーを必要とすることでした。

ほとんどのアーキテクチャにはレイヤーがあり、私の場合、データレイヤーには SQLite 接続に必要な DLL があります。

したがって、ビルド後のスクリプトをデータレイヤーソリューションに簡単に配置すると、すべてが正常に機能しました。


TL;DR;

  1. ソリューションのすべてのプロジェクトをビルド オプションに、x86またはx64ビルド オプションで設定します。

  2. Post-Build-Scriptを使用してプロジェクトに以下を追加しSQLite nuget Packageます。

    xcopy "$(TargetDir)x64" "$(SolutionDir)bin\Debug\" /y

もちろんRelease Buildx86ビルドのスクリプトを変更する必要があります。


STL;DR;

あなたのSQLite.Interop.dll次を*.exeファイルに入れます。

于 2016-08-30T17:14:56.503 に答える
7

NuGet からのマルチアーキテクチャ (x86、x64) バージョンの SQLite の既定のインストールは、説明した動作を示します。.NET ランタイムがマシン上でアプリケーションを実行するために選択した実際のアーキテクチャの正しいバージョンをロードする場合は、次のように、正しいライブラリの場所に関するヒントを DLL ローダーに与えることができます。

Program.Main() の前に、kernel32.dll 関数呼び出しの宣言を SetDLLDirectory() に追加します。

    [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode, SetLastError = true)]
    [return: System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)]
    static extern bool SetDllDirectory(string lpPathName);

次に、独自の方法を使用して正しいサブディレクトリを決定し、アーキテクチャ固有のバージョンの「SQLite.Interop.dll」を見つけます。次のコードを使用します。

    [STAThread]
    static void Main()
    {
        int wsize = IntPtr.Size;
        string libdir = (wsize == 4)?"x86":"x64";
        string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
        SetDllDirectory(System.IO.Path.Combine(appPath, libdir));
于 2013-07-09T22:50:36.943 に答える
5

古い投稿であっても、ここで見つけた解決策を共有したいと思います: http://system.data.sqlite.org/index.html/info/54e52d4c6f

すべての問題を読みたくない場合の解決策は、ファイル「msvcr100.dll」(Windows\System32 ディレクトリにあります) を SQLite.Interop.dll と同じパスにコピーすることです。

問題を読んで理由を理解し、ファイルをセットアップに含めることをお勧めしますが、エラーが発生した場合にのみインストールするように、セットアップオプションで選択可能なオプションのコンポーネントにしました.

HTH、フォーメンツ

于 2013-11-22T12:33:52.060 に答える
5

SQLite wikiにあるように、アプリケーションの展開は次のようにする必要があります。

アプリケーションの展開

したがって、ルールに従う必要があります。ターゲット プラットフォームに一致する dll を見つけて、画像で説明されている場所に配置します。DLL は、YourSolution/packages/System.Data.SQLite.Core.%version%/ にあります。

アプリケーションの展開に問題があったため、適切な SQLite.Interop.dll をプロジェクトに追加し、x86 フォルダーをセットアップ プロジェクトの AppplicationFolder に追加し、dll へのファイル参照を追加しました。

于 2017-09-13T06:42:13.297 に答える
3

Costura.Fody を使用して (.net) アセンブリをパッケージ化し、ネイティブ dll を埋め込み、プリロードするようになりました。これは、1 つのファイルを送信できるため、後で配布する場合にも役立ちます。

  1. Nuget から Costura Fody をインストールします。

  2. C# プロジェクトで、costrua32 というフォルダーを作成します。そこに、ロードする C# のネイティブ dll を追加します。

  3. それらをこのフォルダに追加したら。プロパティ ウィンドウをクリックし、ビルド アクションを「埋め込みリソース」に変更します。

  4. 最後に、FodyWeavers.xml という XML ファイルを次のように修正する必要があります。ここでは、SQL DLL を最初にロードするように指定しています。(.dll をドロップすることに注意してください)

    Weavers
     Costura
      PreloadOrder
       SQLite.Interop
       tbb_debug
       tbb
      /PreloadOrder>
     /Costura
    /Weavers
    

これの利点は、ビルド前またはビルド後のイベントを記述する必要がなく、最終製品が 1 つの大きなファイルに完全にカプセル化されることです。

于 2015-01-26T15:31:03.633 に答える
3

64 ビット プロジェクトで 32 ビット dll を実行しようとすると、このエラーが発生することもあります。

x86 フォルダーと x64 フォルダーの両方に同じファイル (32 ビット バージョンの SQLite.Interop.dll) を配置したときに、これを取得しました。

于 2013-11-01T07:50:56.907 に答える
2

アセンブリの競合はありますか?DLLにファイルロックを設定している別のアプリケーションがあるかどうかを確認してください。

これが理由である場合は、SysinternalのProcess Explorerなどのツールを使用して、問題のあるプログラムを簡単に見つけることができます。

HTH、クレイ

于 2012-10-23T18:31:20.417 に答える
2

私はこれに長い間苦労してきましたが、時折、テスト設定が正しくないことに気付きました。この画像を参照してください。 テスト設定

テスト設定のチェックを外すだけで、問題は消えます。そうしないと、例外が発生します。うまくいけば、これは誰かを助けるでしょう。それが根本的な原因であるかどうかはわかりません。

于 2016-10-22T10:46:49.003 に答える
2

ビルドする前に、プラットフォーム ターゲットを x86 または x64 (すべての CPU ではなく) に設定してみてください: Visual Studio で [プロジェクト] -> [プロパティ] -> [ビルド] -> [プラットフォーム ターゲット] を選択します。

于 2015-12-22T09:50:11.003 に答える
2

Visual C++ 2010 再頒布可能パッケージが PC にインストールされていないため、この問題が発生しました。Visual C++ 2010 再頒布可能パッケージをまだインストールしていない場合は、これをダウンロードしてインストールします (x86 または 64 dll を確認してください)。

于 2015-01-25T12:03:54.830 に答える
1

良い答えかどうかはわかりませんが、「ローカル システム」の ID を持つ AppDomain でアプリケーションを実行することで、この問題を解決できました。

于 2013-03-31T22:31:30.783 に答える
1

私は、同じデータ アクセス (または「コア」) プロジェクトから引き出された WebAPI/MVC5 Web プロジェクトと機能テスト プロジェクトのソリューションで、この問題に遭遇しました。ここにいる他の多くの人と同じように、私は Visual Studio 2013 の NuGet 経由でダウンロードしたコピーを使用しています。

私が行ったことは、Visual Studio で x86 および x64 ソリューション フォルダーを機能テストおよび Web プロジェクトに追加することでした。次に、 を実行し、これらの各フォルダーRight Click | Add Existing Item...から適切な SQLite.interop.dll ライブラリを追加しました..\SolutionFolder\packages\System.Data.SQLite.Core.1.0.94.0\build\net451\[appropriate architecture]。次に、 を実行しRight Click | Properties、 に設定Copy to Output DirectoryしましたAlways Copy。次に機能テストを実行する必要が生じたとき、テストは正常に実行されました。

于 2015-02-23T16:57:41.677 に答える
1

SQLite データベースにいくつかのテスト データを追加する単純なコンソール アプリケーションに取り組んでおり、このエラーが発生していました。プロジェクトの構成は「任意の CPU」です。SQLite.Interop.dll を bin\debug フォルダーにコピーして修正しました。より良い方法は @Wil によるメソッドを使用することですが、「任意の CPU」構成でこれをどのように指定しますか?

于 2013-10-17T18:07:38.697 に答える
1

この質問を見ている人の参考のために:

nuget パッケージを使用すると、コピーを行うビルド ルールがインストールされます。(System.Data.SQLite.Core.1.0.94.0\buildの下を参照してください-またはインストールするコアのバージョン)。

nuget インストーラーは、ルールをプロジェクト ファイルに自動的に追加します。

ただし、これでもテスト ケースの問題は解決しません。DeploymentItem ( https://stackoverflow.com/a/24411049/89584 ) アプローチは、そこで機能しているように見える唯一のものです。

于 2015-01-08T20:44:53.073 に答える
1

要するに

これをNCrunchでも動作させるには、NuGet パッケージで提供される Interop.dll バージョンを NCrunch 構成の追加ファイルとして追加する必要がありました。

私の場合

SQLite (ヘルパー ライブラリ) に直接依存する 1 つのプロジェクトと、このヘルパー ライブラリを使用する単体テスト プロジェクトを含む C# ソリューションがありました。System.Data.SQLite.Core バージョン 1.0.97.0 を NuGet パッケージとしてインストールしました。

私の場合、Marin によって提供された回避策により、Visual Studio と CI でも機能しました。ただし、これでも NCrunch でエラーが発生します。

NCrunch の構成で、ユニット テスト プロジェクトの設定の下にある [追加のファイルを含める] に次のパスを追加しました。

..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\**.dll
于 2015-07-20T11:46:16.220 に答える
0

私は自分でこの問題に遭遇しましたが、別の原因であることが判明しました。

System.DllNotFoundException was caught 
Unable to load DLL 'SQLite.Interop.dll': Access is denied. 

この場合、コードは IIS (x86 ビルド用に構成) によってホストされる Web サービスから (間接的に) 呼び出されました。最終的にIISのアプリケーションプールまで追跡しました:もともと「ASP.NET V4.0 Integrated」を使用していましたが(そのエラーが発生しました)、「DefaultAppPool」に変更すると、問題はなくなりました。

(ふぅ!)

于 2015-07-21T19:41:24.310 に答える
0

これでうまくいきました:Install-Package System.Data.SQLite.Coreパッケージマネージャーコンソールで。

于 2019-09-06T09:28:42.107 に答える
0

したがって、私の問題は、SQLite がデザイン時に WPF にロードしようとしていたことでした。私は x86 環境だけを気にしていたので、CPU 設定を x86 環境に設定し、SQLite.Interop.dll を Nuget パッケージからソリューションのルート ディレクトリにコピーしました。ソリューションを再起動すると、すべての問題が消えました。そのため、設計時に問題が発生している場合は、ライブラリをソリューションのルート ディレクトリに配置してください。

さらに、実行時に同様の問題が発生していたため、SQLite.Interop.dll のコピーをプロジェクトに配置し、プロパティで新しい場合はコピーするように設定する必要がありました。提供された x86 および x64 フォルダーはまったく役に立たないようです。さらなる調査が必要ですが、全体としては... Nuget パッケージを使用するよりも、プロジェクトで SQLite を手動で参照する方が簡単です。

さらに、公式の FAQ には次のように記載されています。

(20) System.Data.SQLite プロジェクトをコンパイルして Visual Studio 内から実行すると、実行しようとしたときに DllNotFoundException または BadImageFormatException ("sqlite3.dll" または "SQLite.Interop.dll" の場合) が発生するのはなぜですか?アプリケーションをデバッグしますか?

System.Data.SQLite プロジェクト (テスト プロジェクトを含む) を使用する Visual Studio 内からソリューションをコンパイルして実行する場合、正しいビルド構成とプラットフォームを選択することが非常に重要です。まず、Visual Studio 内でデバッグされるマネージ アプリケーションは、混合モード アセンブリを使用できません (つまり、常にプラットフォーム固有のビルド出力ディレクトリにコンパイルされるため)。これは、同じソース プロジェクト ファイルを使用した複数のプラットフォーム用のバイナリのビルドを適切にサポートするために必要です。したがって、System.Data.SQLite アセンブリに依存する Visual Studio 内からマネージ アプリケーションを実行する場合は、"DebugNativeOnly" または "ReleaseNativeOnly" ビルド構成のみを選択する必要があります。これらのビルド構成には、必要なネイティブ アセンブリをマネージド出力ディレクトリにコピーする (つまり、マネージド バイナリをインプレースで実行できるようにするための) カスタム ビルド後のステップが含まれています。ただし、このビルド後の手順は、選択したプラットフォームがオペレーティング システムのプラットフォームと一致する場合にのみ実行されます (たとえば、32 ビット Windows の場合は「Win32」、64 ビット Windows の場合は「x64」)。したがって、ソリューションでマネージド プロジェクトを実行する前に、選択したビルド プラットフォームをオペレーティング システムに対して再確認することをお勧めします。64 ビット Windows の場合)。したがって、ソリューションでマネージド プロジェクトを実行する前に、選択したビルド プラットフォームをオペレーティング システムに対して再確認することをお勧めします。64 ビット Windows の場合)。したがって、ソリューションでマネージド プロジェクトを実行する前に、選択したビルド プラットフォームをオペレーティング システムに対して再確認することをお勧めします。

https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20

于 2015-09-22T05:23:35.600 に答える