web-dev-qa-db-ja.com

IIS 7.5修正不正な形式の問題でプログラムをロードしようとしましたか?

「不正な形式のプログラムを読み込もうとしました」という例外をスローするという異常な問題がありますか?同じIISサーバー上に2つの同一のWebサイトがあり、ビルド構成はいずれか一方に対して機能しますが、もう一方に対しては機能しません。

私のC#MVC 2 Webアプリは、同じIIS 7.5 Webサーバー(x64)にある2つのWebサイトに展開できます。1つはライブサイト(リリース構成を使用して展開)、2つ目はベータサイト(このプロジェクト用に作成された新しいベータ構成を使用してデプロイされます。)両方のプロジェクトのコードベースは同じです。ビルド構成は異なりますが、構成内の設定は同じです。

デフォルトWebサイト/ my_appにリリース構成をデプロイすると、完全に機能します。

Beta/my_appにベータ構成をデプロイすると、サイト(任意のページ)をロードすると、誤った形式の例外が発生します。

まったく同じ構成設定でデプロイすると、あるWebサイトでは機能するが、同じWebサーバーでは別のWebサイトでは機能しない理由を理解できません。私のサーバー+開発マシンは64ビットであり、両方のWebサイトのアプリプール設定は同じです(統合された.NET 4)。

この問題を見つける/修正するにはどうすればよいですか?サイトごとに異なる構成設定を持つ必要はありません。そして、できればリリース構成を変更する必要はありません。それが機能しているので、変更するリスクを冒したくありません。

2つのWebサイトは次のとおりです。

Default Website/my_app
Beta/my_app

リリースの構成マネージャーには、次の設定があります。

release build configuration

ベータ版の構成マネージャーの設定はまったく同じです。

beta build configuration

例外は次のとおりです。

Could not load file or Assembly 'MyApp.Domain.Model' or one of its dependencies. 
An attempt was made to load a program with an incorrect format.

Stack Trace:

[BadImageFormatException: Could not load file or Assembly 'MyApp.Domain.Model' or one of its dependencies. An attempt was made to load a program with an incorrect format.]
   System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
   System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) +567
   System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +192
   System.Reflection.Assembly.Load(String assemblyString) +35
   System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +123

[ConfigurationErrorsException: Could not load file or Assembly 'MyApp.Domain.Model' or one of its dependencies. An attempt was made to load a program with an incorrect format.]
   System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +11479520
   System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +484
   System.Web.Configuration.AssemblyInfo.get_AssemblyInternal() +79
   System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +334
   System.Web.Compilation.BuildManager.CallPreStartInitMethods() +280
   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +1087

[HttpException (0x80004005): Could not load file or Assembly 'MyApp.Domain.Model' or one of its dependencies. An attempt was made to load a program with an incorrect format.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11612256
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +141
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +4842149

「SO「不正な形式のプログラムをロードしようとしました」」という質問が複数あることを確認しましたが、これが重複しているとは思わない。あるサイトで設定が正常に機能しているが、両方に同じ設定と同じWebサーバーを使用している別のサイトでは設定が正常に機能しないというユニークな状況。

41
JK.

問題が見つかりました-解決策は、2つのAppPoolを構成する方法です。

  • デフォルトのWebサイト/ my_appは、32ビットアプリケーションを有効にするがTRUEであるDefaultAppPoolを使用しています
  • Beta/my_app-> BetaAppPoolが32ビットアプリケーションの有効化を使用しているのはFALSEです

BetaAppPoolを変更して[32ビットアプリケーションを有効にする]をTRUEに設定すると、この問題は修正されました。

この質問について@Rickが解決策を見つけました: C#Entity Framework 4 Common Language Runtime detected an invalid program error?

81
JK.

X64展開場所にドロップされているx86 dllがあります。

しないでください。機能しません。

2
Joshua