130

ASP.NET プロジェクトに ELMAH 1.1 .Net 3.5 x64 をインストールしましたが、次のエラーが表示されます (ページを表示しようとするたびに)。

ファイルまたはアセンブリ '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 の 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 つを読み込めませんでした。
不正な形式のプログラムをロードしようとしました
。 .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 つを読み込めませんでした。
不正な形式のプログラムを読み込もうとしました。.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 つを読み込めませんでした。
不正な形式のプログラムを読み込もうとしました。ApplicationManager appManager、IApplicationHost appHost、IConfigMapPathFactory configMapPathFactory、HostingEnvironmentParameters、hostingParameters) +729

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

) +259

4

19 に答える 19

125

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

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

別の方法は、カッシーニではなく、適切にx64であるIIS7を使用することです。

于 2009-08-15T13:27:24.373 に答える
80

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

于 2009-09-09T15:48:34.583 に答える
45

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

于 2010-11-27T10:21:13.370 に答える
15

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

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

于 2011-09-27T18:23:30.567 に答える
9

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";
        }
于 2010-05-10T23:06:43.510 に答える
6

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

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

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

これで、System.Data.SQLite を使用できるようになりました。

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

だから、それが私のやり方です。

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

于 2015-12-30T03:45:39.967 に答える
5

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

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

インストールしましたが、すべて正常に動作します。アプリケーション プールでは、Enable 32-bit Applications が true に設定されている必要があり、ライブラリの x86 バージョンが必要です。

于 2012-09-06T12:25:58.327 に答える
5

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

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

SQLite .NETバイナリを再配布するときにどれだけのフープをジャンプしなければならないかは本当に苦痛です.最終的にRoadkillに対する私の解決策は、使用しているアーキテクチャに基づいて正しいバイナリを ~/bin フォルダにコピーすることでした. . 残念ながら、それでは C++ ランタイムの問題は解決されません。

于 2013-01-03T20:23:13.923 に答える
4

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

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

于 2010-12-10T17:59:40.273 に答える
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";
    }
于 2011-01-10T05:17:05.047 に答える
3

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

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

于 2016-04-13T08:58:47.413 に答える
1

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

于 2012-06-27T18:06:15.690 に答える
1

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

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

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

于 2011-09-01T20:43:59.250 に答える
0

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

または、プロジェクトへの参照を確認し、そのSystem.Data.SQLite場所を追跡してから、リフレクターで dll を開きます。開くことができない場合は、dll が破損していることを意味します。正しいものを見つけるか、.net フレームワークを再インストールすることをお勧めします。

于 2009-08-14T16:49:59.143 に答える