我注意到Debug.Assert不会在Metro应用程序中触发,但是,如果项目是传统的,如Console或WinForm,它会触发。是的,我处于调试模式。
是否在Visual Studio(11 Beta)中未正确设置?或Debug.Assert旨在在metro应用程序中禁用?
我知道在执行Metro应用程序期间会吞下许多异常,但Debug.Assert非常方便,我无法想到它应该被禁用的原因。
答案 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
而不是引发异常,因为它会在断言失败的位置停止调试器。但是,提出异常是一种可接受的替代方案。
我的解决方案中没有任何合适的全局项目或模块,因此我必须为此创建它们,这非常烦人。