我有一个C ++ / CLI DLL,它使用一些C ++ DLL(都是为32位构建的)。我想通过使用NUNit 2.5.8.10295在C#DLL中测试它(更改为2.6.4没有改变结果)
我使用批处理文件,最终扩展到这个:
nunit-console-x86.exe "someUnitTests.dll" /framework=4.0.30319 /xml=NUnitResult_someUnitTests.xml
使用此命令在我的开发PC(64位Win 10 Enterprise Visual Studio 2013)上运行正常。从Visual Studio Professional 2013启动nunit-console-x86.exe并将工作目录设置为两个DLL的输出文件夹时,它也可以正常工作。
在构建服务器(在Windows Server 2012 R2上运行的Jenkins)上执行时,测试失败并显示以下消息:
SetUp : System.IO.FileLoadException : Could not load file or assembly 'some.DLL' or one of its dependencies. A dynamic link library (DLL) initialization routine failed. (Exception from HRESULT: 0x8007045A)
我尝试比较两台计算机上安装的框架和运行时(除了使用VS 2013 Express的buildserver之外,没有看到明显的重大差异)。我还尝试了SysInternals ProcessMonitor,但没有成功。依赖性walker的输出我不明白。
有关使用技术或工具的任何提示吗?
更新: 如果我添加/ noshadow它也不再在我的开发PC上运行。在Visual Studio中,然后nunit-console-x86崩溃,而在命令行上,我得到与buildserver相同的消息。如果使用或不使用/ noshadow
运行它并没有什么区别在没有任何Visual Studio但使用vc_redist 2013的情况下,在Windows 7的测试PC上仔细观察:启用了阴影复制(=没有/ noshadow)我得到了这个:
SetUp : System.IO.FileNotFoundException : Could not load file or assembly 'some.DLL' or one of its dependencies. The specified module could not be found.
使用/ noshadow,错误变为BadImageFormatException
答案 0 :(得分:1)
默认情况下,NUnit 2.x卷影复制文件,但卷影复制不会复制本机程序集。我相信它正在Visual Studio中工作,因为您正在设置工作目录。
要在NUnit中禁用卷影复制,请传递/noshadow
命令行选项。
另外,NUnit 3中的默认行为是不进行卷影复制。
答案 1 :(得分:0)
最后,我设法通过创建一个没有NUNit的控制台应用程序来减少复杂性,遇到类似的问题并修复它。有关详细信息,请参阅x86 console application doesn't run on 64bit machines except in debugger。