ファイルまたはアセンブリ 'System.Data.SQLite'を読み込めませんでした


126

ELMAH 1.1 .Net 3.5 x64をASP.NETプロジェクトにインストールしましたが、(このページを表示しようとするといつでも)このエラーが発生します。

ファイルまたはアセンブリ 'System.Data.SQLite、Version = 1.0.61.0、Culture = neutral、PublicKeyToken = db937bc2d44ff139'またはその依存関係の1つを読み込めませんでした。不正な形式のプログラムを読み込もうとしました。

説明:現在のWebリクエストの実行中に未処理の例外が発生しました。エラーの詳細と、コードのどこで発生したかについて、スタックトレースを確認してください。

例外の詳細:System.BadImageFormatException:ファイルまたはアセンブリ 'System.Data.SQLite、Version = 1.0.61.0、Culture = neutral、PublicKeyToken = db937bc2d44ff139'またはその依存関係の1つを読み込めませんでした。不正な形式のプログラムを読み込もうとしました。

下部にあるエラーの詳細。

私のアクティブソリューションプラットフォームは「すべてのCPU」であり、x64のプロセッサーを搭載したx64 Windows 7で実行しています。このバージョンのELMAHを使用する理由は、1.0 .Net 3.5(x86、それがコンパイルされる唯一のプラットフォーム)が、x64 Windowsサーバーで同じエラーを発生させたためです。

x86とx64向けにコンパイルを試みましたが、同じエラーが発生します。すべてのコンパイラ出力(binおよびobj)を削除してみました。最後に、SQLite dllを直接参照しました。これは、プロジェクトがサーバーで機能するために必要ではなかったものであり、次のコンパイラエラーが発生します。

エラー1エラーとしての警告:アセンブリの生成-参照されているアセンブリ 'System.Data.SQLite.dll'は別のプロセッサMyProjectをターゲットにしています

問題が何であるか考えていますか?

エラーの詳細:

ソースエラー:

現在のWeb要求の実行中に、未処理の例外が生成されました。例外の発生源と場所に関する情報は、以下の例外スタックトレースを使用して識別できます。

スタックトレース:

[BadImageFormatException:ファイルまたはアセンブリ 'System.Data.SQLite、Version = 1.0.61.0、Culture = neutral、PublicKeyToken = db937bc2d44ff139'またはその依存関係の1つを読み込めませんでした。不正な形式でプログラムをロードしようとしました。]
System.Reflection.Assembly._nLoad(AssemblyName fileName、String codeBase、Evidence assemblySecurity、Assembly locationHint、StackCrawlMark&stackMark、Boolean throwOnFileNotFound、Boolean forIntrospection)+0
System.Reflection.Assembly .nLoad(AssemblyName fileName、String codeBase、Evidence assemblySecurity、Assembly locationHint、StackCrawlMark&stackMark、Boolean throwOnFileNotFound、Boolean forIntrospection)+43
System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef、Evidence assemblySecurity、StackCrawlMark&stackMark、Boolean forIntrospection)+127 System.Reflection.Assembly.InternalLoad(String assemblyString、Evidence assemblySecurity、StackCrawlMark&stackMark、Boolean forIntrospection)+142 System.Reflection.Assembly Load(String assemblyString)+28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName、Boolean starDirective)+46

[ConfigurationErrorsException:ファイルまたはアセンブリ 'System.Data.SQLite、Version = 1.0.61.0、Culture = neutral、PublicKeyToken = db937bc2d44ff139'またはその依存関係の1つを読み込めませんでした。不正な形式でプログラムをロードしようとしました。]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName、Boolean starDirective)+613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory()+203 System.Web.Configuration .CompilationSection.LoadAssembly(AssemblyInfo ai)
+105 System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig)+178
System.Web.Compilation.BuildProvidersCompiler..ctor(VirtualPath configPath、Boolean supportLocalization、String outputAssemblyName)+54
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult(Boolean isPrecompiledApp)+232
System.Web.Compilation.BuildManager.CompileGlobalAsax()+52 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()+337

[HttpException(0x80004005):ファイルまたはアセンブリ 'System.Data.SQLite、Version = 1.0.61.0、Culture = neutral、PublicKeyToken = db937bc2d44ff139'またはその依存関係の1つを読み込めませんでした。不正な形式でプログラムを読み込もうとしました。]
System.Web.Compilation.BuildManager.ReportTopLevelCompilationException()+58 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()+512 System.Web.Hosting.HostingEnvironment.Initialize( ApplicationManager appManager、IApplicationHost appHost、IConfigMapPathFactory configMapPathFactory、HostingEnvironmentParameters hostingParameters)+729

[HttpException(0x80004005):ファイルまたはアセンブリ 'System.Data.SQLite、Version = 1.0.61.0、Culture = neutral、PublicKeyToken = db937bc2d44ff139'またはその依存関係の1つを読み込めませんでした。不正な形式でプログラムをロードしようとしました。]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context)+8896783
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context)+85
System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr )+259


このような場合、Fusion(アセンブリバインディング)ログは、スタックトレースのこのシートよりもはるかに役立ちます。
Anton Tykhyy、2009

1
Cassiniがx86であることが問題だったようです。
プペノ2009

私は同じ問題を抱えており、私たちが持っている生産/開発環境が混在しているため、ELMAHを放棄する必要がありました。トラフィックの多いプロダクションWebサーバーでSQLiteを使用するのはあまり良くないように思われ、SQLite dllがELMAHでx86と64xビット用に2つの異なるバージョンを強制する唯一のアセンブリであるという事実を考えると、なぜELMAHの連中が引っ張るのだろうと思います。それを出し、それを今ではなくオプションにします。
Khash

回答:


122

System.Data.SQLite.dll混合アセンブリです。つまり、マネージコードとネイティブコードの両方が含まれています。したがって、特定System.Data.SQLite.dllはx86またはx64のいずれかですが、両方ではありません。

更新(提供J. Pablo Fernandez): Visual StudioでF5キーを押すか、緑色の«play»ボタンをクリックしたときに使用される開発WebサーバーであるCassiniはx86のみです。つまり、ワークステーションがx64であっても、 System.Data.SQLite.dllのx86バージョンを使用できます。

別の方法は、CassiniではなくIIS7を使用することです。IIS7は適切にx64です。


3
x64コンピューターでx64バージョンを使用しています。
プペノ2009

x86バージョンを使用してみましたか?
Anton Tykhyy 2009

2
少し前に利用可能になった新しい代替手段は、使用するアプリケーションプールのタイプを設定できるIIS Expressを使用することです
Raul Vejar

@Raul Vejar:IIS Expressのアプリケーションプール選択機能が32ビット/ 64ビットアセンブリの問題をどのように解決するかについて詳しく説明してください。ありがとう
Tim

@Tim、この機能を使用すると、使用するアプリケーションプールのタイプを32ビットまたは64ビットのいずれかで選択できます。これにより、Cassiniで修正されたアスペクトを制御し、同じビットライブラリで作業できます。つまり、SQLite dllの32ビットバージョンを使用している場合は、IIS Expressで32ビットアプリケーションプールを選択する必要があります。ライブラリの64ビットバージョンでは、64ビットアプリケーションプールを選択する必要があります。
Raul Vejar、2014

77

アプリプールの[32ビットアプリケーションを有効にする]がfalseに設定されていることを確認します。


2
これは、64ビットマシンでx86 dllを使用する場合に機能します。私たちの場合、開発環境と本番環境は一致しないため、これが最も効果的でした。
Rob

17
これをtrueに設定すると、実際に問題が解決しました。Elmahには、デフォルトで32ビットのSQL liteアセンブリが同梱されていると思います。

1
@JirapongとSergeyの両方で+1。この設定だったので、物事を機能させるために操作する必要がありました。私の場合、私はSqlLite DLLのx86バージョンを使用しており、32ビットアプリケーションの有効化を「true」に設定する必要があったと思います。
t3rse

43

に移動しますIIS7 Application Pool -> advanced settings and set the 32-bit application to true


私はWindows 7を実行していますが、この問題が発生しました。DLLのコピーが32ビットであったためと考えられ、32ビットをオンにして修正しました。
Doug

1
参考:これを機能させるには、アプリケーションプールIDをLocalSystemに設定する必要がありました。^
Illuminati

そしてSQLite.Interop.dllのWin32版の持っていることを確認してくださいstackoverflow.com/questions/4816529/...を
モルテンHolmgaard

14

SQLiteを使用していない場合、これは非常に簡単です。

SQLite DLLをソリューションのbinフォルダーから削除してから、ELMAHを参照するフォルダーから削除できます。再構築すると、アプリは、使用していないこのDLLを読み込もうとしません。


5
+1 SQLiteを使用していない場合、参照するDLLを修正する必要があるのはなぜですか。素晴らしく、エレガントで、まさに私が必要としていたものです。
bhavinb

これはローカルで機能しましたが、Azureにデプロイした後にエラーが発生しました。
stuartdotnet 2014年

8

私は64ビットの開発マシンと32ビットのビルドサーバーを持っています。NHibernateを初期化する前にこのコードを使用しました。どんなアーキテクチャでも魅力的に機能します(よく私がテストした2つ)

これが誰かを助けることを願っています。

グイド

        private static void LoadSQLLiteAssembly()
        {
            Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
            FileInfo fi = new FileInfo(dir.AbsolutePath);           
            string binFile = fi.Directory.FullName + "\\System.Data.SQLite.DLL";
            if (!File.Exists(binFile)) File.Copy(GetAppropriateSQLLiteAssembly(), binFile, false);
        }

        private static string GetAppropriateSQLLiteAssembly()
        {
            string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
            string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
            return GetLibsDir() + "\\NUnit\\System.Data.SQLite.x" + arch + ".DLL";
        }

誰かがこのテクニックをうまく使用しましたか?私はテストasp.net mvcアプリソリューションで試してみましたが、うまくいきませんでした。
Glenn

1
環境変数に移動する代わりに、CLRを直接使用できます。string arch = IntPtr.Size == 8?"x64": "x86";
Jason Morse、

2
または、Environment.Is64BitProcessプロパティ(.NET4以降)。
riezebosch 2011

5

私たちの場合、運用サーバーが見つからないため機能しませんでした

Microsoft Visual C ++ 2010 SP1再頒布可能パッケージ(x86)

私たちはそれをインストールし、すべて正常に動作しました。アプリケーションプールでは、32ビットアプリケーションの有効化をtrueに設定し、x86バージョンのライブラリを使用する必要があります。


1
私のために働く。Cライブラリがないことを指摘せずにエラーメッセージを表示するだけで、これはひどいことです。
brk

1
私のために、vcredist 2008 x64 for System.Data.SQLite、Version = 1.0.99.0、Culture = neutral、PublicKeyToken = db937bc2d44ff139
themadmax

5

Roadkill Wikiでまったく同じ問題を抱えたかなりの数のバグレポートに対処しなければならなかった人として、これはあなたがする必要があることです:

  • x64またはx86を使用していますか?Sqliteには、個別のアーキテクチャ用のDLLが付属しています-正しいものをbinフォルダーにコピーしてください。公式プロバイダーには2つのDLLがあります。System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • これらのアセンブリを探し回るのに煩わされない場合は、アプリプールで32ビットモードを有効にしてください(通常、開発マシンのソリューションのみ)
  • サーバーでホストしている場合は、Microsoft C ++ランタイム再頒布可能パッケージが必要です。これは、デフォルトではServer 2008 R2にインストールされていません。x64バージョンx86バージョン

SQLite .NETバイナリを再配布するときにジャンプする必要のあるフープの数は、お尻の痛みです。Roadkillの最終的な解決策は、使用しているアーキテクチャに基づいて正しいバイナリを〜/ binフォルダーにコピーすることでした。 。残念ながら、これはC ++ランタイムの問題を解決しません。


5

Nuget拡張機能を備えたSystem.Data.SQLiteをインストールすることで、これを解決しました。この拡張機能は、Visual Studio 2010以降で使用できます。まず、Nuget拡張機能をインストールする必要があります。ここをフォローできます:

  • Visual Studio 2010、メニュー->ツールに移動します
  • Extension Managerを選択します
  • 検索ボックスにNuGetと入力し、[オンラインギャラリー]をクリックします。情報を取得しています…
  • 取得したNuGetパッケージマネージャーを選択し、[ダウンロード]をクリックします。ダウンロードを待っています…
  • Visual Studio Extension Installer NuGet Package Managerで[Install]をクリックします。インストールが完了するまで待ちます。
  • [閉じる]をクリックして、[今すぐ再起動]をクリックします。

次に、SQLiteをインストールできます。

そして今、あなたはSystem.Data.SQLiteを使うことができます。

この場合、x64フォルダーとx86フォルダーの2つがあり、これらのフォルダーにはSQLite.Interop.dllが含まれています。次に、これらのDLLのプロパティウィンドウに移動し、ビルドアクションをコンテンツに設定し、出力ディレクトリにコピーを常にコピーするようにします。

それが私のやり方です。

ありがとう。キムトーファム、ホーチミン市、ベトナム。メール:tho.phamkim@gmail.com


4

手動の読み込みに関連するSystem.Data.SQLiteアセンブリは、これを解決できます。

以下のようにgatapiaのコードを変更しました:

    public static void LoadSQLLiteAssembly()
    {
        Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
        FileInfo fi = new FileInfo(dir.AbsolutePath);
        string appropriateFile = Path.Combine(fi.Directory.FullName, GetAppropriateSQLLiteAssembly());
        Assembly.LoadFrom(appropriateFile);
    }

    private static string GetAppropriateSQLLiteAssembly()
    {
        string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
        string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
        return "System.Data.SQLite.x" + arch + ".DLL";
    }

4

このエラーは、Windowsサーバーが32ビットOSから64ビットに変換されたときに発生しました。エラーをスローしていたアセンブリは、x86モード(つまり32モード)でコンパイルするように設定されていました。私はそれを「Any CPU」に切り替えて、それでうまくいった。この値を変更するには、次のようにします。

プロジェクトを右クリックして Properties -> Build -> Platform Target -> change to "Any CPU"


1
32ビットのSystem.Data.SQLite.dllを使用しようとしていて、64ビットCPUで実行するとこの例外が発生しました。プラットフォームターゲットを「Any CPU」から「x86」に変更したところ、例外が解消されました。32ビットまたは64ビットのCPUで実行できるように、パフォーマンスを最大化することを考えているのでない限り、最小公分母を構築する方が良いと思います。
cdavidyoung 2012

3

奇妙なことに、パッケージマネージャーコンソールではなく、Nuget GUIアプリケーションを介してSystem.Data.SQLiteをインストールすることで、これを解決しました。

コンソール経由のインストールには、このライブラリを実行するために必要な依存関係が含まれていませんでした。


3

System.Data.SQLiteSystem.Data.SQLite.interop両方のパッケージが同じバージョンであり、どちらもx86であることを確認することに依存しています。

これは古い質問ですが、私は上記すべてを試しました。私は厳密にx86プロジェクトに取り組んでいたため、/ x86、/ x64の2つのフォルダーはありませんでした。しかし、何らかの理由で、これSystem.Data.SQLiteはとは異なるバージョンでしたSystem.Data.SQLite.interop。一致するDLLをプルダウンすると、問題は修正されました。


1

2つの簡単な解決策を思いつきました。どちらも私のために働きます。問題は許可のためだと思います。

1)net-2.0ディレクトリーのElmah.dllファイルを使用する代わりに、net-1.1のElmah.dllを使用しました。

2)Elmah.dllをプロジェクトのbinディレクトリに保存する代わりに。私はそれを置くためにdllディレクトリを作ります。


1

これを回避する別の方法は、アプリケーションを1.1ではなくELMAH 1.2にアップグレードすることです。


0

binデバッグフォルダーを削除して再コンパイルできますか?

または、へのプロジェクト参照を確認System.Data.SQLiteし、それが配置されている場所を追跡して、反射板でDLLを開きます。それを開くことができない場合、つまりdllが破損している場合は、正しいものを見つけるか、.netフレームワークを再インストールする必要があります。


System.Data.SQLiteへの参照を直接追加しようとしました(binとobjを削除することは別)。次のエラーが発生しました:エラー1エラーとしてエラー:アセンブリの生成-参照されたアセンブリ 'System.Data.SQLite.dll 「異なるプロセッサMyProjectとターゲット
pupeno

0

開発マシンのWebサーバーとしてIIS Expressを使用している場合は、ローカルIISに変更します。これでうまくいきました。


0

これは古い投稿ですが、このエラーを検索している一部のユーザーは、アプリプールの[32ビットアプリケーションを有効にする]をTrueに設定してみると役立つ場合があります。それが私にとってエラーを解決したものです。私は@beckelmwの回答へのコメントを読んでこの解決策を見つけました。


0

間違ったパッケージがインストールされている可能性があります。System.Data.Commonプロバイダーモデルを実装するMicrosoftが作成したパッケージが必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.