Архитектура визуализатора

Архитектура визуализатора отладчика состоит из двух частей:

  • Сторона отладчика — код, который запускается в отладчике Visual Studio. Код со стороны отладчика создает и отображает пользовательский интерфейс визуализатора.

  • Сторона отлаживаемого кода — код, который выполняется внутри процесса, отлаживаемого в Visual Studio (отлаживаемая программа).

    Визуализатор является компонентом отладчика, который позволяет отладчику отображать (визуализировать) содержимое объекта данных в удобочитаемом, понятном виде. Некоторые визуализаторы поддерживают также редактирование объекта данных. Путем написания пользовательских визуализаторов можно расширить возможности отладчика для обработки пользовательских типов данных.

    Объект данных, который будет отображен, находится в пределах процесса отладки (отлаживаемый процесс). Пользовательский интерфейс, который будет отображать данные, создается в пределах процесса отладчика Visual Studio:

Процесс отладчика Отлаживаемый процесс
Пользовательский интерфейс отладчика (подсказки, окно "Контрольное значение", окно "Быстрая проверка") Объект данных для отображения

Для визуализации объекта данных в пределах интерфейса отладчика требуется код для обмена данными между двумя процессами. Таким образом, архитектура визуализатора состоит из двух компонентов: кода стороны отладчика и кода стороны отлаживаемого объекта.

Код стороны отладчика создает свой собственный интерфейс пользователя, к которому может обращаться интерфейс отладчика, например, окно подсказки, окно контрольного значения или окно быстрой проверки. Интерфейс визуализатора создан с помощью класса DialogDebuggerVisualizer и интерфейса IDialogVisualizerService. Как все API визуализатора, DialogDebuggerVisualizer и IDialogVisualizerService находятся в пространстве имен Microsoft.VisualStudio.DebuggerVisualizers.

Сторона отладчика Сторона отлаживаемого объекта
Класс DialogDebuggerVisualizer

Интерфейс IDialogVisualizerService
Объект данных

Пользовательский интерфейс получает данные для отображения от поставщика объектов, который существует на стороне отладчика:

Сторона отладчика Сторона отлаживаемого объекта
Класс DialogDebuggerVisualizer

Интерфейс IDialogVisualizerService
Объект данных
Поставщик объектов (реализует IVisualizerObjectProvider)

Существует соответствующий объект на стороне отлаживаемого кода — источник объектов:

Сторона отладчика Сторона отлаживаемого объекта
Класс DialogDebuggerVisualizer

Интерфейс IDialogVisualizerService
Объект данных
Поставщик объектов (реализует IVisualizerObjectProvider) Источник объектов (производный от VisualizerObjectSource)

Поставщик объектов предоставляет объект данных для отображения в пользовательском интерфейсе визуализатора. Поставщик объектов получает объект данных от источника объектов. Поставщик объектов и источник объектов предоставляют API-интерфейсы для обмена данными объекта между сторонами отладчика и отлаживаемого объекта.

Каждый визуализатор должен получить объект данных для отображения. В следующей таблице показаны соответствующие API, которые поставщик объектов и источник объектов используют для этой цели:

Поставщик объектов Источник объектов
GetData

— или —

GetObject
GetData

Обратите внимание, что поставщик объектов может использовать как GetData, так и GetObject. Любой API приводит к вызову GetData для источника объектов. Вызов Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData заполняет System.IO.Stream, который представляет сериализованную форму визуализируемого объекта.

Метод Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject десериализует данные обратно в форму объекта, которую затем можно отобразить в пользовательском интерфейсе, создаваемом с помощью класса DialogDebuggerVisualizer. Метод Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData заполняет данные и возвращает их в качестве необработанного объекта Stream, который необходимо десериализовать отдельно. Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject вызывает Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData для получения сериализованных данных Stream, а затем десериализует данные. Используйте Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData, когда объект не является сериализуемым средствами .NET и требует пользовательской сериализации. В этом случае необходимо также переопределить метод Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.Serialize.

Если нужен визуализатор только для чтения, достаточно односторонней связи с помощью GetData или GetObject. Если вы создаете визуализатор с поддержкой редактирования объектов данных, необходимо сделать больше. Необходимо иметь также возможность для отправки объекта данных от поставщика объектов обратно источнику. В следующей таблице показаны API поставщика и источника объектов, используемые для этой цели:

Поставщик объектов Источник объектов
ReplaceData

— или —

ReplaceObject
CreateReplacementObject

Обратите внимание, что поставщик объектов может использовать два API. Данные всегда посылаются от поставщика объектов источнику как Stream, но метод ReplaceData требует отдельной сериализации объекта в Stream.

ReplaceObject принимает объект, сериализует его в Stream, затем вызывает метод ReplaceData для отправки Stream в CreateReplacementObject.

С помощью одного из методов Replace создается новый объект данных в отлаживаемом коде, который заменяет объект визуализации. Если надо изменить содержимое исходного объекта без его замены, воспользуйтесь одним из методов Transfer, показанных в следующей таблице. Эти API передают данные в обоих направлениях одновременно, без замены визуализируемого объекта:

Поставщик объектов Источник объектов
TransferData

— или —

TransferObject
TransferData