Schnellansichtarchitektur
Die Architektur einer Debuggerschnellansicht besteht aus zwei Teilen:
Die Debuggerseite wird innerhalb des Visual Studio-Debuggers ausgeführt. Im debuggerseitigen Code wird die Benutzeroberfläche für die Schnellansicht erstellt und angezeigt.
Die zu debuggende Seite wird innerhalb des Prozesses ausgeführt, den Visual Studio debuggt (die zu debuggende Komponente).
Eine Schnellansicht ist eine Debuggerkomponente, mit der der Debugger die Inhalte eines Datenobjekts in aussagekräftiger, verständlicher Form anzeigen (visualisieren) kann. Einige Schnellansichten unterstützen auch die Bearbeitung des Datenobjekts. Sie können den Debugger erweitern, um eigene benutzerdefinierte Datentypen zu behandeln, indem Sie benutzerdefinierte Schnellansichten schreiben.
Das Datenobjekt, das visualisiert werden soll, befindet sich innerhalb des Prozesses, den Sie debuggen (der zu debuggende Prozess). Die Benutzeroberfläche, die die Daten anzeigt, wird innerhalb des Visual Studio-Debuggerprozesses erstellt:
Debuggerprozess | Zu debuggender Prozess |
---|---|
Debuggerbenutzeroberfläche (DataTips, Überwachenfenster, Schnellüberwachung) | Zu visualisierendes Datenobjekt |
Um das Datenobjekt innerhalb der Debuggerschnittstelle zu visualisieren, benötigen Sie Code zur Kommunikation zwischen den beiden Prozessen. Infolgedessen besteht die Schnellansichtarchitektur aus zwei Teilen: aus debuggerseitigem Code und aus Code der zu debuggenden Seite.
Der debuggerseitige Code erstellt eine eigene Benutzeroberfläche, die von der Debuggerschnittstelle aufgerufen werden kann, zum Beispiel DataTip, das Überwachungsfenster oder die Schnellüberwachung. Die Schnellansichtschnittstelle wird mithilfe der DialogDebuggerVisualizer-Klasse und der IDialogVisualizerService-Schnittstelle erstellt. Wie alle Schnellansicht-APIs befinden sich DialogDebuggerVisualizer und IDialogVisualizerService im Microsoft.VisualStudio.DebuggerVisualizers-Namespace.
Debuggerseite | Zu debuggende Seite |
---|---|
DialogDebuggerVisualizer-Klasse IDialogVisualizerService-Schnittstelle |
Datenobjekt |
Die Benutzeroberfläche ruft die zu visualisierenden Daten von einem Objektanbieter auf Debuggerseite ab.
Debuggerseite | Zu debuggende Seite |
---|---|
DialogDebuggerVisualizer-Klasse IDialogVisualizerService-Schnittstelle |
Datenobjekt |
Objektanbieter (implementiert IVisualizerObjectProvider) |
Auf der zu debuggenden Seite ist ein entsprechendes Objekt vorhanden, das als Objektquelle bezeichnet wird:
Debuggerseite | Zu debuggende Seite |
---|---|
DialogDebuggerVisualizer-Klasse IDialogVisualizerService-Schnittstelle |
Datenobjekt |
Objektanbieter (implementiert IVisualizerObjectProvider) | Objektquelle (abgeleitet von VisualizerObjectSource) |
Der Objektanbieter stellt der Schnellansicht-Benutzeroberfläche die zu visualisierenden Objektdaten bereit. Der Objektanbieter ruft die Objektdaten von der Objektquelle ab. Der Objektanbieter und die Objektquelle stellen APIs bereit, um Objektdaten zwischen der Debuggerseite und der zu debuggenden Seite zu übertragen.
Jede Schnellansicht muss das zu visualisierende Datenobjekt abrufen. Die folgende Tabelle zeigt die entsprechenden APIs, die der Objektanbieter und die Objektquelle zu diesem Zweck verwenden:
Objektanbieter | Objektquelle |
---|---|
GetData – oder – GetObject |
GetData |
Beachten Sie, dass der Objektanbieter GetData oder GetObject verwenden kann. Jede API führt zu einem Anruf von GetData in der Objektquelle. Durch einen Aufruf von Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData wird ein System.IO.Stream eingefügt, der eine serialisierte Form des visualisierten Objekts darstellt.
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject deserialisiert die Daten wieder in ein Objekt, das Sie anschließend auf der Benutzeroberfläche anzeigen können, die Sie mit DialogDebuggerVisualizer erstellen. Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData füllt mit Daten als unformatiertem Stream
auf, den Sie selbst deserialisieren müssen. Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject ruft Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData auf, um den serialisierten Stream
abzurufen und deserialisiert dann die Daten. Verwenden Sie Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData, wenn das Objekt von .NET nicht serialisiert werden kann und benutzerdefiniert serialisiert werden muss. In diesem Fall müssen Sie auch die Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.Serialize-Methode überschreiben.
Wenn Sie eine schreibgeschützte Schnellansicht erstellen, genügt eine unidirektionale Kommunikation mit GetData oder GetObject. Wenn Sie eine Schnellansicht erstellen, die die Bearbeitung von Datenobjekten unterstützt, müssen Sie weitere Schritte durchführen. Sie müssen ein Datenobjekt auch vom Objektanbieter zurück zur Objektquelle senden können. Die folgende Tabelle zeigt den Objektanbieter und die Objektquellen-APIs, die für diesen Zweck verwendet werden:
Objektanbieter | Objektquelle |
---|---|
ReplaceData – oder – ReplaceObject |
CreateReplacementObject |
Beachten Sie wieder, dass es zwei APIs gibt, die der Objektanbieter verwenden kann. Daten werden vom Objektanbieter zur Objektquelle immer als Stream
gesendet, aber durch ReplaceData müssen Sie das Objekt selbst in einen Stream
serialisieren.
ReplaceObject akzeptiert ein von Ihnen bereitgestelltes Objekt, serialisiert es in einen Stream
und ruft dann ReplaceData auf, um den Stream
an CreateReplacementObject zu senden.
Durch Verwendung einer der Methoden zum Ersetzen wird in der zu debuggenden Komponente ein neues Datenobjekt erstellt, das das visualisierte Objekt ersetzt. Wenn Sie den Inhalt des ursprünglichen Objekts ändern möchten, ohne es zu ersetzen, verwenden Sie eine der Übertragungsmethoden aus der folgenden Tabelle. Diese APIs übertragen Daten gleichzeitig in beide Richtungen, ohne das Objekt zu ersetzen, das visualisiert wird:
Objektanbieter | Objektquelle |
---|---|
TransferData – oder – TransferObject |
TransferData |