【问题标题】:"Bad binary signature" in ASP.NET MVC applicationASP.NET MVC 应用程序中的“错误二进制签名”
【发布时间】:2010-01-20 13:14:30
【问题描述】:

当将 ASP.NET MVC 应用程序部署到 64 位 Windows 2008 服务器盒时,我们在某些页面上遇到上述错误。它在我们的开发机器上运行良好,尽管这些是 32 位 XP。只是想知道是否有人以前遇到过这种情况,有什么建议吗?详情如下:

错误的二进制签名。 (HRESULT 异常:0x80131192)

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Runtime.InteropServices.COMException:二进制签名错误。 (HRESULT 异常:0x80131192)

所有项目都设置为针对任何 CPU 编译,并在发布模式下编译。 ASP.NET 站点是预编译的,预编译的构建是在 64 位 Windows 2008 TeamCity 构建代理上。提前致谢。

编辑

我们仍然对此感到困扰。我已经使用 corflags.exe 查看了网站 bin 目录中的所有二进制文件。没有设置 32BIT 标志,除 Antlr3.Runtime.dll 的值为 1 外,所有的 CorFlags 值为 9。该问题仅影响某些页面,并且似乎是使用 FluentValidation 的页面(包括 FluentValidation.Mvc和 FluentValidation.xValIntegration 程序集)。使用 corflags.exe 检查时,这些都没有显示任何异常,并且 ildasm 没有显示奇怪的依赖关系。

在本地构建(32 位 Windows XP)时,该站点可以正常部署和运行。在构建代理(64 位 Windows 2008 Server)上构建时,站点会显示这些错误。该站点以集成管道模式运行,并且未设置为 32 位。

堆栈跟踪是:

[COMException (0x80131192): Bad binary signature. (Exception from HRESULT: 0x80131192)]
   ASP.views_user_newinternal_aspx.__RenderContent2(HtmlTextWriter __w, Control parameterContainer) in e:\TeamCity\buildAgent\work\605ee6b4a5d1dd36\...Admin.Mvc\Views\User\NewInternal.aspx:53
   System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +115
   ASP.views_shared_site_master.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in e:\TeamCity\buildAgent\work\605ee6b4a5d1dd36\...Admin.Mvc\Views\Shared\Site.Master:26
   System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +115
   System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +240
   System.Web.UI.Page.Render(HtmlTextWriter writer) +38
   System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) +94
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4240

【问题讨论】:

  • 这引出了一个明显的问题,你看过asp.net创建的临时文件的第53行了吗?
  • 它是 using (Html.BeginForm("CreateNewInternal", "User")) 块的右大括号,其中包括验证摘要。手指缓慢但肯定地指向与 FluentValidation/xVal 或我认为介于两者之间的某事有关。

标签: asp.net-mvc interop 64-bit


【解决方案1】:

我刚刚看到与此类似的问题,其中在视图中使用了一些 lambda 表达式,这会导致在 64 位系统上编译时导致 .Net dll 损坏。它会导致与您看到的相同的异常,而且听起来确实很可能。

抱歉,如果这看起来有点含糊不清,因为我们还没有完全解决这个问题,并且仍在调查它,但当我们有解决方案时,我一定会在这里更新。

让我们相信这是一个实际损坏的 dll 的线索是,如果您在 ildasm.exe 中查看编译后的视图 dll,并检查涉及 lamda 的实际方法调用,您会得到“[SIGNATURE ENDED PREMATURELY]” ildasm 中显示的错误。但是,RedGate 的反射器在尝试扩展该方法时会崩溃。

在我们的例子中,ildasm 看起来像这样:

IL_029f:  call class [System.Core]System.Linq.Expressions.Expression`1<!!0> [System.Core]System.Linq.Expressions.Expression::Lambda<class [System.Core]System.Func`2<class [MyCode.Authentication.Admin.Mvc]MyCode.Authentication.Admin.Mvc.Dto.InternalUserDto,object>>(class [System.Core]System.Linq.Expressions.Expression, class [System.Core]System.Linq.Expressions.ParameterExpression[])
IL_02a4:  call class [System.Web.Mvc]System.Web.Mvc.HtmlHelper [MyCode.Extensions]MyCode.Extensions.System.Web.Mvc.HtmlHelperInputExtensions::CheckBox<[2]>(class [System.Core]System.Linq.Expressions.Expression`1<class [System.Core]System.Func`2<class [MyCode.Extensions]'type parameter'.T,object>> [SIGNATURE ENDED PREMATURELY])

我们注意到这只是一个 64 位问题。我们即将调查这个问题是否仍然出现在 .Net 4.0 上。当我们知道时,我会在这里更新。

我们还在查看这是否已作为 Microsoft 的错误提出。再次,当我们知道时,我会在这里更新。

[编辑:现在找到问题的根本原因]

我想我会回来更新这个答案。

对我们来说,事实证明这根本不是编译器问题,而是 aspnet_merge 的问题。简而言之,在我们的 64 位构建盒上,我们使用了一个旧的、过时的 aspnet_merge 副本(意外地),它似乎可以工作,但会导致这些损坏的 dll(完全按照您描述的方式)。路径已更改,因此我们的 Web 部署项目使用了此错误版本。

更新到 aspnet_merge 3.5 或更高版本的路径,修复了问题。

我们最初认为这是一个 64 位问题,因为我们的构建盒是我们编译时唯一使用的 64 位环境(我们所有的开发工作站都是 32 位),并且是唯一一个存在此问题的环境。然而,“位”是一条红鲱鱼!

希望这可以帮助您解决问题。

【讨论】:

  • 谈谈最后一分钟的答案。太棒了——这正是问题所在。我们所有的视图都被一个 web 部署项目编译成一个 DLL,当我在这个 DLL 上使用 ildasm 时,这正是我所看到的。期待听到您的进一步调查;目前,至少我们明白为什么会发生这种情况。
【解决方案2】:

听起来您正在调用 32 位 COM 组件。您可能需要以 32 位模式运行应用程序或更改您的依赖项。

有关更多信息,请参阅 Scott Hanselman 的帖子。

http://www.hanselman.com/blog/32bitnessAnd64bitnessAndMigratingDasBlogOnIIS7AndASPNETUnderVista64.aspx

【讨论】:

  • 谢谢科林。我们正在进一步调查 - 不知道任何 32 位依赖项,但是我们没有在类似站点中使用的一个组件没有出现任何问题。将及时向大家发布。如果没有其他内容,请为链接 +1...
  • 我遇到了类似的问题,但我认为这与 64 位和 32 位问题无关。它可能与团队城市有关。
  • 不,还没有解决。现在重新访问,并使用更多信息编辑了问题。
【解决方案3】:

this thread 中的 BadgerB 可能正在做某事:

是我弄错了还是这个错误 应该是当一个 dll 是 发生了显着变化( 方法调用的签名已更改) 无需重新编译使用的代码 将新签名放入的 dll 帐户。

听起来工作场景和不工作场景之间的区别在于用于构建二进制文件的机器/环境。会不会是在 64 位机器上使用 TeamCity 构建时,某些方法的接口或签名发生了变化,从而导致了这个错误?

您能否发布此异常发生时的完整调用堆栈?是否有任何 COM 对象或对本机代码的 P/Invoke 调用?您是否使用任何本机代码?

【讨论】:

  • 谢谢克里斯,我已经阅读了那个帖子,但没有找到任何可以帮助我的东西。我添加了堆栈跟踪(名为 truncated 的程序集)。没有 COM 对象或 P/Invoke - 纯托管代码。
【解决方案4】:

您是否可以排除服务器或其软件的严重问题?

通过跟踪和您对第 53 行的评论,我会认真考虑与您的代码无关的损坏,即我希望触发任何相关的 .net 代码来改变错误中的堆栈。

【讨论】:

  • 我们有两个环境,开发和 QA,其中表现出相同的行为。也就是说,这些环境中的服务器是从同一映像构建的虚拟机,因此可能存在一些问题。我们无法让任何其他 Windows 2008 服务器试用此功能。
【解决方案5】:

把这个放在那里,以防其他人发现这个问题。

我遇到了类似的问题,但错误消息略有不同: System.BadImageFormatException: Bad binary signature. (Exception from HRESULT: 0x80131192)

在使用 aspnet_merge 预编译后,我将问题归结为 .NET 4.0 网站项目和 3.5 类库之间传递的 lambda。

该问题仅在安装 VS2012(以及将 .NET 4.0 升级到 4.5)后才出现。

相关问题“Bad binary signature” in ASP.NET MVC application似乎更针对我发现的问题,所以我在那里给出了更详细的答案。

希望对您有所帮助。

【讨论】:

    【解决方案6】:

    由于这是我过去三天调查中最重要的来源,因此我将在此处发布我的解决方案。

    与报告此问题的其他人类似,我们已经成功地运行了 TeamCity 的 32 位部署环境,但正在迁移到 64 位,这是唯一发生这种情况的地方。它也只出现在特定页面上,而不是像某些人所报告的那样“间歇”或“随机”出现。

    在有条不紊地排除了一大堆事情(主要是 aspnet_merge.exe 版本和环境),并找到了一个可以重现问题的 MVC 页面之后,我把它归结为代码问题。其他地方也指出 lambda 表达式是原因,这对我们来说也是如此。以下代码仅与视图中的代码相关。

    为了说明问题,不管代码是否错误,这个在 32 位上运行的 aspnet_merge.exe 版本 4.x 上工作:

    Model.MyEvents.Distinct(x => x.CategoryName).Many()
    

    在 aspnet_merge.exe 版本 4.x 上 64 位它写成:

    Model.MyEvents.Distinct((x, y) => x.CategoryName == y.CategoryName).Many()
    

    我知道提示在名称 IEquality*Comparer* 中,它在逻辑上应该接受两个参数,但第一个版本将在 32 位环境中编译和工作。

    我只是希望这篇文章能帮助其他处于同样情况的人。然后我确信有人能够破译它并将其分解为某种奇怪的 32-vs-64 位 IntPtr 问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多