Архитектура визуализатора
Архитектура визуализатора отладчика состоит из двух частей:
Сторона отладчика — код, который запускается в отладчике 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 |