Asp.net mvc &引用;“错误的二进制签名”;在ASP.NET MVC应用程序中

Asp.net mvc &引用;“错误的二进制签名”;在ASP.NET MVC应用程序中,asp.net-mvc,interop,64-bit,Asp.net Mvc,Interop,64 Bit,当ASP.NET MVC应用程序部署到64位Windows 2008服务器盒时,我们在ASP.NET MVC应用程序的某些页面上遇到上述错误。它在我们的开发机器上运行良好,尽管这些机器是32位XP。只是想知道以前是否有人遇到过这种情况,有什么建议吗?详情如下: 错误的二进制签名。(来自HRESULT的异常:0x80131192) 描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源 异常详细信息:System.Runtime.InteropS

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

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

描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源

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

所有项目都设置为针对任何CPU进行编译,并在发布模式下进行编译。ASP.NET站点已预编译,预编译的版本位于64位Windows 2008 TeamCity生成代理上。提前谢谢

编辑

我们仍然被这件事困扰着。我使用corflags.exe查看了网站bin目录中的所有二进制文件。没有设置32位标志,除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

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

更多信息请参见Scott Hanselman的帖子

BadgerB-in可能有什么发现:

是我错了还是这个错误 应该是在调用dll时引起的 发生了重大变化(如: 方法调用的签名已更改) 无需重新编译使用 接收新签名的dll 帐户

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


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

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


根据追踪和你对第53行的评论,我会认真考虑一些与你的代码无关的东西,也就是说,我希望任何相关的.NET代码被触发来改变错误中的堆栈。

< P>我刚才看到了一个类似的问题,其中在视图中使用了一些lambda表达式,这导致了在64位系统上编译时.NETDLL的损坏。它会导致与您所看到的相同的异常,而且听起来很可能是一个候选人

道歉,如果这似乎有点含糊,因为我们还没有完全解决这个问题,仍在研究中,虽然我会确保更新这里,当我们有一个解决方案

让我们相信这是一个实际损坏的dll的线索是,如果您在ildasm.exe中查看编译后的视图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])
IL\u 029f:调用class[System.Core]System.Linq.Expressions.Expression`1[System.Core]System.Linq.Expressions.Expression::Lambda(class[System.Core]System.Linq.Expressions.Expression,class[System.Core]System.Linq.Expressions.ParameterExpression[])
IL_02a4:调用类[System.Web.Mvc]System.Web.Mvc.HtmlHelper[MyCode.Extensions]MyCode.Extensions.System.Web.Mvc.HtmlHelpInputExtensions::CheckBox(类[System.Core]System.Linq.Expressions.Expression`1[签名过早结束])
我们注意到这只是一个64位问题。我们将调查.NET4.0上是否仍存在此问题。我们知道后我会在这里更新

我们还正在研究这是否是微软提出的一个bug。再一次,当我们知道的时候,我会在这里更新

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

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

对我们来说,这根本不是编译器的问题,而是aspnet_merge的问题。简言之,在我们的64位构建框中,我们使用的是一个旧的、过时的aspnet_merge副本(意外),该副本似乎可以正常工作,但却导致这些损坏的DLL(与您描述的方式完全相同)。路径已更改,因此我们的web部署项目使用了错误的版本

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

我们最初认为这是一个64位的问题,因为我们的构建框是我们编译的唯一64位环境(我们所有的开发人员工作站都是32位的),也是唯一一个有这个问题的环境。然而,“咬人”是一条红鲱鱼


希望这能帮助你解决你的问题。

把这句话说出来,以防别人发现这个问题

我也遇到了类似的问题,尽管错误消息略有不同:
System.BadImageFormatException:错误的二进制签名。(HRESULT的例外:0x80131192)

我将问题追溯到一个lambda,该lambda是在使用
预编译后在.NET4.0网站项目和3.5类库之间传递的
Model.MyEvents.Distinct(x => x.CategoryName).Many()
Model.MyEvents.Distinct((x, y) => x.CategoryName == y.CategoryName).Many()