Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Architektur eines Debugger-Visualisierers besteht aus zwei Teilen:
Die Debuggerseite wird im Visual Studio-Debugger ausgeführt. Der debuggerseitige Code erstellt und zeigt die Benutzeroberfläche für eure Visualisierung an.
Die Debug-Seite wird innerhalb des Prozesses, den Visual Studio debuggt (dem Debuggee), ausgeführt.
Eine Visualisierung ist eine Debuggerkomponente, mit der der Debugger den Inhalt eines Datenobjekts in einer aussagekräftigen, verständlichen Form anzeigen (visualisieren) kann. Einige Visualisierungen unterstützen auch die Bearbeitung des Datenobjekts. Durch das Schreiben von benutzerdefinierten Visualisierungen können Sie den Debugger erweitern, um Ihre eigenen benutzerdefinierten Datentypen zu verarbeiten.
Das zu visualisierende Datenobjekt befindet sich innerhalb des Prozesses, den Sie debuggen (der Debugprozess ). Die Benutzeroberfläche, auf der die Daten angezeigt werden, wird im Visual Studio-Debuggerprozess erstellt:
| Debuggerprozess | Debuggee-Prozess |
|---|---|
| Debugger-Benutzeroberfläche (DataTips, Watch Window, QuickWatch) | Zu visualisierende Datenobjekt |
Zum Visualisieren des Datenobjekts innerhalb der Debuggerschnittstelle benötigen Sie Code für die Kommunikation zwischen den beiden Prozessen. Folglich besteht die Visualizerarchitektur aus zwei Teilen: Debuggerseitiger Code und Debugcode .
Der debuggerseitige Code erstellt eine eigene Benutzeroberfläche, die über die Debuggerschnittstelle aufgerufen werden kann, z. B. eine Dateninfo, das Überwachungsfenster oder QuickWatch. Die Visualisierungsschnittstelle wird mithilfe der DialogDebuggerVisualizer Klasse und der IDialogVisualizerService Schnittstelle erstellt. Wie alle Visualizer-APIs befinden sich DialogDebuggerVisualizer und IDialogVisualizerService im Microsoft.VisualStudio.DebuggerVisualizers Namespace.
| Debuggerseite | Debugger-Seite |
|---|---|
| DialogDebuggerVisualizer-Klasse IDialogVisualizerService-Schnittstelle |
Datenobjekt |
Die Benutzeroberfläche erhält die zu visualisierenden Daten von einem Objektanbieter, der auf der Debuggerseite existiert.
| Debuggerseite | Debuggee-Seite der Anwendung |
|---|---|
| DialogDebuggerVisualizer-Klasse IDialogVisualizerService-Schnittstelle |
Datenobjekt |
| Objektanbieter (implementiert IVisualizerObjectProvider) |
Es gibt ein entsprechendes Objekt auf der Debuggee-Seite, das als Objektquelle bezeichnet wird:
| Debuggerseite | Debugseite |
|---|---|
| DialogDebuggerVisualizer-Klasse IDialogVisualizerService-Schnittstelle |
Datenobjekt |
| Objektanbieter (implementiert IVisualizerObjectProvider) | Objektquelle (abgeleitet von VisualizerObjectSource) |
Der Objektanbieter stellt die Objektdaten bereit, die in der Visualisierungs-UI visualisiert werden sollen. Der Objektanbieter ruft die Objektdaten aus der Objektquelle ab. Der Objektanbieter und die Objektquelle stellen APIs bereit, um Objektdaten zwischen der Debuggerseite und der Debugseite zu kommunizieren.
Jede Visualisierung muss das Datenobjekt abrufen, um visualisiert zu werden. In der folgenden Tabelle sind die entsprechenden APIs aufgeführt, die der Objektanbieter und die Objektquelle zu diesem Zweck verwenden:
| Objektanbieter | Objektquelle |
|---|---|
| GetData – oder – GetObject |
GetData |
Beachten Sie, dass der Objektanbieter entweder GetData oder GetObject verwenden kann. Entweder API führt zu einem Aufruf von GetData auf die Objektquelle. Ein Aufruf von Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData füllt ein System.IO.Stream aus, das die serialisierte Form des Objekts darstellt, das visualisiert wird.
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject deserialisiert die Daten wieder in Objektform, die Sie dann in der mit DialogDebuggerVisualizer erstellten Benutzeroberfläche anzeigen können.
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData füllt die Daten als Raw Stream aus, die Sie selbst deserialisieren müssen.
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject funktioniert, indem Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData aufgerufen wird, um die serialisierten Stream zu erhalten und dann die Daten zu deserialisieren. Verwenden Sie Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData, wenn das Objekt nicht von .NET serialisiert werden kann und eine benutzerdefinierte Serialisierung erforderlich ist. In diesem Fall müssen Sie auch die Methode Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.Serialize überschreiben.
Wenn Sie eine schreibgeschützte Visualisierung erstellen, reicht eine unidirektionale Kommunikation mit GetData oder GetObject aus. Wenn Sie eine Visualisierung erstellen, die das Bearbeiten von Datenobjekten unterstützt, müssen Sie mehr tun. Sie müssen auch in der Lage sein, ein Datenobjekt vom Objektanbieter zurück an die Objektquelle zu senden. In der folgenden Tabelle sind die Objektanbieter- und Objektquell-APIs aufgeführt, die für diesen Zweck verwendet werden:
| Objektanbieter | Objektquelle |
|---|---|
| ReplaceData – oder – ReplaceObject |
CreateReplacementObject |
Beachten Sie erneut, dass es zwei APIs gibt, die der Objektanbieter verwenden kann. Daten werden immer vom Objektanbieter an das Objekt als Stream gesendet, aber ReplaceData erfordert, dass Sie das Objekt selbst in ein Stream serialisieren.
ReplaceObject verwendet ein von Ihnen bereitgestelltes Objekt, serialisiert es in ein Stream, und ruft dann ReplaceData auf, um das Stream zum CreateReplacementObject zu senden.
Die Verwendung einer der Replace-Methoden erstellt ein neues Datenobjekt im Debuggee, das das zu visualisierende Objekt ersetzt. Wenn Sie den Inhalt des ursprünglichen Objekts ändern möchten, ohne es zu ersetzen, verwenden Sie eine der in der folgenden Tabelle gezeigten Transfer-Methoden. Diese APIs übertragen Daten in beide Richtungen gleichzeitig, ohne das objekt zu ersetzen, das visualisiert wird:
| Objektanbieter | Objektquelle |
|---|---|
| TransferData – oder – TransferObject |
TransferData |