当它部署到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目录中的所有二进制文件。没有设置32BIT标志,并且所有的CorFlags值都为9,除了Antlr3.Runtime.dll,其值为1.该问题仅影响某些页面,并且似乎是使用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
我刚刚看到一个类似的问题,其中在视图中使用了一些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位),并且是唯一一个遇到此问题的环境。然而,“位”是一个红鲱鱼!
希望这可以帮助您解决问题。
BadgerB in 这个帖子 可能是某事:
我错了还是这个错误
应该是在dll时引起的
变化很大(
方法调用的签名已更改)
无需重新编译使用的代码
将新签名带入的dll
帐户。
听起来工作和非工作场景之间的区别在于用于构建二进制文件的机器/环境。可能是因为在64位计算机上使用TeamCity构建时,某些方法的接口或签名正在改变,然后导致此错误?
当发生此异常时,您可以发布完整的调用堆栈吗?是否有任何COM对象或P / Invoke调用本机代码?您使用的是本机代码吗?
您是否可以排除服务器或其软件的严重问题?
通过跟踪和你对第53行的评论,我会认真考虑与你的代码无关的腐败事件,即我希望触发任何相关的.net代码来改变错误中的堆栈。
把它放在那里,以防其他人发现这个问题。
我遇到了类似的问题,但错误信息略有不同:
System.BadImageFormatException: Bad binary signature. (Exception from HRESULT: 0x80131192)
在使用预编译后,我将问题跟踪到在.NET 4.0网站项目和3.5类库之间传递的lambda aspnet_merge
。
该问题仅在安装VS2012(及其将.NET 4.0升级到4.5)后才出现。
相关问题 ASP.NET MVC应用程序中的“错误的二进制签名” 似乎对我发现的问题更加具体,所以我在那里给出了更详细的答案。
希望有所帮助。
由于这是我过去三天调查中最重要的来源,我将在此处发布我的解决方案。
与报告此问题的其他人类似,我们已经有一个成功运行TeamCity的32位部署环境,但正在转向64位,这是唯一发生这种情况的地方。它也只出现在特定的页面上 - 不像某些报道那样“间歇地”或“随机地”出现。
在有条不紊地排除了大量事物(主要是aspnet_merge.exe版本和环境)之后,找到一个我可以重现问题的MVC页面,我把它归结为代码问题。其他地方也指出lambda表达式是我们的一些原因。以下代码仅与视图中的代码相关。
为了达到目的,不正确的代码,这个 将 在32位运行的aspnet_merge.exe版本4.x上工作:
Model.MyEvents.Distinct(x => x.CategoryName).Many()
如64bit上的aspnet_merge.exe版本4.x那样 具有 写成:
Model.MyEvents.Distinct((x, y) => x.CategoryName == y.CategoryName).Many()
我知道提示是名称IEquality * Comparer *,逻辑上应该采用两个参数,但第一个版本将编译并在32位环境中工作。
我只希望这篇文章能够在同样的情况下帮助其他人。我确信有人能够破译这个并将其研究成32-vs-64-bit IntPtr问题,这个问题有些奇怪。