ファイルまたはアセンブリ「System.Data.SQLite」を読み込めませんでした
質問
ASP.NET プロジェクトに ELMAH 1.1 .Net 3.5 x64 をインストールしましたが、(ページを表示しようとすると必ず) 次のエラーが発生します。
ファイルまたはアセンブリをロードできませんでした 'System.Data.SQLite、バージョン=1.0.61.0、 Culture=neutral、 PublicKeyToken=db937bc2d44ff139' or その依存関係の一つである。試み のプログラムをロードするように作られた。 不正確なフォーマット。
説明:現在のWeb要求の実行中に、未解決の例外が発生しました。スタックトレースを見てください エラーについての詳細は そして、それがコードのどこで発生したのか。
例外の詳細:System.BadImageFormatException:可能性 ファイルやアセンブリをロードしない 'System.Data.SQLite、バージョン=1.0.61.0、 Culture=neutral、 PublicKeyToken=db937bc2d44ff139' or その依存関係の一つである。試み のプログラムをロードするように作られた。 不正確なフォーマット。
エラーの詳細は下部にあります。
私の Active Solution プラットフォームは「任意の CPU」で、x64 Windows 7 (もちろん x64 プロセッサ) で実行しています。このバージョンの ELMAH を使用している理由は、1.0 .Net 3.5 (x86、コンパイル対象の唯一のプラットフォーム) が x64 Windows サーバーで同じエラーを引き起こしたためです。
x86 と x64 用にコンパイルしようとしましたが、同じエラーが発生します。すべてのコンパイラ出力(bin と obj)を削除してみました。最後に、SQLite DLL を直接参照しましたが、これはプロジェクトがサーバー上で動作するためには必要のないもので、次のコンパイラ エラーが発生しました。
エラー 1 エラーとしての警告:アセンブリの生成 -- 参照されたアセンブリ 'System.Data.SQLite.dll' は別のプロセッサ MyProject をターゲットとしています
何が問題なのか考えられますか?
エラーの詳細:
ソースエラー:
処理されない例外が発生した 現在の ウェブのリクエスト。に関する情報 例外の起源と場所 は、例外 スタック・トレース
スタックトレース:
[BadImageFormatException:できなかった ロードファイルまたはアセンブリ 'System.Data.SQLite、バージョン=1.0.61.0、 Culture=neutral、 PublicKeyToken=db937bc2d44ff139' or その依存関係の一つである。試み のプログラムをロードするように作られた。 書式が間違っている。]
System.Reflection.Assembly._nLoad(アセンブリ名) ファイル名、文字列 codeBase、Evidence アセンブリーセキュリティー、アセンブリー locationHint, StackCrawlMark&. stackMark, ブーリアン throwOnFileNotFound, Boolean forIntrospection) 0
System.Reflection.Assembly.nLoad(アセンブリ名) ファイル名、文字列 codeBase、Evidence アセンブリーセキュリティー、アセンブリー locationHint, StackCrawlMark&. stackMark, ブーリアン throwOnFileNotFound, Boolean forIntrospection) 43
System.Reflection.Assembly.InternalLoad(アセンブリ名) アセンブリーレフ、エビデンス アセンブリーセキュリティ, StackCrawlMark&. stackMark, Boolean forIntrospection) 127 System.Reflection.Assembly.InternalLoad(String) アセンブリーストリング、エビデンス アセンブリーセキュリティ, StackCrawlMark&. stackMark, Boolean forIntrospection) 142 System.Reflection.Assembly.Load(String) アセンブリ文字列) 28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String) assemblyName, Boolean starDirective) 46[構成エラー例外:可能性 ファイルやアセンブリをロードしない 'System.Data.SQLite、バージョン=1.0.61.0、 Culture=neutral、 PublicKeyToken=db937bc2d44ff139' or その依存関係の一つである。試み のプログラムをロードするように作られた。 書式が間違っている。]
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, 論理値 サポートローカライゼーション, String outputAssemblyName) 54
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult(Boolean) isPrecompiledApp) 232
System.Web.Compilation.BuildManager.CompileGlobalAsax() 52 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() 337[HTTP例外 (0x80004005):できなかった ロードファイルまたはアセンブリ 'System.Data.SQLite、バージョン=1.0.61.0、 Culture=neutral、 PublicKeyToken=db937bc2d44ff139' or その依存関係の一つである。試み のプログラムをロードするように作られた。 書式が間違っている。]
System.Web.Compilation.BuildManager.ReportTopLevelCompilationException() 58 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() 512 System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager) appManager, IApplicationHost appHost、 IConfigMapPathFactory configMapPathFactory、 ホスティング環境パラメータ hostingParameters) 729[HTTP例外 (0x80004005):できなかった ロードファイルまたはアセンブリ 'System.Data.SQLite、バージョン=1.0.61.0、 Culture=neutral、 PublicKeyToken=db937bc2d44ff139' or その依存関係の一つである。試み のプログラムをロードするように作られた。 書式が間違っている。]
System.Web.HttpRuntime.FirstRequestInit(HttpContext) コンテキスト) 8896783
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext) コンテキスト) 85
System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest) wr) 259
解決
System.Data.SQLite.dll
混合アセンブリです。つまり、これには、マネージ コードとネイティブ コードの両方が含まれます。したがって、特定の System.Data.SQLite.dll
x86 または x64 のいずれかですが、両方になることはありません。
アップデート (提供:J.パブロ・フェルナンデス): F5 キーを押すか、緑色の「再生」ボタンをクリックしたときに Visual Studio によって使用される開発 Web サーバーである Cassini は x86 のみです。つまり、ワークステーションが x64 であっても、x86 バージョンのシステムしか使用できません。データ.SQLite.dll。
別の方法は、Cassini ではなく、適切に x64 である IIS7 を使用することです。
他のヒント
「32有効 - ビットアプリケーションを」ことを確認します。アプリケーションプールのためにfalseに設定されている。
IIS7 Application Pool -> advanced settings and set the 32-bit application to true
に移動します。
これは非常に単純です。
あなたは、あなたがELMAHを参照するフォルダから、あなたのソリューションのbinフォルダからSQLiteのDLLを削除することができます。再構築し、そしてあなたのアプリは、あなたが使用していないこのDLLをロードしようとしません。
私は、64ビットのdevのマシンと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";
}
Roadkill Wiki でまったく同じ問題に関するかなりの数のバグ報告に対処しなければならなかった人として、これはあなたがしなければならないことです:
- x64 または x86 を使用していますか?Sqlite には、個別のアーキテクチャ用の DLL が付属しています。適切な DLL を bin フォルダーにコピーします。公式プロバイダーには 2 つの DLLS があります。
System.Data.SQLite.dll
System.Data.SQLite.Linq.dll
- これらのアセンブリを探し回るのが面倒な場合は、アプリ プールの 32 ビット モードを有効にしてください (通常、開発マシンのみのソリューションです)。
- サーバー上でホストしている場合は、Microsoft C++ ランタイム再頒布可能ファイルが必要になります。デフォルトでは、Server 2008 R2 にはインストールされません。 x64バージョン, x86バージョン
SQLite .NET バイナリを再配布するときにどれだけの困難を乗り越えなければならないかは、本当に面倒です。最終的に Roadkill に対する私の解決策は、使用しているアーキテクチャに基づいて、正しいバイナリを ~/bin フォルダにコピーすることでした。 。残念ながら、これでは C++ ランタイムの問題は解決されません。
Nuget 拡張機能を使用して System.Data.SQLite をインストールすることで、これを解決しました。この拡張機能は Visual Studio 2010 以降で使用できます。まず、Nuget 拡張機能をインストールする必要があります。ここからフォローできます:
- Visual Studio 2010、メニュー --> ツールに移動します。
- 拡張機能マネージャーを選択します
- 検索ボックスに「NuGet」と入力し、[オンライン ギャラリー] をクリックします。待機中 情報を取得しています…
- 取得した NuGet パッケージ マネージャーを選択し、[ダウンロード] をクリックします。待っています ダウンロード…
- Visual Studio 拡張機能インストーラー NuGet パッケージ マネージャーで [インストール] をクリックします。インストールが完了するまで待ちます。
- 「閉じる」をクリックして「今すぐ再起動」をクリックします。
次に、SQLite をインストールできるようになりました。
- Visual Studio のメニュー [ツール] -> [ライブラリ パッケージ マネージャー] -> [パッケージ マネージャー コンソール] に移動します。
- 次に、パッケージ マネージャー コンソールでコマンド Install-Package System.Data.SQLite を実行します。このような:パッケージ マネージャー コンソールでコマンド Install-Package System.Data.SQLite を実行します。
これで、System.Data.SQLite を使用できるようになりました。
この場合、x64 と x86 の 2 つのフォルダーが表示され、これらのフォルダーには SQLite.Interop.dll が含まれています。次に、これらの DLL のプロパティ ウィンドウに移動し、ビルド アクションをコンテンツに設定し、出力ディレクトリにコピーするを常にコピーするように設定します。
それが私のやり方です。
ありがとう。キム・トー・ファム ベトナム、ホーチミン市。Eメール:tho.phamkim@gmail.com
マニュアル負荷関連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";
}
私はこのエラーを得ました。エラーをスローしたアセンブリは、x86のモード(すなわち、32モード)でコンパイルするように設定しました。私は「どれCPU」に切り替え、それはトリックをしました。あなたは、次の作業を実行して、この値を変更することができます:
プロジェクトを右クリックし、
Properties -> Build -> Platform Target -> change to "Any CPU"
に行きます 私たちの場合は動作しませんでした
のMicrosoft Visual C ++ 2010 SP1再頒布可能パッケージ(x86)
私たちは、それをインストールし、すべてが正常に動作します。アプリケーションプールを持ってtrueに設定された32ビットアプリケーションを有効にする必要がありますし、次の作業を行う必要があり、ライブラリのx86バージョン
Iは、パッケージマネージャコンソールとは対照的に、Nuget GUIアプリケーションを介してSystem.Data.SQLiteをインストールすることにより、奇妙なことに、これを解決します。
コンソール経由でインストールするには、このライブラリを実行する必要がある依存関係が含まれていませんでした。
私は2つの迅速な解決策を思い付きました。どちらか私のために働きます。私は、問題は、権限のだと思います。
代わりにネット-2.0ディレクトリからElmah.dllファイルを使用しての1)、私はネット-1.1からElmah.dllを使用します。
2)の代わりに、プロジェクトのbinディレクトリにElmah.dllを維持します。私はそれを置くためにDLLディレクトリを作成します。
これを回避する別の方法は、ELMAH 1.2ではなく1.1にアプリケーションをアップグレードするだけです。
System.Data.SQLite
はSystem.Data.SQLite.interop
への依存性は、両方のパッケージが同じバージョンであり、両方があることを確認しているの x86のの。
この古い質問ですが、私は上記のすべてを試してみました。私は厳密の x86ののプロジェクトに取り組んでいたので、2つのフォルダ/ x86の、/ x64のではありませんでした。しかし、いくつかの理由で、System.Data.SQLite
はSystem.Data.SQLite.interop
するために、異なるバージョンでした、私は問題が修正されたDLLをマッチングプルダウン一度ます。
あなたはビンデバッグフォルダを削除して、もう一度再コンパイルすることはできますか?
またはリフレクタでDLLを開く、それがどこにあるか追跡、System.Data.SQLite
にプロジェクト参照を確認してください。あなたがそれを開くことができない場合、それはdllファイルが破損していることを意味し、あなたは正しいものを見つけるか、.NET Frameworkを再インストールすることをお勧めします。
私は、ローカルIISに変更します。これは私のために働いています。
これは古い記事ですが、それは、このエラーに検索する一部の人々はアプリケーションプールのためにTrueに「有効32ビット・アプリケーション」を設定してみてくださいするのを助けることができます。それは私のために、エラーを解決するものです。私は@ beckelmwの回答にいくつかのコメントを読むことによって、この解に来ています。
あなたは可能性がインストールされ、間違ったパッケージを持っています。あなたはSystem.Data.Commonを実装して、Microsoftののnoreferrer">