web-dev-qa-db-ja.com

DLL 'SQLite.Interop.dll'を読み込めません

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

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がロードされます。それは何日も働くことができますが、それからそれはまた壊れることができます。

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

170
xll

私はパーティーに遅刻していることを知っています、しかし、私が最新のx86/x64を今日引き下ろした直後(バージョン1.0.88.0)にこの問題がありました。 VS2012の私のローカルIISはデフォルトで32ビットで動作し、x64に切り替える簡単な方法はありません。私の本番サーバーは64ビットです。

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

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

113
Kugel

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

解決策は非常に簡単でした。Sqlite.Coreパッケージを依存関係として(NuGetを使って)ビルド/実行中のプロジェクトに追加するだけで、dll-sがコピーされます。

53
Marin

プラットフォームのターゲットがAny CPUであるWPFプロジェクトでSQLiteを使用したときにも同じ問題がありました。以下の手順で修正しました。

  1. Visual Studioでプロジェクトデザイナーを開きます。やり方の詳細は こちら にあります。
  2. Buildタブをクリックしてください。
  3. prefer 32-bitオプションを無効にします。

あるいは、プラットフォームターゲットをx86またはx64に設定することもできます。この問題は、プラットフォームターゲットを使用して 'SQLite.Interop.dll'ファイルの場所を取得するSystem.Data.SQLiteライブラリによって引き起こされると思います。

更新:

プロジェクト設計者に連絡が取れない場合は、テキストエディタからプロジェクト(*.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>
42
Caleb Kiage

これが私が自分のプロジェクトで修正した方法です。

それは働いていました、そして同僚が彼の変更を提出したとき、私は「DLL 'SQLite.Interop.dll'をロードすることが不可能」例外を受け取りました。

プロジェクトの.csprojファイルとは異なり、これはNON-WORKINGバージョンです。

<ItemGroup>
     <Content Include="x64\SQLite.Interop.dll" />
     <Content Include="x86\SQLite.Interop.dll" />
</ItemGroup>

そして、これはWORKINGバージョンが持っていたものです:

<ItemGroup>
     <Content Include="x64\SQLite.Interop.dll">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
      <Content Include="x86\SQLite.Interop.dll">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
</ItemGroup>

元に戻った後、私は例外を受け取りませんでした。 DLLファイルは適切なDebug\x64(etc)フォルダにダンプされました。

32
Wil

この状態になったら、Rebuild-Allを実行してみてください。これで問題が解決した場合は、私と同じ問題がある可能性があります。

いくつかの背景(私の理解)

  • SQLiteには、1つのマネージアセンブリ(System.Data.SQLite.dll)といくつかのプラットフォーム固有のアセンブリ(SQLite.Interop.dll)があります。 SQLiteをNugetと一緒にインストールするとき、Nugetはあなたのプロジェクトにプラットフォーム固有のアセンブリを追加し(\ x86、\ x64)、これらのdllを "常にコピー"に設定します。

  • 読み込まれると、マネージアセンブリは\ x86および\ x64フォルダ内のプラットフォーム固有のアセンブリを検索します。あなたはそれについてもっと見ることができます ここ 。例外は、このマネージアセンブリがこれらのフォルダ内で関連する(SQLite.Interop.dll)を見つけようとしている(そして失敗している)ことです。

私のシナリオ

私のソリューションには2つのプロジェクトがあります。 WPFアプリとクラスライブラリ。 WPFアプリはクラスライブラリを参照し、クラスライブラリはSQLite(Nuget経由でインストールされた)を参照します。

私にとっての問題は、WPFアプリだけを修正したときに、VSが部分的な再構築を試みることでした(依存DLLは変更されていないことに気付きました)。このプロセスのどこかで、VSは\ x86および\ x64フォルダの内容を消去します(SQLite.Interop.dllを吹き飛ばします)。完全なRebuild-Allを実行すると、VSはフォルダとその内容を正しくコピーします。

私の解決策

これを修正するために、xcopyを使用してPost-Buildプロセスを追加し、クラスライブラリからWPFプロジェクトの\ binディレクトリに\ x86および\ x64フォルダを強制的にコピーしました。

あるいは、build configuration/outputディレクトリを使ってもっと面白いことができます。

24
sfm

私はVisual Studio Express 2013を実行している同じ問題を抱えていました。私は役に立ちませんでした。この修正が他の人に役立つことを願っています。

私はSQLiteベースのサービスをテストする私のテストクラスで DeploymentItem attribute を使うことでそれを修正しました。

例:

[TestClass]
[DeploymentItem(@"x86\SQLite.Interop.dll", "x86")] // this is the key
public class LocalStoreServiceTests
{

    [TestMethod]
    public void SomeTestThatWasFailing_DueToThisVeryIssue()
    {
         // ... test code here
    }
}

これにより、必要なSQLite.Interop.dllが適切な "TestResults"フォルダ内のx86ディレクトリにコピーされます。

すべて緑色です。すべてが良いです。

18
Michael Bromley

Tools -> Extension and updatesからNuGetを更新し、PM> Update-Package -reinstall System.Data.SQLite.CoreというコマンドでSQLite.Coreを再インストールすることで解決しました。

12
Filippo Vigani

複数プロジェクトの解決策でも同様の問題がありました。 SQLite.Interop.dllは、ClickOnceを使用してソフトウェアとともに配布されているプラ​​グインの1つに必要でした。

Visual Studioでのデバッグに関してはすべてうまくいきましたが、デプロイされたバージョンにはそのDLLを含むフォルダーx86 /とx64 /がありませんでした。

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

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

9
user1892410

そのため、NuGetを追加した後でも、デプロイメントはInteropsをコピーしません。あなたはこれをあなたのcsprojファイルに追加することができ、それはその振る舞いを修正するはずです:

 <PropertyGroup> 
    <ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles>
    <CopySQLiteInteropFiles>false</CopySQLiteInteropFiles>
    <CleanSQLiteInteropFiles>false</CleanSQLiteInteropFiles>
    <CollectSQLiteInteropFiles>false</CollectSQLiteInteropFiles>
 </PropertyGroup>

NuGet for SQLiteのソースを見ると、これらが具体的に何をしているのかがわかります。これにより、デプロイをASP.Net Coreで動作させることができました。

8
b.pell

ここに本当にたくさんの答えがあります、しかし私のものはno-GAC-playing-aroundで単純明快です。

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

ほとんどのアーキテクチャにはレイヤがあり、私の場合はData LayerがSQLite Connectionに必要なDLLを持ちます。

だから私は簡単に私のData Layer Solutionにpost buildスクリプトを入れるだけですべてうまくいきました。


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ファイルの隣に置きます。

8
Smartis

NuGetからのSQLiteのマルチアーキテクチャ(x86、x64)バージョンのデフォルトインストールはあなたが説明した振る舞いを示します。あなたのマシン上であなたのアプリケーションを実行するために.NETランタイムが選んだ実際のアーキテクチャのための正しいバージョンをロードしたいなら、あなたはDLLローダーに次のように正しいライブラリを見つける場所についてのヒントを与える:

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

    [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));
6
Kevin Smathers

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

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

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

HTH、フォルメンツ

4
Formentz

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

私はx86とx64の両方のフォルダに同じファイル(32ビット版ではSQLite.Interop.dll)を置いたときにこれを得ました。

3

なぜこれが含まれていないのか私にはわかりませんが、私は調査をして自分でこれを見つけなければなりませんでしたので、うまくいけば誰かがこの答えを見つけてトラブルを救うでしょう。これはWPFアプリ用です。それは私の開発者ボックスではうまくいきましたが、私がそれをコピーしていたところのコンピュータではうまくいかず、Unable to load DLL 'SQLite.Interop.dll'エラーを受け取りました。実行したときにOPと同じエラーが発生したときは、自分の "Debug"フォルダからこの他のコンピュータに直接、関連するディレクトリとファイルをすべて移植しました。私のDLLを含む "bin"フォルダは "Debug\bin"にコピーされていて、このパスを使用して他のコンピュータにコピーしたときにはすべてアプリケーションファイルと共に含まれていたので、ファイルはありません。

私が見たことは当てはまらない他の答えで言った:

  • NuGetパッケージを使用しなかったか、NuGetパッケージが作成したように見えるx86またはx64フォルダーを作成する必要がありませんでした。私のDLL(System.Data.SQLiteとSQLite.Interop.dll、およびSystem.Data.SQLite.config)は私のプロジェクトの "bin"フォルダにあり、手動でコピーされています(ソリューションエクスプローラで "bin"フォルダを作成します)。 VS、WindowsエクスプローラでこのフォルダにDLLを貼り付け、[追加]> [既存のアイテム]を使用してファイルをVSフォルダ/プロジェクトに移動します。それから私はその場所を使用して私のプロジェクトでそれらを参照されたアセンブリとして参照します( "References"> "Add Reference"、そしてそれをブラウズします 残りはリンス、繰り返し )。これにより、私のプロジェクトはどこにあるのかを正確に知ることができます。
  • 私はapp.configでSQLite DLLファイルを参照する必要も、MyProject.csprojファイルに触る必要もありませんでした。
  • 特定のプロセッサを指定する必要すらありませんでした。私のプロジェクトのビルドは "Any CPU"のためのものです。私は混合または64ビットのDLLしか持っておらず、64ビットOSであるWindows 7以降でしか実行されないでしょう。 (x86専用/ 32ビット専用のDLLはありません)
  • OPのエラーが発生したときに、これらのDLLに対して "Content"および "copy if new"として既にそれらを指定していました。

https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q2 から、これがわかりました。

(11)アプリケーションを実行しようとすると、なぜ "sqlite3.dll"または "SQLite.Interop.dll"のDllNotFoundExceptionが発生するのですか?

名前付きダイナミックリンクライブラリ(DLL)が見つからないか、依存関係がないために読み込むことができません。指定されたダイナミックリンクライブラリがアプリケーションディレクトリまたはシステムPATH上のディレクトリにあることを確認してから、もう一度やり直してください。 また、必要なVisual C++ランタイム再配布可能ファイルがインストールされていることを確認してください。 静的にリンクされて構築されたダイナミックリンクライブラリを使用していない限り。

段落内の太字部分を強調します。ターゲットコンピュータは新鮮で、.NET 4.0以外にプログラムはロードされていません。 C++をインストールすると、SQLiteへのコマンドを完成させることができました。これは最初のFAQの1つであり、前提条件の一部であるはずでしたが、#11で埋められました。私の開発用コンピュータには、Visual Studioが付属しているのですでにロードされています。そのため、そこで機能しました。

ダウンロード:
Visual Studio 2015用に再配布可能なVisual C++:
https://www.Microsoft.com/ja-jp/download/details.aspx?id=48145

アップデート3(累積アップデート):
https://www.Microsoft.com/ja-jp/download/details.aspx?id=53587

3
vapcguy

SQLiteに対して 正しいバイナリをダウンロード している場合は、SQLite.Interop.dllを自分のReleaseまたはDebugフォルダにコピーします。プロジェクトビルドオプション.

3
Elshan

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

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

  2. C#プロジェクトで、costrua32というフォルダを作成します。そこにどんなC#をロードするかあなた自身のネイティブDLLを追加してください。

  3. このフォルダに追加したらプロパティウィンドウをクリックして、ビルドアクションを "Embedded Resource"に変更します。

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

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

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

3
screig

SQLite wiki が言っているように、あなたのアプリケーション配備は以下のようになっていなければなりません:

Application deployment

だからあなたはルールに従う必要があります。あなたのターゲットプラットフォームに合ったdllを見つけて、それを場所に置いてください、絵で説明します。 DLLはYourSolution/packages/System.Data.SQLite.Core。%version%/にあります。

アプリケーションの配置に問題があったので、正しいSQLite.Interop.dllを自分のプロジェクトに追加し、x86プロジェクトをsetupプロジェクトのAppplicationFolderに追加し、ファイル参照をdllに追加しました。

3
Keltar Helviett

私は同じ問題を抱えています。しかし、ようやく修正できます。現在、私はVisual Studio 2013 Community Editionを使用しています。私はAdd-> Existing Item ...を使ってSQLite.Data.SQLiteファイルがある場所をブラウズします(私の場合は 'C:\ Program Files(x86)\ System.Data.SQLiteです\ 2013\bin ')忘れないでください Assembly Files(* .dll; * .pdb)。そのフォルダで「SQLite.Interop.dll」を選択してください。そこから、それから私は何の問題もなく続けることができます。皆さん、頑張ってください。 ^ _ ^ PS Webフォームアプリケーションを作成します。私はまだウィンドウフォームアプリケーションや他の人で試していません。

2
Kayun Chan

また、テストプロジェクトにDLLを(Nuget Managerを通じて)追加し、それを修正しました。

2
Antonin GAVREL

プロジェクトディレクトリにSQLite.Interop.dllをコピーします。

src\
  project\
      bin\   <-- Past in bin
         x64\
           SQLite.Interop.dll <-- Copy this if 64
         x86\
           SQLite.Interop.dll <-- Copy this if 32
2
Ahmad Aghazadeh

私は長い間これに苦労していました、そして時折、私はテスト設定が間違っていることがわかりました。この画像を見てください。 Test setting

テスト設定をオフにするだけで、問題は解消されます。そうでなければ、例外が発生します。うまくいけば、これは誰かに役立つでしょう。それが根本的な原因かどうかわからない。

2
Tony Sun

それが良い答えかどうかはわかりませんが、 "Local System"というIDを持つAppDomainの下でアプリケーションを実行することで、この問題を解決できました。

1
Jesse McDowell

要するに

これを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
1
Gonnagle

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

1
thardes2

私はいくつかのテストデータをSQLiteデータベースに追加するための簡単なコンソールアプリケーションに取り組んでいますが、このエラーが出ました。プロジェクトの設定は "Any CPU"です。 SQLite.Interop.dllをbin\debugフォルダにコピーして修正しました。もっと良い方法は@Wilの方法を使うことでしょうが、 "Any CPU"設定にどのようにこれを指定しますか?

1
pwrgreg007

デバッグフォルダにx86とx64の両方の "SQLite.Interop.dll"ファイルをコピーします。これらのファイルは、デバッグフォルダ内の「x86」および「x64」フォルダにコピーする必要があります。

1
teardrop

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

これがその理由であれば、問題のプログラムを見つけるために SysinternalのProcess Explorer のようなツールを使用するのが簡単なはずです。

HTH、クレイ

1
Clay Compton

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

私がしたことは、Visual StudioでFeature TestとWeb Projectsにx86とx64のソリューションフォルダを追加したことです。それから私はRight Click | Add Existing Item...をして、それらのフォルダーのそれぞれのために..\SolutionFolder\packages\System.Data.SQLite.Core.1.0.94.0\build\net451\[appropriate architecture]から適切なSQLite.interop.dllライブラリーを加えました。それから私はRight Click | Propertiesをし、そしてCopy to Output DirectoryAlways Copyに設定しました。次回機能テストを実行する必要があったときに、テストは正常に実行されました。

1
Andrew Gray

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

Nugetパッケージを使用している場合は、コピーを実行するビルドルールがインストールされます。 (System.Data.SQLite.Core.1.0.94.0\build - またはインストールしたCoreのどのバージョンでも参照できます)。

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

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

1
Malcolm

Visual C++ 2010再頒布可能パッケージがPCにインストールされていないため、この問題が発生しました。Visualc ++ 2010再頒布可能パッケージ Download をインストールしていない場合.

1
Ali Yousefi

私は自分でこの問題に遭遇しましたが、それは別の原因であることがわかりました。

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

この場合、コードはIIS(x86ビルド用に構成された)によってホストされているWebサービスから(間接的に)呼び出されました。私はついにIISのアプリケーションプールにそれを追いかけました:もともと私は"ASP.NET V4.0 Integrated"(それはそのエラーをもたらしました)を使っていました、しかし私がそれをに変えたとき"DefaultAppPool"、問題は解決しました。

(あー!)

0
Wayne Schroder

SQLLite CoreのNugetパッケージには、ファイルSystem.Data.SQLite.Core.targetsがあります。このライブラリを使用するすべてのプロジェクトとあなたのライブラリを使用したすべてのライブラリにこれを含めるだけです。

あなたの.csprojまたは.vbprojファイルに以下を追加してください:あなたがあなたのビンでコンパイルするたびに、SQLite.Interop.dllファイルでx86とx64ディレクトリを追加するでしょう。

0
prampe

この問題は複雑なので、ここに掲載したいと思いました。私の解決策は、.NET 4.0にロールバックすることでした。私は3日間テストしていてSystem.Data.SQLite.Core.1.0.98.0を.Net 4.5または.Net 4.5.1で動作させることができませんでした。

テストは3台のコンピューター、2台のサーバー、1台の開発PCで徹底的に行われました。問題の原因を突き止めることができませんでした。 .vsprojファイルを編集してみました。実質的にすべてのフォルダにSQLite.interop.dllを追加しました。パッケージをすべてのGACフォルダに適用し、個別に削除して再適用しました。最終的に削除されました。

私はSystem.Data.SQLite.Core.1.0.98.0を.Net 4.0で動かしています。私は引き続き移行を試みるつもりですが、最初に新しいプロジェクトを始めて、その方法でうまくいくかどうか確認します。これはもともと.Net 3.5 Webアプリでしたが、私の旅行の中で、私はまだそのフレームワークを参照している大量の情報を見つけました。

0
htm11h

私のアプリケーションはWebアプリケーション(ASP.NET MVC)であり、アプリケーションプールをLocalSystemではなくApplicationPoolIdentityで実行するように変更する必要がありました。これをする:

  1. IISマネージャを開く
  2. サイトが実行されているアプリケーションプールを探します。
  3. アクションから「詳細設定」をクリックします
  4. IDをLocalSystemに変更します

これで問題が解決する理由はわかりません。

0
CodingYoshi

だから、私の問題はSQLiteがWPFのデザイン時にロードしようとしていたということでした。私はx86環境だけを気にしていたので、CPU設定をそれに設定し、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内からソリューションをコンパイルして実行するときは、正しいビルド構成とプラットフォームを選択することが非常に重要です。第1に、Visual Studio内でデバッグされる管理対象アプリケーションは、混合モードアセンブリを使用することができない(すなわち、それは常にプラットフォーム固有のビルド出力ディレクトリにコンパイルされるため)。これは、同じソースプロジェクトファイルを使用して複数のプラットフォーム用のバイナリの構築を適切にサポートするために必要です。したがって、System.Data.SQLiteアセンブリに依存するVisual Studio内からマネージアプリケーションを実行する場合は、 "DebugNativeOnly"または "ReleaseNativeOnly"ビルド構成のみを選択する必要があります。これらのビルド構成は、必要なネイティブアセンブリをマネージ出力ディレクトリにコピーするカスタムポストビルドステップを含みます(つまり、マネージバイナリをインプレースで実行できるようにするため)。ただし、このビルド後の手順は、選択したプラットフォームがオペレーティングシステムのプラットフォームと一致する場合にのみ実行されます(たとえば、32ビットWindowsの場合は "Win32"、64ビットWindowsの場合は "x64")。そのため、ソリューションで管理対象プロジェクトを実行する前に、選択したビルドプラットフォームをオペレーティングシステムとダブルチェックすることをお勧めします。

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

0
B.K.

私の状況は少しユニークでした。 dockerコンテナ内でアプリケーションを実行していて、次のエラーが発生し続けました

System.DllNotFoundException:共有ライブラリ 'SQLite.Interop.dll'またはその依存関係のいずれかを読み込めません。読み込みの問題を診断するために、LD_DEBUG環境変数を設定することを検討してください。libSQLite.Interop.dll:共有オブジェクトファイルを開けません:そのようなファイルまたはディレクトリはありません

だから私はLD_DEBUG = libsどのフォルダを見つけるためにSystem.Data.SQLite.dllを探していたのかSQLite.Interop.dllを設定しました。

あなたは設定に関する情報を見つけることができますLD_DEBUGここ: http://www.bnikolic.co.uk/blog/linux-ld-debug.html

私がそれをした後、私はSQLite.Interop.dllがうまく見つけられていることに気づきました。見つからなかったDLLはlibSQLite.Interop.dllでした。エラーメッセージ全体を読んでおくべきです。

グーグルの時間後に、私はこれを発見しました ガイド SQLiteソースコードから欠けているDLLをコンパイルする方法について。

実際に見つからなかったファイルはlibSQLite.Interop.dll.soであることに注意してください。

とにかくあなたがソースコードをコンパイルするとき、あなたはあなたがlibSQLite.Interop.dll.soに名前を変更する必要があるlibSQLite.Interop.soを得て、それを見ているディレクトリにそれを置くことLD_DEBUGと設定することで見つけることができます。

私にとってはSystem.Data.SQLite.dllが探していたディレクトリは/usr/lib/x86_64-linux-gnu/でした

0
Jesse Morales

NugetパッケージのdllからSQLiteを利用して私のために働いていたKugelの答え(VS2015 Enterprise)を拡張すると、ビルドとテストの後でメインプロジェクトから削除できます。

1.メインプロジェクトにNugetパッケージをインストールします。

Install-Package System.Data.SQLite

2.アプリケーションをビルドし、Sqlite接続が機能していることをテストします。

select * from sqlite_master

3.メインビルドからNugetパッケージをアンインストールします。

UnInstall-Package System.Data.SQLite

4.SQLiteとEntityFrameworkのdll参照を手動で削除します。

System.Data.SQLite
System.Data.SQLite.EF6
System.Data.SQLite.Linq
  1. メインプロジェクトの“ packages.config” xmlファイルからXml参照を削除します。

これは私のために働き、私のプロジェクトをきれいに保ちます。

0
GBGOLC

Mineは単体テストでも機能せず、そして何らかの理由で、DeploymentItem属性に関するMichael Bromleyの回答が機能しませんでした。ただし、テスト設定を使用して動作させることができました。 VS2013で、ソリューションに新しい項目を追加して「設定」を検索し、「テスト設定」テンプレートファイルを選択します。 「SqliteUnitTests」または何かそれに名前を付けて、それを開きます。右側の「配置」を選択し、ディレクトリ/ファイルを追加します。 SQLite.Interop.dllファイルにパス/ディレクトリを追加します。私には、Project\bin\Debug\x64とConsole\bin\Debug\x86の2つのパスを追加しました。単体テスト/ソリューションからファイルへのアクセス方法によっては、Sqliteファイルを追加することもできます。

0
DharmaTurtle