1
8
我刚刚看到一个类似的问题,在视图中使用一些lambda表达式,这会导致在64位系统上编译时.NET dll损坏。这导致了你看到的同样的例外,当然听起来像是一个可能的候选人。 抱歉,如果这看起来有点含糊,因为我们还没有完全解决这个问题,并且仍在调查它,尽管我会确保在我们有解决方案时更新这里。 让我们相信这是一个实际损坏的dll的线索是,如果您在ildasm.exe中查看编译的视图dll,并检查涉及lamda的实际方法调用,您会得到一个在ildasm中显示的“[签名过早结束]”错误。然而,Redgate的Reflector在尝试扩展该方法时崩溃。 在我们的例子中,ildasm如下所示:
我们注意到这只是一个64位的问题。我们将调查.NET 4.0上是否仍存在此问题。我们知道后我会在这里更新。 我们也在研究微软是否将此作为一个缺陷提出。再次提醒,我们知道后我会在这里更新。 [编辑:现在已经找到问题的根本原因] 我想我会回来更新这个答案。 对我们来说,这根本不是编译器的问题,而是aspnet合并的问题。简而言之,在我们的64位构建框中,我们使用了一个旧的、过时的aspnet合并副本(意外),它看起来工作正常,但导致了这些损坏的dll(与您描述的完全相同)。路径已更改,因此我们的Web部署项目使用了错误的版本。 更新到aspnet合并3.5版或更高版本的路径,修复了问题。 我们原以为这是一个64位的问题,因为我们的构建盒是我们编译的唯一64位环境(我们所有的开发人员工作站都是32位的),而且是唯一有这个问题的环境。然而,“咬”是一条红鲱鱼! 希望这能帮助你解决你的问题。 |
2
2
听起来像是在调用一个32位的COM组件。您可能需要以32位模式运行应用程序,或者更改您的依赖关系。 更多信息请参见斯科特·汉瑟曼的帖子。 |
3
2
BadgerB在 this thread 可能是关于某件事:
听起来工作场景和非工作场景之间的区别在于用于构建二进制文件的机器/环境。在64位机器上与TeamCity一起构建时,某个方法的接口或签名是否正在更改,从而导致此错误? 当发生此异常时,是否可以发布完整的调用堆栈?是否有对本机代码的COM对象或P/Invoke调用?您是否使用任何本机代码? |
4
2
您是否可以排除服务器或其软件的严重问题? 通过跟踪和您对第53行的评论,我会认真考虑一些与您的代码无关的损坏情况,即,我希望触发任何相关的.NET代码来改变错误中的堆栈。 |
5
0
把这个放在外面,以防别人发现这个问题。
我有一个类似的问题,尽管错误消息略有不同:
我跟踪了这个问题,直到一个lambda在.NET 4.0网站项目和一个3.5类库之间传递,然后使用
该问题仅在安装了VS2012(及其.NET 4.0到4.5的就地升级)之后出现。 相关问题 âBad binary signatureâ in ASP.NET MVC application 似乎对我发现的问题更为具体,所以我在那里给出了一个更详细的答案。 希望有帮助。 |
6
0
由于这是我过去三天调查中最重要的来源,我将把我的解决方案张贴在这里。 与报告此问题的其他人类似,我们有一个成功的32位部署环境,运行TeamCity,但正在迁移到64位,这是唯一发生这种情况的地方。它也只出现在特定的页面上,而不是像某些人报告的那样“间歇”或“随机”。 在系统地排除了所有的问题(主要是aspnet_merge.exe版本和环境)并找到了一个可以重现问题的MVC页面之后,我把它归结为一个代码问题。其他地方也指出lambda表达式是我们的原因。以下代码仅与视图中的代码相关。 为了达到目的,不管代码是否错误, 将 使用在32位上运行的aspnet_merge.exe 4.x版:
其中,与64位的aspnet_merge.exe版本4.x相同 有 写为:
我知道这个提示的名称是iequality*comparer*,它在逻辑上应该接受两个参数,但是第一个版本将在32位环境中编译和工作。 我只希望这篇文章能帮助处于同样情况下的其他人。然后我确信有人能够破译出这个问题,并将其分解成某种奇怪的32-vs-64位intptr问题。 |
melmi · 如何在C中实例化堆中的结构# 7 年前 |
Max · 使用flatbuffers从C#序列化到本机内存缓冲区 7 年前 |
Saurabh Agrawal · 如何在数据标签C中使用模式属性# 7 年前 |
Nat · 如何在UWP应用程序中创建COM对象?(C#) 9 年前 |