【问题标题】:IIS 7.5 Fixing An attempt was made to load a program with an incorrect format problem?IIS 7.5 Fixing 尝试加载格式不正确的程序?
【发布时间】:2014-05-28 20:25:14
【问题描述】:

我遇到异常问题,抛出异常“尝试加载格式不正确的程序”错误?我在同一个 IIS 服务器上有两个相同的网站,我的构建配置适用于其中一个,但不适用于另一个。

我的 C# MVC 2 Web 应用程序可以部署到位于同一个 IIS 7.5 网络服务器 (x64) 上的两个网站。一个是活动站点(使用发布配置部署),第二个是测试站点(使用仅为该项目创建的新 Beta 配置部署)。两个项目的代码库是相同的。它们具有不同的构建配置,但配置内部的设置是相同的。

将发布配置部署到 Default Website/my_app 效果很好。

将 beta 配置部署到 Beta/my_app 部署,但是当我加载站点(任何页面)时,我得到了不正确的格式异常。

我不明白为什么使用完全相同的配置设置进行部署对一个网站有效,而对另一个网站无效(在同一网络服务器上)。我的服务器 + 开发机器是 64 位的,两个网站都有相同的应用程序池设置(.NET 4,集成)。

我怎样才能找到/解决这个问题?最好不必为每个站点设置不同的配置设置。而且最好不必更改发布配置,因为这是有效的,我不想冒险更改它。

这两个网站是:

Default Website/my_app
Beta/my_app

发布的配置管理器有以下设置:

测试版的配置管理器具有完全相同的设置:

例外是:

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 有多个问题询问“尝试加载格式不正确的程序”,但我不认为这是重复的。这是一种独特的情况,配置在一个站点上运行良好,但在另一个站点上使用相同的配置设置和相同的网络服务器却不能。

【问题讨论】:

  • 当你用 Cassini 运行它时会发生什么?

标签: c# configuration build 64-bit iis-7.5


【解决方案1】:

发现问题——解决方法是两个AppPools的配置方式:

  • 默认网站/my_app 正在使用 DefaultAppPool,其中启用 32 位应用程序为 TRUE
  • Beta/my_app -> BetaAppPool is using Enable 32-Bit applications is FALSE

更改 BetaAppPool 以将启用 32 位应用程序设置为 TRUE 已解决此问题。

@Rick 在这个问题上找到了解决方案:C# Entity Framework 4 Common Language Runtime detected an invalid program error?

【讨论】:

  • 只是添加到这个答案 - 我还通过网络应用程序并确保它可以在 64 位上运行,然后在两个 AppPools 上将启用 32 位应用程序设置为 false - 它可以工作并且性能也更好
  • 谢谢!我在看blogs.msdn.com/b/sayanghosh/archive/2007/04/21/…,但结果却是这个设置……谢谢!
  • 他们(.net)为什么不直接说存在 32-64 位不匹配问题。谢谢
猜你喜欢
  • 2011-05-19
  • 1970-01-01
  • 2014-01-11
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 2016-05-17
相关资源
最近更新 更多