【问题标题】:Debugger Visualizer, ElementHost, and Edit and Continue problemsDebugger Visualizer、ElementHost 和 Edit and Continue 问题
【发布时间】:2010-04-06 12:37:13
【问题描述】:

我最近为我的应用程序中的一种自定义类型编写了一个用于 Visual Studio 2008 的自定义调试器可视化工具。可视化工具的 UI 是用 WPF 编写的,托管在元素宿主中,并使用 IDialogVisualizerService windowService 对象显示。

一切正常,我的可视化工具会加载并显示相关信息,但如果在加载可视化工具后尝试在我的应用程序中“编辑并继续”,Visual Studio 会崩溃且没有有用的错误消息。

在尝试对此进行调试时,我从解决方案中删除了几乎所有代码,直到我仅使用 ObjectSource 序列化一个字符串并仅显示一个空元素主机,我仍然在编辑和继续时遇到崩溃。如果我删除元素宿主并显示 WinForms 控件或表单,则不会发生崩溃。

这是可视化工具代码:

using System;
using System.Drawing;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Windows.Forms;
using System.Windows.Forms.Integration;
using Microsoft.VisualStudio.DebuggerVisualizers;
using ObjectVisualizerShared;
using ObjectVisualizerUI;

namespace ObjectVisualizer
{
    public class Visualizer : DialogDebuggerVisualizer
    {
        protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            try
            {

                Stream stream = objectProvider.GetData();
                if (stream.Length > 0)
                {
                    BinaryFormatter formatter = new BinaryFormatter();
                    VisualizerNode node = (VisualizerNode)formatter.Deserialize(stream);
                    if (node != null)
                    {
                        VisualizerWindow window = new VisualizerWindow(node);
                        ElementHost host = new ElementHost();
                        host.Child = window;
                        host.Dock = DockStyle.Fill;
                        host.Size = new Size(800, 600);
                        windowService.ShowDialog(host);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("Error!\n{0}", ex), "Object Visualizer");
            }
        }
    }
}

有什么想法吗?

【问题讨论】:

    标签: c# visual-studio debuggervisualizer elementhost


    【解决方案1】:

    虽然我并没有真正找到“正确”的解决方法,但我找到了一个可以接受的解决方法。

    我将我的可视化移动到一个完全独立的程序中,然后在我的调试器可视化器中,我在一个单独的进程中启动可视化程序,并使用命名管道将数据对象发送给它。

    这运行良好,并且具有额外的优势,即可视化窗口在数据更改和调试会话中持续存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 2022-12-02
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多