在win8 Metro应用程序中不会触发Debug.Assert(false)

时间:2012-05-10 05:44:57

标签: .net debugging windows-8 windows-runtime assert

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

是否在Visual Studio(11 Beta)中未正确设置?或Debug.Assert旨在在metro应用程序中禁用?

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

3 个答案:

答案 0 :(得分:6)

好像是一个错误。我会推出自己的断言方法。类似的东西:

[Conditional("DEBUG")]
public static void Assert(bool condition)
{
    if (!condition)
        System.Diagnostics.Debugger.Break();
}

答案 1 :(得分:2)

触发,查看“输出”窗口。它不会自动提示您询问是否需要调试器中断,因此只是保持驾驶。

DefaultTraceListener.AssertUIEnabled属性为false。这是一个实现问题,无法在Metro UI上显示消息框。哪个确实可以工作,但显示器切换到桌面,非常不受欢迎,当你想要点击否。难以解决,毫无疑问在待办事项列表。您无法轻松访问该属性以将其设置为true,因此无法从元数据中访问该属性。 Filip的解决方法听起来不太合适。

答案 2 :(得分:0)

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

我遵循菲利普的建议,写了一个简短的实用工具,如下:

namespace MyProj.Infrastructure

module Diagnostics =

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

我选择Debugger.Break而不是引发异常,因为它会在断言失败的位置停止调试器。但是,提出异常是一种可接受的替代方案。

我的解决方案中没有任何合适的全局项目或模块,因此我必须为此创建它们,这非常烦人。