2012-05-10 35 views
9

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

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

我知道Metro应用程序执行过程中吞噬了很多异常,但Debug.Assert非常方便,我无法想象它应该被禁用的原因。

回答

2

触发,看在输出窗口。它只是不会自动提示您询问是否需要调试程序中断并因此保持开机状态。

DefaultTraceListener.AssertUIEnabled属性为false。这是一个实现问题,无法在Metro UI上显示消息框。哪个确实有效,但是显示器切换到桌面,当你想单击No时很难解决,毫无疑问,在待办事项列表中。您无法轻易到达媒体资源以将其设置为true,但无法从元数据访问该媒体资源。菲利普的解决方法听起来不错。

+0

也许这篇文章是在当前版本的metro之前完成的,但是DefaultTraceListener似乎不再适用于Metro应用程序。 – James

+0

@詹姆斯 - 这就是“元数据无法访问”的意思。不,它在VS2010 RC中完全相同。这很容易为你自己尝试,请在你做出回答之前这样做。 –

+0

我尝试过,并且DefaultTraceListener.AssertUIEnabled不能在代码中设置,因为它不存在。 – James

6

看起来像一个错误。我会推出我自己的断言方法。喜欢的东西:

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

适用于我:) – kennyzx

0

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

我跟着菲利普的建议,并写了一个简短实用,如下所示:

namespace MyProj.Infrastructure 

module Diagnostics = 

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

我选择了Debugger.Break因为它停止调试器在断言失败的地方产生一个例外。但是,提出例外是可以接受的选择。

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

相关问题