发布版本上的NUnit:“公共语言运行时检测到一个无效的程序。”

6
我将我们的软件从vs2008/.net 3.5升级到vs2010/.net 4.0。所有第三方库(最相关的是nhibernate 2.1.2或3.0.0,nunit 2.5.2)仍然使用vs2008编译。当我运行调试构建的单元测试时,一切正常。在发布版本中,nunit报告228个测试中有33个异常:System.InvalidProgramException:Common Language Runtime检测到无效程序。它总是发生在相同的测试中,对于nunit-console和Resharper 5.0测试运行器都是如此。当我使用Resharper“debug unit-tests”命令运行它们时,所有测试都通过。无论我是单独运行测试还是批量运行,都没有区别。异常总是发生在nhibernate查询调用附近,但由于发布版本堆栈跟踪有些稀疏,所以我不能确定。它不取决于nhibernate字节码生成器,对于castle和linfu也是如此。是否有人有想法如何调试这个问题?
编辑:删除Spring.NET对此问题没有影响。
编辑:当我将发布配置调试输出从pdb only更改为full并取消optimize code复选框时,异常消失了。这两个设置都是必需的,如果我只更改其中一个,错误仍然存在。然而,如果我只更改一个设置,将会有不同的测试失败。所有类库都是编译为Any CPU

你能否检查一下这个项目的发布版本和调试版本是否不同?我见过有些情况,有人只是在调试配置中添加了X,导致发布配置过时。 - Gishu
@Gishu:我能够追踪到调试输出和优化代码设置的差异 - 没有其他设置似乎会影响这个问题。 - Malte Clasen
嗯...这里没有明确的方向。从一些粗略的搜索来看,似乎与第三方dll调用有关。http://bit.ly/g3iwnK 尝试获取堆栈跟踪并发布到正确的MS论坛-似乎是一个小众领域(不完全是SO的强项)。 - Gishu
3个回答

0
这可能是一个愚蠢的问题:你确定所有程序集都编译成相同的架构(x86/x64)吗?我曾经遇到过这种情况。

所有程序集都编译为“Any CPU”时,它是否能正常工作,还是我必须明确指定目标? - Malte Clasen
任何CPU都可以使用。JIT编译器将在执行时将内容编译为正确的架构。 - user47589

0

当我选择“.NET Framework 4.0客户端配置文件”时,我遇到了类似的问题。尝试将目标框架更改为“.NET Framework 4.0”


0

我的应用程序在调试模式下运行良好,但在发布配置中却因为同样的异常而崩溃。原因是我有一个带有条件“DEBUG”属性的方法,它返回了一个值...

当然,在发布配置中,所有带有条件“DEBUG”属性的方法都会被更改为没有返回值的存根。因此,IDE 可能会认为您的类型通过了代码分析并且没有警告,但编译后的应用程序存在返回类型不匹配的问题!

只是想为那些在这个问题上一头撞墙的人添加这个信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接