F# 奇怪的F运行时错误发生在F2而不是F3,NUnit也拒绝加载运行的可执行文件

F# 奇怪的F运行时错误发生在F2而不是F3,NUnit也拒绝加载运行的可执行文件,f#,nunit,f#-3.0,F#,Nunit,F# 3.0,我重构了一个大型F项目。它有一个自动构建命令,可以在F编译器的一次长期运行中编译所有源文件。这样我就可以轻松地进行可复制的构建。buildcommand在构建项目之前在自身上运行nunit控制台,这一切都很顺利。重构后,我的大部分单元测试开始失败,原因是: 异常:System.BadImageFormatException:试图用加载程序 格式不正确。来自HRESULT的异常:0x8007000B 这是当项目使用F2.0编译时,我可以从命令行重现相同的问题,即不使用NUnit。stacktrac

我重构了一个大型F项目。它有一个自动构建命令,可以在F编译器的一次长期运行中编译所有源文件。这样我就可以轻松地进行可复制的构建。buildcommand在构建项目之前在自身上运行nunit控制台,这一切都很顺利。重构后,我的大部分单元测试开始失败,原因是:

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

这是当项目使用F2.0编译时,我可以从命令行重现相同的问题,即不使用NUnit。stacktrace通常指向一段无关紧要的新代码—一个只存储一些数据而不做任何明显操作的构造函数

然而,当项目使用F3.0编译时,所有在F2.0下遇到问题的单元测试和我尝试过的单元测试都通过了。这是在不使用NUnit从命令行调用时发生的。NUnit现在声称我可以手动调用的新编译的可执行文件并不存在。有一个长stacktrace,顶部有“未找到文件”异常。我还没有尝试使用F3.0构建buildcommand,所以它的单元测试仍然很好也就不足为奇了

Google建议HRESULT:0x8007000B可能是由编译器错误引起的。这可能是一个糟糕的崩溃者指责他的工具的例子,但当使用F3.0时,问题就消失了。有人能提出一些建议,让事情在F2.0下重新运转吗

我对使用F3.0不太在意。但我真的需要它来工作。有人知道会出什么问题吗?只是重申一下,Nunit无法加载从命令行启动时运行良好的可执行文件,但在使用F2.0而不是使用F3.0编译时从同一位置加载相同的可执行文件


我真的非常感谢你在这方面的帮助。非常感谢。

我相信如果您尝试在64位进程中加载32位程序集,或者在64位进程中加载32位程序集,您也会收到此错误消息。通过“项目属性”窗格的“生成”选项卡,使用set编译项目的平台目标是什么


我猜您的项目设置或其他配置文件中有一些混淆,导致F2.0编译器将其编译为错误的平台目标。当NUnit尝试加载程序集时,它的“位”与NUnit程序集不同,我相信NUnit程序集具有针对32位和64位系统的特定版本,并且最终会崩溃。

我相信如果您尝试在64位进程中加载32位程序集,或者在64位进程中加载32位程序集,您也会收到此错误消息。通过“项目属性”窗格的“生成”选项卡,使用set编译项目的平台目标是什么


我猜您的项目设置或其他配置文件中有一些混淆,导致F2.0编译器将其编译为错误的平台目标。当NUnit尝试加载程序集时,它的“位”与NUnit程序集不同,我相信NUnit程序集有针对32位和64位系统的特定版本,并最终崩溃。

这听起来可能是绑定重定向问题。当您调用NUnit时,您是将DLL/EXE传递给它,还是将.NUnit文件传递给它?在这两种情况下,请确保有一个对应的.config文件,该文件具有与VS2012中新的ConsoleApplication项目相同的绑定重定向,例如重定向FSharp.Core 2.0.0.0->4.3.0.0的文件,因为powerpack依赖于前者,而VS2012框上有后者。

这闻起来可能是绑定重定向问题。当您调用NUnit时,您是将DLL/EXE传递给它,还是将.NUnit文件传递给它?在这两种情况下,请确保有一个对应的.config文件,该文件具有与VS2012中新的ConsoleApplication项目相同的绑定重定向,例如重定向FSharp.Core 2.0.0.0->4.3.0.0的文件,因为powerpack依赖于前者,而后者则位于VS2012框中。

我似乎根本没有指定。然而,我认为可能不是这样,因为大约80%的单元测试仍然通过。不管是什么,整个过程都是在编译器的一次运行中编译的,所以不可能存在多个相互冲突的平台。另外,在重构之前,它工作得很好,我对构建系统没有做任何改动。很抱歉之前没有提到这一切。可能是F 3.0版本没有加载到Nunit中,因为存在一些这样的不匹配。有什么提示吗?这是我使用的命令行:“c:/ProgramFilesx86/Microsoft F/v4.0/Fsc.exe'-g-debug:full-tailcalls+-target:exe-warn:4-warnaserror:76-LCID:1033-utf8output-fullpath-flaterrors-out:-医生:-李白:-定义:调试-定义:跟踪-引用:FSharp.PowerPack.Parallel.Seq.dll-引用:nunit.framew
ork.dll-reference:FsCheck.dll-reference:System.Xml.dll-reference:System.Xml.Linq.dll跟踪了大量的.fs文件您仍然可能有一个冲突的目标平台,即使整个内容在编译器的一次运行中编译,即编译到单个程序集中。编译后的程序集和NUnit之间可能会发生冲突-如果您的计算机上有64位NUnit,并尝试使用它测试32位程序集,则当NUnit尝试通过反射加载程序集时,它将因BadImagePlatformException而崩溃。在该命令行中,您没有指定目标平台。您需要这样指定:-platform:x86、-platform:x64或-platform:anycpu。我建议使用AnyCPU,除非您特别需要以x86 32位或x64 64位为目标。我添加了-platform:AnyCPU它没有区别,可能是因为它是未指定任何内容时的默认值。您是否知道是否有一个命令行选项以旧版本的.net为目标?GUI以某种方式管理它,但是命令行帮助没有提到任何类似的功能。非常感谢。我似乎一点也没有具体说明。然而,我认为可能不是这样,因为大约80%的单元测试仍然通过。不管是什么,整个过程都是在编译器的一次运行中编译的,所以不可能存在多个相互冲突的平台。另外,在重构之前,它工作得很好,我对构建系统没有做任何改动。很抱歉之前没有提到这一切。可能是F 3.0版本没有加载到Nunit中,因为存在一些这样的不匹配。有什么提示吗?这是我使用的命令行:“c:/ProgramFilesx86/Microsoft F/v4.0/Fsc.exe'-g-debug:full-tailcalls+-target:exe-warn:4-warnaserror:76-LCID:1033-utf8output-fullpath-flaterrors-out:-医生:-李白:-define:DEBUG-define:TRACE-reference:FSharp.PowerPack.Parallel.Seq.dll-reference:nunit.framework.dll-reference:FsCheck.dll-reference:System.Xml.dll-reference:System.Xml.Linq.dll跟踪了大量的.fs文件您仍然可能有一个冲突的目标平台,即使整个事情在编译器的一次运行中得到编译,例如。,集成到单个组件中。编译后的程序集和NUnit之间可能会发生冲突-如果您的计算机上有64位NUnit,并尝试使用它测试32位程序集,则当NUnit尝试通过反射加载程序集时,它将因BadImagePlatformException而崩溃。在该命令行中,您没有指定目标平台。您需要这样指定:-platform:x86、-platform:x64或-platform:anycpu。我建议使用AnyCPU,除非您特别需要以x86 32位或x64 64位为目标。我添加了-platform:AnyCPU它没有区别,可能是因为它是未指定任何内容时的默认值。您是否知道是否有一个命令行选项以旧版本的.net为目标?GUI以某种方式管理它,但是命令行帮助没有提到任何类似的功能。非常感谢。非常感谢你的回复。当我使用GUI时,确实有一个警告提示映射可能是问题所在。但是,测试在GUI中工作。尽管如此,我目前仍在研究如何解决这个问题。但是,buildcommand使用F2和F3干净地编译项目,没有任何警告。在缺少警告的情况下,映射是否仍然是一个问题?再次感谢。非常感谢您的回复。当我使用GUI时,确实有一个警告提示映射可能是问题所在。但是,测试在GUI中工作。尽管如此,我目前仍在研究如何解决这个问题。但是,buildcommand使用F2和F3干净地编译项目,没有任何警告。在缺少警告的情况下,映射是否仍然是一个问题?再次感谢。