如何在Silverlight中调试XAML解析错误?

9
我经常遇到以下问题:我更改XAML或其使用的某些资源,然后在调试模式下加载Silverlight项目时,它只停留在旋转的Silverlight加载动画上。
我尝试将VS08调试器附加到进程,但此时不会发生任何事情(在进入Silverlight之前可以正常工作,但是没有效果)。
根据以往的经验,我注意到当XAML或其中的资源存在问题时会出现这种情况,但迄今为止我的唯一解决方法是逐行分解代码,直到我找到问题为止。
有没有一种简单的方法来调试/诊断这些情况?
更新: 我在这个问题中找到了一些帮助,但它仍然没有提供一种良好的方法来调试这些类型的问题。
4个回答

5
这真是一个痛苦的调试过程,但我终于在我们自定义控件的构造函数中发现了问题的根源(它正在寻找一个不存在的资源)。真正的问题不是修复问题而是找到它。
我发现IE会响应从Silverlight传递到DOM的异常,但在Chrome浏览器中(我使用的浏览器)您不会得到同样类型的反馈。一个实际上非常有用的解决方案(甚至比IE提示更有效)是将App.xaml.cs中的ReportErrorToDOM()方法修改为以下内容:
private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
{
    string errorMsg = String.Empty;
    try
    {
        errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
        errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");

        System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
    }
    catch (Exception)
    {
#if DEBUG
        MessageBox.Show(errorMsg);
#endif
    }
}

这将为您提供XAML中问题开始的位置。虽然不是理想的调试器,但它确实有所帮助。

3
这不是终极答案,但通常可以帮助解决问题

在Visual Studio中:

  • 点击调试(Debug) > 异常(Exceptions)
  • 点击“查找(Find)”并搜索XAML
  • 点击System.Windows.Markup.XamlParseException旁边的“抛出(Thrown)”按钮

以调试模式启动项目。任何Xaml异常将立即显示。有时需要检查内部异常以获取更多信息。

在我最终弄清楚这个问题之前,我浪费了很多时间!


1

这可能不适用于所有情况,但XAML错误的一个常见来源是由于您使用作为资源的转换器中未捕获的异常。人们经常忘记在其转换器中使用try-catch块,当其中某些内容出现问题时,您最终必须逐行分析代码。

此外,需要注意的是,根据情况,您可以将一些XAML复制并粘贴到WPF项目中以获取更好的错误消息。我自己从未依赖过这种策略,但最近从一位比我聪明得多的经验丰富的WPF/SL开发人员那里听说了这个方法,所以值得一试。 :-)


0
根据微软的说法:现阶段终端用户无法调试XAML解析器,只有微软才能够这样做。Silverlight 4 XAML解析器的新版本已经完全使用托管代码重新编写,希望他们会给我们提供更好的调试方式。我知道这一点是因为我刚刚遇到了一个问题并打开了支持案例,由Silverlight开发人员告诉我的。

我所能接近的观察解析器的方法就是使用Silverlight Spy:

http://firstfloorsoftware.com/silverlightspy/download-silverlight-spy/

好工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接