我注意到 Debug.Assert 不会在 Metro 应用程序中触发,但是,如果项目是控制台或 WinForm 等传统项目,它会触发。是的,我处于调试模式。
是否在 Visual Studio (11 Beta) 中设置不正确?或者 Debug.Assert 打算在 Metro 应用程序中禁用?
我知道在执行 Metro 应用程序期间会吞下许多异常,但 Debug.Assert 非常方便,以至于我想不出应该禁用它的原因。
我注意到 Debug.Assert 不会在 Metro 应用程序中触发,但是,如果项目是控制台或 WinForm 等传统项目,它会触发。是的,我处于调试模式。
是否在 Visual Studio (11 Beta) 中设置不正确?或者 Debug.Assert 打算在 Metro 应用程序中禁用?
我知道在执行 Metro 应用程序期间会吞下许多异常,但 Debug.Assert 非常方便,以至于我想不出应该禁用它的原因。
似乎是一个错误。我会推出自己的断言方法。就像是:
[Conditional("DEBUG")]
public static void Assert(bool condition)
{
if (!condition)
System.Diagnostics.Debugger.Break();
}
它确实会触发,请查看“输出”窗口。它只是不会自动提示您询问是否需要调试器中断,因此只会继续运行。
DefaultTraceListener.AssertUIEnabled 属性为 false。这是一个实现问题,无法在 Metro UI 上显示消息框。这确实有效,但显示器切换到桌面,当您希望单击“否”时,这是非常不可取的。难以解决,毫无疑问在待办事项列表上。您无法轻松地访问该属性以将其设置为 true,它无法从元数据中访问。Filip 的解决方法听起来还不错。
在 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
了引发异常,因为它会在断言失败的地方停止调试器。但是,引发异常是一种可接受的替代方法。
我的解决方案中没有任何合适的全局项目或模块,所以我不得不为此创建它们,这很烦人。