Domanda

Recentemente ho scritto un personalizzato Debugger Visualizer per Visual Studio 2008 per uno dei tipi personalizzati nella mia applicazione. L'interfaccia utente per il Visualizer è scritto in WPF ed è ospitato in un host elemento e mostrato utilizzando l'oggetto IDialogVisualizerService windowService.

Tutto funziona alla grande, ed i miei carichi Visualizer e mostra le informazioni rilevanti, ma se cercare di "Modifica e continuazione" nella mia applicazione dopo aver caricato il visualizzatore, Visual Studio si blocca senza alcun messaggio di errore utile.

Nel tentativo di eseguire il debug di questo ho tolto quasi tutto il mio codice dalla soluzione al punto in cui mi è stato solo serializzazione una stringa con l'ObjectSource e la visualizzazione solo un host elemento vuoto ed ancora ottengo l'incidente su Modifica e continuazione. Se rimuovo l'host elemento e mostrare il controllo o la forma di un WinForms non v'è alcun incidente.

Ecco il codice Visualizer:

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");
            }
        }
    }
}

Tutte le idee?

È stato utile?

Soluzione

Anche se non ho davvero trovare una soluzione "corretta", ho trovato una soluzione accettabile.

Ho spostato il mio visualizzazione in un programma completamente separata, e poi nella mia debugger visualizer ho avviare il programma di visualizzazione in un processo separato e trasmetto l'oggetto di dati ad esso utilizzando una named pipe.

Questo funziona bene, e ha il vantaggio aggiunto che le finestre di visualizzazione persistono attraverso modifiche dei dati e le sessioni di debug.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top