Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
Начиная с Visual Studio 2022 версии 17.9, визуализаторы теперь могут быть написаны в .NET 6.0+, которые работают вне процесса с использованием новой модели VisualStudio.Extensibility. Расширения, созданные с помощью новой модели, см. в документации по созданию визуализаторов отладчика Visual Studio . Если вам нужно поддерживать более старые версии Visual Studio или отправлять пользовательские визуализаторы в рамках библиотеки DLL, используйте сведения в этой статье, которая применяется только к старой модели разработки расширений (VSSDK).
Визуализатор является частью пользовательского интерфейса отладчика Visual Studio, который отображает переменную или объект таким образом, чтобы он соответствовал его типу данных. Например, визуализатор растрового изображения интерпретирует структуру растрового изображения и отображает рисунок, который он представляет. Некоторые визуализаторы позволяют изменять, а также просматривать данные. В отладчике визуализатор представлен значком в виде лупы . Значок можно выбрать в диалоговом окне dataTip, отладчике или в диалоговом окне "Быстрый просмотр ", а затем выбрать соответствующий визуализатор для соответствующего объекта.
Помимо стандартных встроенных визуализаторов, для скачивания из Корпорации Майкрософт, сторонних производителей и сообщества могут быть доступны дополнительные визуализаторы. Вы также можете написать собственные визуализаторы и установить их в отладчике Visual Studio.
В этой статье представлен общий обзор создания визуализатора. Подробные инструкции см. в следующих статьях:
- Пошаговое руководство. Создание визуализатора в C#
- Пошаговое руководство. Создание визуализатора в Visual Basic
- Установка визуализатора
- В документации по Natvis см. элемент UIVisualizer. Кроме того, см. пример визуализатора собственного отладчика SQLite .
Замечание
Пользовательские визуализаторы не поддерживаются для приложений универсальной платформы Windows (UWP) и Windows 8.x.
Обзор
Вы можете написать пользовательский визуализатор для объекта любого управляемого класса, кроме Object и Array.
Архитектура визуализатора отладчика состоит из двух частей:
Сторона отладчика выполняется в отладчике Visual Studio и создает и отображает пользовательский интерфейс визуализатора.
Так как Visual Studio выполняется в среде выполнения .NET Framework, этот компонент должен быть написан для .NET Framework. По этой причине его невозможно написать для .NET Core.
Сторона отладчика выполняется в процессе отладки Visual Studio (отладчик). Объект данных для визуализации (например, объекта String) существует в процессе отладки. Сторона отлаживаемого отправляет объект на сторону отладчика, который затем отображает его в интерфейсе пользователя, созданном вами.
Среда выполнения, для которой вы создаете этот компонент, должна соответствовать той, в которой будет выполняться процесс отладки, то есть .NET Framework или .NET Core.
Сторона отладчика получает объект данных от поставщика объектов , реализующего IVisualizerObjectProvider интерфейс. Сторона отладчика отправляет объект через источник объекта, производный от VisualizerObjectSource.
Поставщик объектов также может отправлять данные обратно в источник объекта, что позволяет создавать визуализатор, который может изменять данные. Вы переопределяете поставщика объектов, чтобы взаимодействовать с контроллером выражений и источником объектов.
Сторона отладчика и отладчик взаимодействуют друг с другом с помощью Stream методов сериализации объекта данных в Stream объект данных и десериализации Stream обратно в объект данных.
Визуализатор для универсального типа можно написать, только если тип является открытым типом. Это ограничение совпадает с ограничением при использовании атрибута DebuggerTypeProxy
. Дополнительные сведения см. в разделе "Использование атрибута DebuggerTypeProxy".
Пользовательские визуализаторы могут учитывать вопросы безопасности. См. рекомендации по обеспечению безопасности визуализатора.
Создание пользовательского интерфейса отладчика
Чтобы создать пользовательский интерфейс визуализатора на стороне отладчика, создайте класс, который наследует DialogDebuggerVisualizer, и переопределите метод Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer.Show для его отображения. Вы можете использовать IDialogVisualizerService для отображения форм, диалогов и элементов управления в визуализаторе.
Используйте IVisualizerObjectProvider методы для получения визуализированного объекта на стороне отладчика.
Создание класса, наследуемого от DialogDebuggerVisualizer.
Замечание
Из-за проблем безопасности, описанных в приведенном ниже разделе, начиная с Visual Studio 2022 версии 17.11 визуализаторы не смогут указывать Legacy
политику форматирования в конструкторе базового класса. Теперь визуализаторы могут использовать сериализацию JSON только для обмена данными между отладчиком и компонентами на стороне отладки .
Переопределите метод Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer.Show, чтобы отобразить ваш интерфейс. Используйте IDialogVisualizerService методы для отображения форм, диалогов и элементов управления в интерфейсе.
Применить DebuggerVisualizerAttribute, чтобы визуализатор отображал (DialogDebuggerVisualizer).
Специальные рекомендации по отладчику для .NET 5.0+
Пользовательские визуализаторы передают данные между отладчиком и отладчиком через двоичную сериализацию с помощью BinaryFormatter класса по умолчанию. Однако этот вид сериализации сокращается в .NET 5 и выше из-за проблем безопасности, связанных с ее неисправимыми уязвимостями. Кроме того, он был отмечен полностью устаревшим в ASP.NET Core 5, и его использование будет вызываться, как описано в документации по ASP.NET Core. В этом разделе описаны шаги, которые необходимо предпринять, чтобы убедиться, что визуализатор по-прежнему поддерживается в этом сценарии.
По соображениям совместимости метод Show, переопределенный в предыдущем разделе, по-прежнему принимает IVisualizerObjectProvider. Однако начиная с Visual Studio 2019 версии 16.10 он фактически имеет тип IVisualizerObjectProvider3. Приведите
objectProvider
объект к обновленному интерфейсу.При отправке объектов, таких как команды или данные, на сторону отлаживаемого процесса, используйте метод
IVisualizerObjectProvider2.Serialize
для передачи в поток. Этот метод определяет лучший формат сериализации, который следует использовать, исходя из среды выполнения отлаживаемого процесса. Затем передайте поток в методIVisualizerObjectProvider2.TransferData
.Если компонент визуализатора на стороне отладчика должен вернуть все, что нужно отладчику, он будет находиться в Stream объекте, возвращаемом методом TransferData .
IVisualizerObjectProvider2.GetDeserializableObjectFrom
Используйте метод, чтобы получить экземпляр IDeserializableObject и обработать его по мере необходимости; или используйте DeserializeFromJson, если это тип, о котором вы знаете, как его десериализовать.
Пожалуйста, обратитесь к разделу Особые соображения для отлаживаемой программы на .NET 5.0+, чтобы узнать, какие другие изменения необходимы на стороне отлаживаемого приложения, когда двоичная сериализация не поддерживается.
Замечание
Дополнительные сведения о проблеме см. в руководстве по безопасности BinaryFormatter.
Создание источника объекта визуализатора для стороны отладчика
В коде на стороне отладчика измените DebuggerVisualizerAttribute, задав ему тип для визуализации (источник объекта на стороне программы) (VisualizerObjectSource). Свойство Target
задает источник объекта. Если опустить источник объекта, визуализатор будет использовать источник объектов по умолчанию.
Код на стороне отладчика содержит источник объекта, который визуализируется. Объект данных может переопределить методы VisualizerObjectSource. Библиотека DLL на стороне отладчика необходима, если требуется создать автономный визуализатор.
В коде на стороне отладчика:
Чтобы визуализатор редактировал объекты данных, источник объекта должен наследоваться от VisualizerObjectSource и переопределять метод
TransferData
или методCreateReplacementObject
.Если вам нужно поддерживать многоцелевую поддержку в вашем визуализаторе, в файле проекта на стороне отладчика можно использовать следующие моникеры целевых платформ (TFMs).
<TargetFrameworks>net20;netstandard2.0;netcoreapp2.0</TargetFrameworks>
Это единственные поддерживаемые TFM.
Специальные рекомендации по отладке для .NET 5.0+
Это важно
Дополнительные шаги могут потребоваться для работы визуализатора, начиная с .NET 5.0, из-за проблем безопасности в отношении базового метода двоичной сериализации, используемого по умолчанию. Прежде чем продолжить, ознакомьтесь с этим разделом .
Если визуализатор реализует TransferData метод, используйте только что добавленный GetDeserializableObject метод, доступный в последней версии
VisualizerObjectSource
. Возвращаемый IDeserializableObject объект помогает определить формат сериализации объекта (двоичный или JSON) и десериализировать базовый объект, чтобы его можно было использовать.Если отладчик возвращает данные на стороне отладчика в рамках
TransferData
вызова, сериализируйте ответ на поток отладчика с помощью Serialize метода.