2

我重构了一个大型 F# 项目。它有一个自动构建命令,可以在 F# 编译器的一次长时间运行中编译所有源文件。这样我就可以轻松地进行可重现的构建。buildcommand 在构建项目之前在自身上运行 nunit-console,这一切都很好。重构之后,我的大部分单元测试开始失败:

异常:System.BadImageFormatException:尝试加载格式不正确的程序。(来自 HRESULT 的异常:0x8007000B)

这是使用 F# 2.0 编译项目时,我可以从命令行重现相同的问题(即不使用 NUnit)。堆栈跟踪通常指向一段无害的新代码(一个只存储一些数据而没有做任何明显的事情的构造函数)。

但是,当使用 F# 3.0 编译项目时,所有在 F# 2.0 下遇到问题并且我尝试过的单元测试都通过了。这是从命令行调用时(不使用 NUnit)。NUnit 现在声称我可以手动调用的新编译的可执行文件不存在。有一个很长的堆栈跟踪,顶部有文件未找到异常。(我没有尝试使用 F# 3.0 构建 buildcommand,因此它的单元测试仍然可以正常运行也就不足为奇了)。

Google 建议 HRESULT: 0x8007000B 可能是由编译器错误引起的。这可能是一个糟糕的工匠指责他的工具的情况,但是当使用 F# 3.0 时问题就消失了。有人可以提出任何建议以尝试在 F# 2.0 下重新运行吗?

我对使用 F# 3.0 并不太担心。但我真的需要 NUnit 才能工作。有谁知道可能出了什么问题?重申一下,Nunit 无法加载从命令行启动时运行良好的可执行文件,但在使用 F# 2.0 而不是使用 F# 3.0 编译时从同一位置加载相同的可执行文件。

对于这方面的任何帮助,我将不胜感激。非常感谢。

4

2 回答 2

0

I believe you'll also get this error message if you try to load a 32-bit assembly in a 64-bit process (or vice versa). What Platform Target are you compiling the projects with (set via the Build tab of the project properties pane)?

My guess is there's some mixup in your project settings or other configuration files which is causing the F# 2.0 compiler to compile it for the wrong platform target. When NUnit tries to load the assembly, it has a different 'bitness' than the NUnit assemblies -- which I believe have specific versions for 32- and 64-bit systems -- and ends up crashing.

于 2012-08-10T19:00:43.147 回答
0

这闻起来可能是绑定重定向问题。当您调用 NUnit 时,您只是将 DLL/EXE 传递给它,还是将 .nunit 文件传递​​给它?在任何一种情况下,请确保有一个对应的 .config 文件,其绑定重定向与您在 VS2012 中使用新的 ConsoleApplication 项目获得的绑定重定向相同(例如,重定向 FSharp.Core 2.0.0.0 -> 4.3.0.0 的那些,因为 powerpack 取决于前者,而你的 VS2012 盒子上有后者)。

于 2012-08-10T19:26:36.440 回答