Итак, я делаю первые шаги на С# (и .NET/Visual Studio в целом) и начал писать простую головоломку с черепицей в качестве переносной библиотеки и писать пользовательский интерфейс для разных целевых платформ. Я начал с пользовательского интерфейса консоли и перешел в приложение WPF. Затем я попробовал "Windows Store", и по большей части я мог скопировать код 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
(Edit: это в файле с именем App.g.i.cs
)
И тогда я должен внимательно посмотреть на результат, чтобы найти
WinRT information: Cannot resolve TargetProperty (Canvas.MispelledProperty) on specified object.
Теперь в некоторых случаях этого может быть достаточно, но мне действительно трудно поверить, что это все, что вы можете получить. У меня возникла некоторая проблема, связанная с нюансами в том, как Storyboar работает довольно легко отсортирован (завершенные события прикреплены непосредственно к анимации, где не запускается, как в 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
так же, как в "Non Store Apps". Теперь эти директивы препроцессора компилятора делают его похожим на то, что я мог просто отключить его (#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
), но googleing он не показал мне никакого способа сделать это.