【问题标题】:VS2012/ Blend 5: Debugging an Exception (only) occurring in design viewVS2012/ Blend 5:调试设计视图中发生的异常(仅)
【发布时间】:2012-07-31 10:50:44
【问题描述】:

我正在使用 C# 和 XAML 开发 Metro 风格的应用程序(适用于 Windows 8)。我已将我的视图模型设置为用作设计时数据上下文,如下所示:

xmlns:vm="using:hub.ViewModels"
d:DataContext="{d:DesignInstance IsDesignTimeCreatable=True, Type=vm:ViewModels

我的应用在运行时似乎运行良好,但在 VS 2012 和 Blend 的设计视图中,我偶尔会收到以下(无用)错误消息:

An Exception was thrown. TargetException: Error in the application.
Stacktrace
at System.ComponentModel.PropertyChangedEventHandler.Invoke(Object sender, PropertyChangedEventArgs e)
InnerException: None

发生在设计视图中 - 这意味着我不能围绕我的所有 INotifyPropertyChanged() 事件设置断点。

调试设计时错误的最佳方法是什么?

【问题讨论】:

    标签: windows-8 microsoft-metro visual-studio-2012 blend design-time


    【解决方案1】:

    如果这种情况始终或半一致地发生,您可以将调试器附加到 XAML 设计器:

    1. 启动 Visual Studio;打开您的项目并打开一个 XAML 文件,从而加载 XAML 设计器

    2. 启动 Visual Studio 的第二个实例。打开您的项目,但确保没有打开任何 XAML 文档。

    3. 确保禁用“仅我的代码”:从工具菜单中,选择选项。选择调试类别。在常规页面中,确保未选中Enable Just My Code旁边的复选框。

    4. Debug 菜单中,选择 Exceptions... 并选中 Common Language 旁边的 Thrown 复选框运行时异常。这将启用对所有 CLR 异常的第一次机会处理。如果您知道异常的具体类型,则可以仅针对该类型启用首次机会处理。

    5. 调试菜单中,选择附加到进程。在 Attach to: 字段中,单击 Select... 并检查列表中的 Managed (v4.5, v4.0) 条目并点击确定

      这是必要的,因为如果在进程执行本机代码时附加,调试器可能会将进程误检测为本机进程。如果您的项目包含本机代码,您还需要选中列表中的 Native 复选框(您可以同时调试托管代码和本机代码)。

    6. Available Processes列表框中,找到与您的项目对应的xdesproc.exe,然后点击Attach

      如果有多个进程(通常是因为您打开了多个项目,或者因为设计器正在重新加载或最近重新加载),则可能很难确定哪个设计器进程属于哪个 Visual Studio 实例。连接到所有这些通常是最简单的。 Process Explorer 之类的工具可以帮助您确定哪个设计器进程属于哪个 Visual Studio 实例。

      注意:不要将调试器附加到属于您用于调试的同一 Visual Studio 实例的设计器进程 (xdesproc):这样做可能会导致 Visual Studio 挂起。您必须始终使用两个不同的 Visual Studio 实例。

    7. 做任何你需要做的事情来重现错误。当它发生时,调试器将在抛出异常的地方中断。调试器应该为您的程序集加载符号。

    【讨论】:

    • 我同意 James 的观点,而且演练很棒。您还可以将 Visual Studio 附加到 Blend 的打开实例。
    • 感谢您的指示 - 它显示异常是 FileNotFoundException(无法加载文件或程序集 '_ExpressionDynamicAssembly_aeacad22-4ac3-4f3b-a146-564d51a81c8a,版本 = 0.0.0.0,文化 = 中性,PublicKeyToken =null' 或其依赖项之一。系统找不到指定的文件。)。我将假设这是设计视图的错误 - 并查看它是否已在 VS 的最终版本中修复!
    • @rikkit:太好了,我很高兴能帮上忙。如果您仍然能够重现 Visual Studio 2012 RTM 中的错误,请在 Microsoft Connect 上打开错误。
    • 更新:我将工具更新为 RTM。我仍然遇到同样的错误,但幸运的是,RTM 设计视图现在显示了完整的堆栈跟踪——所以它毕竟是我的代码。对于其他有类似问题的人,请检查您是否试图在设计视图中抛出登录 UI 或消息框,因为它不会发生。 :)
    【解决方案2】:

    我在寻找有关如何调试设计器时间实例问题的信息时来到这里,尽管我没有遇到与 rikkit 相同的问题。但是...我正在分享相关问题的解决方案,以防其他人也遇到同样的问题:

    确保您将“启用/禁用项目代码”切换设置为“启用”...在 VS/Blend 2015 中,它是 XAML 编辑器下方的一个小图标 as shown here.

    如果它被禁用,这可能是您的设计时实例似乎无法正常工作的原因。

    此外,如果它被禁用并且您尝试使用第二个 VS 实例进行调试,那么当您附加到 XDesProc 时,您在代码隐藏中设置的任何断点都会报告它们“当前不会被命中。[因为]否已为此文档加载符号”。 您可能认为您需要以某种方式加载符号,但如果您打开“模块”窗口尝试这样做,您甚至不会在列表中看到您的模块。

    由于此设置被禁用,我在这个问题上浪费了几个小时。希望这可以帮助其他人不这样做。

    【讨论】:

      【解决方案3】:

      我不确定,但我相信您可以检查 IsInDesignModeProperty 字段。我记得有时必须在 WinForms 上这样做。

      也可以看看这个链接Troubleshooting WPF Designer Load Failures

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多