Udostępnij za pomocą


Architektura wizualizatora

Architektura wizualizatora debugera ma dwie części:

  • Strona debugera jest uruchamiana w debugerze programu Visual Studio. Kod po stronie debugera tworzy i wyświetla interfejs użytkownika dla wizualizatora.

  • Strona debugowania jest uruchamiana w ramach procesu debugowania programu Visual Studio ( debuggee).

    Wizualizator to składnik debugera, który umożliwia debugerowi przedstawienie zawartości obiektu danych w znaczący i zrozumiały sposób. Niektóre wizualizatory obsługują również edytowanie obiektu danych. Pisząc niestandardowe wizualizatory, można rozszerzyć debuger w celu obsługi własnych niestandardowych typów danych.

    Obiekt danych, który ma zostać zwizualizowany, znajduje się w trakcie debugowania (proces debugowania ). Interfejs użytkownika, który wyświetli dane, zostanie utworzony w ramach procesu debugera programu Visual Studio:

Proces debuggera Proces debugowania
Interfejs użytkownika debugera (DataTips, Watch Window, QuickWatch) Obiekt danych do wizualizacji

Aby zwizualizować obiekt danych w interfejsie debugera, potrzebny jest kod do komunikowania się między dwoma procesami. W związku z tym architektura wizualizatora składa się z dwóch części: kodu po stronie debugera i kodu po stronie debugowania .

Kod po stronie debugera tworzy własny interfejs użytkownika, który można wywołać z interfejsu debugera, takiego jak DataTip, okno obserwacji lub QuickWatch. Interfejs wizualizatora jest tworzony przy użyciu DialogDebuggerVisualizer klasy i interfejsu IDialogVisualizerService . Podobnie jak we wszystkich interfejsach API wizualizatora, klasa DialogDebuggerVisualizer i IDialogVisualizerService znajdują się w Microsoft.VisualStudio.DebuggerVisualizers przestrzeni nazw.

Strona debugera Strona debugowania
Klasa DialogDebuggerVisualizer

IDialogVisualizerService interfejs
Obiekt danych

Interfejs użytkownika pobiera dane do wizualizacji z dostawcy obiektów, który istnieje po stronie debugera:

Strona debugera Strona debugowania
DialogDebuggerVisualizer klasa

Interfejs IDialogVisualizerService
Obiekt danych
Dostawca obiektów (implementuje IVisualizerObjectProvider)

Po stronie debuggee znajduje się odpowiedni obiekt o nazwie Źródło obiektu:

Strona debugera Strona debugowania
DialogDebuggerVisualizer klasa

Interfejs IDialogVisualizerService
Obiekt danych
Dostawca obiektów (implementuje IVisualizerObjectProvider) Źródło obiektu (pochodzące z VisualizerObjectSource)

Dostawca obiektów udostępnia dane obiektu, które mają być wizualizowane w interfejsie użytkownika wizualizatora. Dostawca obiektów pobiera dane obiektu ze źródła obiektu. Dostawca obiektów i źródło obiektów udostępniają interfejsy API do komunikowania danych obiektów między stroną debugera a stroną debugowanego.

Każdy wizualizator musi uzyskać obiekt danych do wizualizacji. W poniższej tabeli przedstawiono odpowiednie interfejsy API używane przez dostawcę obiektów i źródło obiektów w tym celu:

Dostawca obiektów Źródło obiektu
GetData

—lub —

GetObject
GetData

Zwróć uwagę, że dostawca obiektów może używać elementu GetData lub GetObject. Każdy z interfejsów API powoduje wywołanie metody GetData w źródle obiektu. Wywołanie Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData wypełnia System.IO.Stream, które reprezentuje serializowaną formę obiektu, który jest wizualizowany.

Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject deserializuje dane z powrotem do formularza obiektu, który można następnie wyświetlić w interfejsie użytkownika utworzonym za pomocą polecenia DialogDebuggerVisualizer. Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData wypełnia dane jako nieprzetworzone Stream, które należy zdeserializować samodzielnie. Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject działa, wywołując Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData w celu pobrania serializowanej Stream, a następnie deserializacji danych. Użyj Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData , gdy obiekt nie można serializować przez platformę .NET i wymaga serializacji niestandardowej. W takim przypadku należy również zastąpić metodę Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.Serialize .

Jeśli tworzysz wizualizator tylko do odczytu, komunikacja jednokierunkowa z GetData lub GetObject jest wystarczająca. Jeśli tworzysz wizualizator obsługujący edycję obiektów danych, musisz zrobić więcej. Musisz mieć możliwość wysyłania obiektu danych z dostawcy obiektów z powrotem do źródła obiektów. W poniższej tabeli przedstawiono interfejsy API dostawcy obiektów i źródła obiektów używane do tego celu:

Dostawca obiektów Źródło obiektu
ReplaceData

—lub —

ReplaceObject
CreateReplacementObject

Zwróć uwagę, że istnieją dwa interfejsy API, których może używać dostawca obiektów. Dane są zawsze wysyłane z dostawcy obiektów do źródła obiektów jako Stream, ale ReplaceData wymaga, aby samodzielnie zserializować obiekt do formatu Stream.

ReplaceObject pobiera obiekt, który podajesz, serializuje go w Stream, a następnie wywołuje metodę ReplaceData, aby wysłać obiekt Stream do CreateReplacementObject.

Użycie jednej z metod Replace tworzy nowy obiekt danych w debugowanym programie, zastępując obiekt wizualizowany. Jeśli chcesz zmienić zawartość oryginalnego obiektu bez jego zastąpienia, użyj jednej z metod transferu pokazanych w poniższej tabeli. Te interfejsy API przesyłają dane w obu kierunkach jednocześnie bez zastępowania obiektu, który jest wizualizowany:

Dostawca obiektów Źródło obiektu
TransferData

—lub —

TransferObject
TransferData