27

我在 Vista 64 位上,我有一个使用 x86 配置构建的项目。一切正常。现在,我们正在创建测试。我们有 NUnit 2.4.8 但我们有很多问题。

当我们直接选择 .dll 时,测试正在通过 Nunit.exe (gui) 加载,但在执行时我们有一个 system.badimageformatexception。

我通过在 Google 上搜索了一些关于 nunit.exe.config 的技巧,但没有任何工作。(更改为 UTF8...取消注释 .net 版本以进行启动)。

任何的想法?

更新

我已经清理了解决方案并删除了所有 BIN 文件夹。现在,当我编译时,我清楚地看到 bin 目录中只有 /x86/,而不是 x64 中的旧 /debug/。

当我使用 Nunit 时,我有一个异常(在加载中):System.IO.FileNotFoundException...

服务器堆栈跟踪:在 System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) 在 System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) 在 System.Reflection.Assembly.Load(String assemblyString) 在 NUnit.Core.Builders.TestAssemblyBuilder.Load(String path) 在 NUnit.Core.Builders.TestAssemblyBuilder.Build(String assemblyName, Boolean autoSuites) 在 NUnit.Core.Builders.TestAssemblyBuilder.Build(String assemblyName, String testName,Boolean autoSuites) 在 NUnit.Core.TestSuiteBuilder.BuildSingleAssembly(TestPackage package) 在 NUnit.Core.TestSuiteBuilder.Build(TestPackage package) 在 NUnit.Core.SimpleTestRunner.Load(TestPackage package) 在 NUnit.Core.ProxyTestRunner.Load(TestPackage package ) 在 NUnit.Core.ProxyTestRunner.Load(TestPackage package) 在 NUnit.Core.RemoteTestRunner.Load(TestPackage package) 在 System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg,Int32 methodPtr,布尔 fExecuteInContext)处的 methodPtr,布尔 fExecuteInContext,Object[]& outArgs)Build(TestPackage package) at NUnit.Core.SimpleTestRunner.Load(TestPackage package) at NUnit.Core.ProxyTestRunner.Load(TestPackage package) at NUnit.Core.ProxyTestRunner.Load(TestPackage package) at NUnit.Core.RemoteTestRunner.Load( TestPackage 包)在 System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs) 在 System.Runtime.Remoting.Messaging.StackBuilderSink。 SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)Build(TestPackage package) at NUnit.Core.SimpleTestRunner.Load(TestPackage package) at NUnit.Core.ProxyTestRunner.Load(TestPackage package) at NUnit.Core.ProxyTestRunner.Load(TestPackage package) at NUnit.Core.RemoteTestRunner.Load( TestPackage 包)在 System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs) 在 System.Runtime.Remoting.Messaging.StackBuilderSink。 SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext) )System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext) )

在 [0] 处重新抛出异常:在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 在 NUnit.Core 的 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)。 NUnit.Util.TestDomain.Load(TestPackage package) 处的 TestRunner.Load(TestPackage package) NUnit.Util.TestLoader.LoadTest(String testName)

更新 2

我正在使用已修改为 x86 而不是 x64 的任何 CPU 进行编译。原因是为了调试。这已经在上一个链接中讨论过了。我必须确认 NUnit 在 64bits mod 和 Corflags.exe 中运行

4

6 回答 6

52

好的,我在这个网站上找到了解决方案。您必须使用 \NUnit-2.4.8\bin\nunit-x86.exe 而不是 \NUnit-2.4.8\bin\nunit.exe ...不知道 \bin\ 有 2 个 nunit! !

谢谢大家

于 2008-10-16T16:36:57.487 回答
5

NUnit 主机很可能作为 64 位进程运行(您可以通过查看任务管理器来确认)。如果您的程序集只是 x86,那么它将无法在该进程中运行。

您可以尝试在 NUnit 可执行文件上运行corflags以强制它运行 x86,使用 /32bit+ 标志

于 2008-10-16T15:35:14.397 回答
4

在 MSBuild 运行平台设置为 x86的x64构建服务器上从 TeamCity 3.1 升级到 4.0 时,也会发生这种情况。TeamCity runner 似乎在 4.0 和 3.1 中默认平台不同,不尊重构建运行 x86 的事实。

在我的情况下,第一个有效的修复是在我的 MSBuild 脚本中向 NUnit 调用添加一个平台覆盖:

<NUnit Assemblies="Test/bin/$(Platform)/$(Configuration)/Test.dll" Platform="x86" />

(即,在其他建议中强制 32 位的 TeamCity 测试运行器方式)

(这包括当测试程序集的平台目标是任何 CPU 时(尽管碰巧我已将它们显式设置为 x86,因为某些测试会动态加载受限于 x86 的 DLL))。

于 2008-12-03T16:26:48.127 回答
0

为什么你使用 x86 配置而不是任何 CPU?

我想当您加载 NUnit 时,它是使用 Any CPU 选项构建的,因此 JIT 是 x64 代码。当它尝试加载专门编译为作为 x86 运行的测试时,它会引发异常。

我会尝试将您的所有配置设置更改为任何 CPU,看看这是否能解决您的问题。

于 2008-10-16T15:36:20.260 回答
0

如果使用 TeamCity,您可以将值为x86的属性teamcity.dotnet.nant.nunit2.platform添加到 TeamCity 项目配置设置中的构建参数(在属性和环境变量部分)。

于 2011-05-27T11:40:30.690 回答
0

TeamCity 8.1 也有同样的问题。解决它的方法是将 NUnit 构建步骤.NET Runtime / Platform:更改为x86

我还必须将运行测试从以下位置更改:从TestProject\bin\ReleaseTestProject\bin\x86\Release的路径

于 2014-06-02T11:40:51.187 回答