VS2012/Blend 5:调试在设计视图中发生的异常(仅)

rik*_*kit 7 design-time blend microsoft-metro windows-8 visual-studio-2012

我正在使用C#和XAML开发Metro风格的应用程序(适用于Windows 8).我已将我的viewmodels设置为用作设计时datacontexts,如下所示:

xmlns:vm="using:hub.ViewModels"
d:DataContext="{d:DesignInstance IsDesignTimeCreatable=True, Type=vm:ViewModels
Run Code Online (Sandbox Code Playgroud)

我的应用程序在运行时似乎运行正常,但在VS 2012和Blend的设计视图中,我偶尔会得到这个(无用的)错误消息:

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

发生在设计视图-这意味着我不能设置周围的一切我INotifyPropertyChanged的()事件断点.

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

Jam*_*lis 20

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

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

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

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

  4. Debug菜单中,选择Exceptions ...并选中Common Language Runtime Exceptions旁边的Thrown复选框.这将实现所有CLR异常的第一次机会处理.如果您知道异常的特定类型,则可以为该类型启用第一次机会处理.

  5. 从" 调试"菜单中,选择" 附加到进程".在Attach to:字段中,单击Select ...并选中列表中的Managed(v4.5,v4.0)条目,然后单击OK.

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

  6. 在" 可用进程"列表框中,找到与项目对应的xdesproc.exe,然后单击" 附加".

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

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

  7. 做你需要做的任何事情来重现bug.当它发生时,调试器将在抛出异常的位置中断.调试器应加载程序集的符号.

  • 我同意詹姆斯的观点,并且有很好的演练.您还可以将Visual Studio附加到Blend的打开实例. (2认同)

小智 5

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

确保已将“启用/禁用项目代码”切换设置为“启用” ...在VS / Blend 2015中,它是XAML编辑器下方的小图标,如下 所示

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

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

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