Архитектура визуализатора
Архитектура визуализатора отладчика состоит из двух частей:
Сторона отладчика – код, который запускается в отладчике 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. Любой API приводит к вызову GetData для источника объектов. Вызов VisualizerObjectSource.GetData заполняет [System.IO.Stream], который представляет сериализованную форму визуализируемого объекта.
Метод IVisualizerObjectProvider.GetObject десериализует данные обратно в форму объекта, которую затем можно отобразить в пользовательском интерфейсе, создаваемом с помощью класса DialogDebuggerVisualizer. Метод IVisualizerObjectProvider.GetData возвращает данные в качестве необработанного объекта [System.IO.Stream], который необходимо десериализовать отдельно. Для получения сериализованного объекта [System.IO.Stream] и последующей десериализации данных из него метод IVisualizerObjectProvider.GetObject вызывает метод IVisualizerObjectProvider.GetData. Используйте IVisualizerObjectProvider.GetData, когда объект не является сериализуемым средствами .NET и требует пользовательской сериализации. В этом случае необходимо также переопределить метод VisualizerObjectSource.Serialize.
Если нужен визуализатор только для чтения, достаточно односторонней связи с помощью GetData или GetObject. Если вы создаете визуализатор с поддержкой редактирования объектов данных, необходимо сделать больше. Необходимо иметь также возможность для отправки объекта данных от поставщика объектов обратно источнику. В следующей таблице показаны API поставщика и источника объектов, используемые для этой цели:
Поставщик объектов |
Источник объектов |
---|---|
—или— |
Обратите внимание, что поставщик объектов может использовать два API. Данные всегда посылаются от поставщика объектов источнику как [System.IO.Stream], но метод ReplaceData требует отдельной сериализации объекта в [System.IO.Stream].
Метод ReplaceObject принимает объект, сериализует его в [System.IO.Stream], затем вызывает метод ReplaceData для отправки [System.IO.Stream] в CreateReplacementObject.
С помощью одного из методов Replace создается новый объект данных в отлаживаемом коде, который заменяет объект визуализации. Если надо изменить содержимое исходного объекта без его замены, воспользуйтесь одним из методов Transfer, показанных в следующей таблице. Эти API передают данные в обоих направлениях одновременно, без замены визуализируемого объекта:
Поставщик объектов |
Источник объектов |
---|---|
—или— |
См. также
Задачи
Практическое руководство. Написание визуализатора
Пошаговое руководство. Написание визуализатора на C#
Пошаговое руководство. Написание визуализатора на Visual Basic
Пошаговое руководство. Написание визуализатора на Visual Basic