Отладчик Visualizer, ElementHost, а также редактирование и продолжение проблем - PullRequest
0 голосов
/ 06 апреля 2010

Недавно я написал специальный визуализатор отладчика для Visual Studio 2008 для одного из пользовательских типов в моем приложении. Пользовательский интерфейс для визуализатора написан в WPF и размещен на хосте элемента и показан с использованием объекта windowService IDialogVisualizerService.

Все отлично работает, и мой визуализатор загружает и показывает соответствующую информацию, но если после загрузки визуализатора попытаться «отредактировать и продолжить» в моем приложении, Visual Studio вылетает без полезного сообщения об ошибке.

Пытаясь отладить это, я удалил почти весь мой код из решения до того момента, когда я только сериализировал строку с ObjectSource и отображал только пустой элемент host, и я все еще получаю сбой при редактировании и продолжаю. Если я удаляю элемент host и показываю элемент управления 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");
            }
        }
    }
}

Есть идеи?

1 Ответ

0 голосов
/ 09 апреля 2010

Хотя я не нашел «правильного» исправления, я нашел приемлемый обходной путь.

Я переместил свою визуализацию в совершенно отдельную программу, а затем в моем визуализаторе отладчика я запускаю программу визуализации в отдельном процессе и отправляю ей объект данных, используя именованный канал.

Это работает хорошо, и имеет дополнительное преимущество в том, что окна визуализации сохраняются при изменениях данных и сеансах отладки.

...