asp.net-mvc - ASP.NET MVC 应用程序中的 "Bad binary signature"

标签 asp.net-mvc interop 64-bit

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

Bad binary signature. (Exception from HRESULT: 0x80131192)

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Runtime.InteropServices.COMException: Bad binary signature. (Exception from HRESULT: 0x80131192)

所有项目都设置为针对任何 CPU 进行编译,并在 Release模式下编译。 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

最佳答案

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

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

让我们相信这是一个实际损坏的 dll 的线索是,如果您在 ildasm.exe 中查看已编译的 View dll,并检查涉及 lamda 的实际方法调用,您会得到一个“[签名提前结束]” 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 位),也是唯一一个存在此问题的环境。然而,“比特”是一个转移注意力的事情!

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

关于asp.net-mvc - ASP.NET MVC 应用程序中的 "Bad binary signature",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2101529/

相关文章:

css - 显示登录屏幕时在 _Layout.cshtml 文件中隐藏导航

c# - 如何查看 ASP.Net MVC 中调用的每个 Controller 和操作方法?

javascript - jQuery .load() 函数不返回任何内容

c# - 将 C++ 结构传递给 C# 应用程序

asp.net-mvc - 如何在mvc中的 Controller 中对 session 变量进行单元测试

c++ - 我如何从 Ocaml 调用 C++ 代码,使用它自己的共享库 .so ?

winapi - 在 *.VBS 文件中导入 WinAPI 函数

64-bit - 哪些技术限制可能会阻止 MS 在 VS 2010 64 位上实现 IntelliTrace?

visual-studio-2010 - 无法使用针对x64的VC++/VS2010进行编译:LNK1158:无法运行cvtres.exe

c - C 64 位机器中字符串的大小