代码之家  ›  专栏  ›  技术社区  ›  Nick Gotch

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

  •  9
  • Nick Gotch  · 技术社区  · 15 年前

    我曾尝试将VS08调试器附加到进程,但此时它什么也不做(在Silverlight中工作正常,但以前没有)

    根据以前的经验,我注意到当XAML或其中的资源出现问题时会发生这种情况,但到目前为止,我唯一的解决方案是逐行剖析代码,直到发现问题为止。

    有没有一种简单的方法来调试/诊断这些情况?

    我发现 this question

    4 回复  |  直到 8 年前
        1
  •  5
  •   Nick Gotch    15 年前

    这是一个真正的痛苦调试,但我终于发现问题隐藏在我们的自定义控件(这是寻找一个资源不在那里)的构造器深。真正的问题不是解决问题,而是找到它。

    我发现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中为您提供问题开始的位置。它不是一个理想的调试器,但确实有帮助。

        2
  •  3
  •   Simon_Weaver    15 年前

    在Visual Studio中:

    • 单击“调试”>例外情况
    • XAML
    • 单击System.Windows.Markup.XamlParseException旁边的“抛出”按钮

    我浪费了太多时间才弄明白这个!

        3
  •  1
  •   Ash    15 年前

    当然,这是有道理的,但是根据具体情况,您可以将一些XAML复制并粘贴到WPF项目中,并获得更好的错误消息。我自己从来没有使用过这种策略,但最近我从一位经验丰富的WPF/SL开发人员那里听说过,他比我聪明得多,所以值得一试

        4
  •  0
  •   James Campbell    15 年前

    Per-microsoft:此时最终用户无法调试XAML解析器,只有MS可以这样做。silverlight4xaml解析器的新版本已经完全使用托管代码重新编写,希望它们能为我们提供更好的调试方法。我知道这一点,因为我刚刚有一个问题,并打开了一个支持案例,并通知这由Silverlight开发人员。

    我所能看到的最棒的解析器是使用Silverlight Spy:

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

    推荐文章