9

我注意到 Debug.Assert 不会在 Metro 应用程序中触发,但是,如果项目是控制台或 WinForm 等传统项目,它会触发。是的,我处于调试模式。

是否在 Visual Studio (11 Beta) 中设置不正确?或者 Debug.Assert 打算在 Metro 应用程序中禁用?

我知道在执行 Metro 应用程序期间会吞下许多异常,但 Debug.Assert 非常方便,以至于我想不出应该禁用它的原因。

4

3 回答 3

6

似乎是一个错误。我会推出自己的断言方法。就像是:

[Conditional("DEBUG")]
public static void Assert(bool condition)
{
    if (!condition)
        System.Diagnostics.Debugger.Break();
}
于 2012-05-10T16:08:38.230 回答
2

确实会触发,请查看“输出”窗口。它只是不会自动提示您询问是否需要调试器中断,因此只会继续运行。

DefaultTraceListener.AssertUIEnabled 属性为 false。这是一个实现问题,无法在 Metro UI 上显示消息框。这确实有效,但显示器切换到桌面,当您希望单击“否”时,这是非常不可取的。难以解决,毫无疑问在待办事项列表上。您无法轻松地访问该属性以将其设置为 true,它无法从元数据中访问。Filip 的解决方法听起来还不错。

于 2012-05-11T01:14:45.967 回答
0

在 VS2013 中,WinRT 中的 F# 也存在同样的问题。该assert语句是 的别名System.Diagnostics.Debug.Assert,不会引发异常,因此除非您正在查看“输出”窗口,否则您的断言可能会失败而不会被注意到。即使你在看,也很难找到提出断言的地方。

我按照 Filip 的建议编写了一个简短的实用程序,如下所示:

namespace MyProj.Infrastructure

module Diagnostics =

    let Assert condition = if not condition then
                                System.Diagnostics.Debugger.Break()

我选择Debugger.Break了引发异常,因为它会在断言失败的地方停止调试器。但是,引发异常是一种可接受的替代方法。

我的解决方案中没有任何合适的全局项目或模块,所以我不得不为此创建它们,这很烦人。

于 2014-06-05T03:54:42.190 回答