由NUnit项目引起的System.BadImageFormatException

今天是个好日子。 我整天都在工作中遇到同样的问题,并且正在努力寻找任何新的路径。

当我的解决方案在服务器上构建时,我收到以下错误。 我在解决方案中运行/调试所有测试没有问题,并且构建正常。 服务器和我的电脑都是x64。 我已经遵循了许多建议,但我发现这些建议都无济于事。

在所有配置下,我已将Platform Target设置为x86,用于我的解决方案中的所有项目。

我知道有一个nunit-console-x86.exe可能会有所不同,但我不知道在代码中指定这个位置。

请注意我已经开始上网了,如果我错过了什么,请道歉。

System.BadImageFormatException:无法加载文件或程序集
‘Spin.TradingServices.DataAcquisition.Test.NUnit,Version = 1.0.12103.2060,Culture = neutral,PublicKeyToken = null’或其依赖项之一。 尝试加载格式不正确的程序。
文件名:’Spi​​n.TradingServices.DataAcquisition.Test.NUnit,Version = 1.0.12103.2060,Culture = neutral,PublicKeyToken = null’

服务器堆栈跟踪:System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,RuntimeAssembly locationHint,StackCrawlMark&stackMark,Boolean throwOnFileNotFound,Boolean forIntrospection,Boolean suppressSecurityChecks)在System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef,Evidence) assemblySecurity,StackCrawlMark&stackMark,Boolean forIntrospection,Boolean suppressSecurityChecks)位于NUnit.Core.Builders.TestAssemblyBuilder.Load(String path)的System.Reflection.Assembly.Load(AssemblyName assemblyRef),位于NUnit.Core.Builders.TestAssemblyBuilder.Build(String assemblyName)位于NUnit.Core.Core.Tore上的NUnit.Core.Tore.Core.TestSuiteBuilder.Build(TestPackage包)的NUnit.Core.TestSuiteBuilder.BuildSingleAssembly(TestPackage包)中的NUnit.Core.Builders.TestAssemblyBuilder.Build(String assemblyName,String testName,Boolean autoSuites)上的布尔autoSuites) NUnit.Core.Proxy的.Core.SimpleTestRunner.Load(TestPackage包) 在System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md,Object []的NUnit.Core.moreTestRunner.Load(TestPackage包)的NUnit.Core.ProxyTestRunner.Load(TestPackage包)上的TestRunner.Load(TestPackage包) System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg,Int32 methodPtr,Boolean fExecuteInContext)中的args,Object server,Int32 methodPtr,Boolean fExecuteInContext,Object []和outArgs)

在[0]处重新抛出exception:位于NUnit.Core的System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&msgData,Int32类型)的System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)。位于NUnit.ConsoleRunner.Runner.Main(String [] args)的NUnit.ConsoleRunner.ConsoleUi.Execute(ConsoleOptions选项)的NUnit.Util.TestDomain.Load(TestPackage包)中的TestRunner.Load(TestPackage包)

警告:assembly绑定日志记录已关闭。 要启用程序集绑定失败日志记录,请将注册表值[HKLM \ Software \ Microsoft \ Fusion!EnableLog](DWORD)设置为1.注意:程序集绑定失败日志记录会导致一些性能损失。 要关闭此function,请删除注册表值[HKLM \ Software \ Microsoft \ Fusion!EnableLog]。

http://app1017-build.oy.gb.sportingindex.com:8080/job/TradingServices.DataAcquisition-Dev/ws/DataAcquisition/build.proj(86,5) :错误MSB6006:“nunit-console.exe”已退出代码-100。 完成建筑项目“(默认目标) – 失败。

建立失败。

请注意:我们已经恢复了对Hudson的构建,现在逐渐重新提交文件。 我将报告这是怎么回事。 不幸的是,尝试让这几个人参与其中无济于事。 耻辱!

更新我暂时没有回到这个页面,但看起来有很多不同的解决方案。 如果我能把它们全部标记为答案我会! 那些你在这里找到自己的方式的人应该对每个选项给予同等的信任。

检查程序集的目标框架版本与nUnit test runner支持的相同。 有关支持的运行时列表,请参阅runFile.exe.config。

此外,如果你有从FW 3到FW 4的megrate,他们有不同的运行时间(CLR是不同的)。

我在X64 pc上使用控制台应用程序遇到此问题,构建设置为x86并且仍然崩溃。 我在控制台应用程序上进入了属性,在构建之下,我将平台目标从x86更改为任何CPU,然后突然所有测试都运行并成功运行。

值得注意的是,Configuration Manager的平台字段可以“撒谎”,并且实际上不必反映项目的属性实际配置的内容。 我的配置管理器说“Common.dll”被构建为“任何CPU”,但项目属性(真正重要的设置)是将其构建为“x86”。

在此处输入图像描述

所有答案的一个小的补充。 您可能需要更改NUnit运行程序平台(对我来说是Resharper),就像我的情况一样。 见例子 在此处输入图像描述

当我针对Console或WPF应用程序进行测试时,我经常遇到这种情况。 一些原因是

  • 首先,确保您的应用程序不在.Net Framework 3或4客户端配置文件上运行
  • 然后在应用程序和测试项目上比较目标框架.NET版本。 它们应该是一样的
  • 在构建选项卡上检查平台目标。 它们应该是一样的。 例如,如果测试项目具有“ 任何CPU ”目标,则应用程序必须具有“ 任何CPU ”。

确保此设置正确: 测试菜单 – >测试设置 – >默认处理器体系结构 – > x64 / x86 。 在我的情况下它是不正确的,它失败了同样的问题。

这可能听起来很愚蠢,但是,请检查您的项目和处理器架构。 就我而言,我在64 位机器上运行64位测试(因为它构建了64位项目)。

你猜怎么着? 它实际上是一台32位机器。 所以NUnit.exe运行为32位(显然),并且无法理解64位测试。

解决方案? 构建测试的x86和x64版本,并在x86计算机上运行x86,在x64计算机上运行x64。

明显。 但值得一试。

对我来说,exception是由nunit的invalid /process=single参数引起的。 如果我更改了值,那么exception就消失了:

 /process=separate 

要么

 /process=multiple 

p / s:迟到的答案,但仅供参考..

我的情况有点不同。 运行已修改的unit testing后,错误似乎很随机。

我删除了测试,错误消失了。

我重新创建了测试,错误又回来了。

我重命名了测试,错误消失了。

我重新命名了测试,问题没有再次发生。

希望这可以帮助!

谢谢Ashes999唤醒我。

这个问题确实再次回归。 回滚和上传没有用。 它原来是一个我们甚至不再使用的监视器对象。 注释并修复。

找到这个的方法是通过调试所有unit testing。 修复它暂停的所有地方。 如果t没有暂停那么错误。

对于仍然遇到此问题的任何人,您还可能需要在测试运行器上设置框架字段以匹配所包含项目中的框架字段(该字段位于AlexM引用的字段的右侧)。

就我而言,我正在为Windows Phone 8库编写测试套件,而NUnit无法正确地找出它应该使用的框架版本。