我正在学习C#(以及.NET/Visual Studio),首先编写了一个简单的可移植库来完成拼图游戏,并为不同的目标平台编写UI。我从控制台UI开始,然后转向WPF应用程序。接着我尝试使用“Windows商店”,大部分代码都可以复制WPF代码,只需更改一些命名空间和方法签名。
但是某些事情的行为会有所不同,并且我在搜索了一个多小时之后才得到任何有关崩溃的信息。例如,如果我在传统的WPF应用程序中做出以下操作:
Storyboard.SetTargetProperty(animation,
new PropertyPath("{Canvas.MispelledProperty}"));
我在.NET异常发生的确切位置遇到了问题。如果我在Windows Store应用程序中犯同样的错误,我只能看到这个。
#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
UnhandledException += (sender, e) =>
{
if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
};
#endif
(编辑:这是在名为
App.g.i.cs
的文件中。)然后我必须仔细查看输出以找出
WinRT information: Cannot resolve TargetProperty (Canvas.MispelledProperty) on specified object.
在某些情况下这可能已经足够了,但我真的很难相信这就是你能得到的全部。我之前解决了一些与Storyboard工作方式中微妙差别相关的问题(例如直接附加到动画的完成事件没有像WPF中那样触发),但现在我完全不知道这个错误的原因:
A first chance exception of type 'System.ArgumentOutOfRangeException' occurred
这可能只是因为过度点击导致的,也会导致整个应用程序崩溃。
现在我的应用程序非常简单,这可能与我如何处理PointerPressed
和PointerReleased
事件有关,但是没有更好的起点真的令人沮丧。
所以,我想实际问题是:它确实应该像这样吗?还是我可以配置调试器以给我更多有用的信息?如果不行,那么:当开发Windows Store应用程序时,你们使用什么样的调试技术或解决方法?
更新:
起初,我认为这只会发生在WinRT相关的异常之外,在CLR之外发生了异常,并且没有被正确包装,但事实证明,所有未处理的异常都会带您到App.g.i.cs
而不是它们发生的地方。例如,我故意尝试在方法中访问一个列表超出其范围,以查看当引发异常时Visual Studio是否会将我带到那里,但是它又把我带回了App.g.i.cs
。在本地变量中,我得到了这个Windows.UI.Xaml.UnhandledExceptionEventArgs
,消息字符串中有一些类似堆栈跟踪的信息,但没有行号。以下是我的有意制造的错误示例:
System.ArgumentOutOfRangeException
at System.ThrowHelper.ThrowArgumentOutOfRangeException()
at System.Collections.Generic.List`1.get_Item(Int32 index)
at StorePuzzle.PuzzleRenderer.HandleTileReleased(Object sender, PointerRoutedEventArgs e)
我希望Visual Studio可以立即将我带到引发异常的地方,而不是像“非商店应用”一样带我到
App.g.i.cs
。 现在,编译器预处理指令看起来像是我可以关闭它(#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
), 但是我查阅了谷歌,没有找到任何方法可以这样做。