Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Importante
A partir de la versión 17.9 de Visual Studio 2022, los visualizadores ahora se pueden escribir en .NET 6.0+ que se ejecutan fuera de proceso mediante el nuevo modelo de extensibilidad VisualStudio.Extensibility. Para las extensiones creadas con el nuevo modelo, consulte en su lugar la documentación en Creación de visualizadores del depurador de Visual Studio. Si necesita admitir versiones anteriores de Visual Studio o desea enviar los visualizadores personalizados como parte de un archivo DLL de biblioteca, use la información de este artículo, que solo se aplica al modelo anterior de desarrollo de extensiones (VSSDK).
Un visualizador forma parte de la interfaz de usuario del depurador de Visual Studio que muestra una variable u objeto de una manera adecuada para su tipo de datos. Por ejemplo, un visualizador de mapa de bits interpreta una estructura de mapa de bits y muestra el gráfico que representa. Algunos visualizadores le permiten modificar y ver los datos. En el depurador, un visualizador se representa por un icono de lupa
. Puede seleccionar el icono en un DataTip, Watch del depurador o cuadro de diálogo QuickWatch, y después seleccionar el visualizador adecuado para el objeto correspondiente.
Además de los visualizadores integrados estándar, es posible que haya más visualizadores disponibles para su descarga desde Microsoft, terceros y la comunidad. También puede escribir sus propios visualizadores e instalarlos en el depurador de Visual Studio.
En este artículo se proporciona información general de alto nivel sobre la creación del visualizador. Para obtener instrucciones detalladas, consulte los artículos siguientes en su lugar:
- Tutorial: Escritura de un visualizador en C#
- Tutorial: Escritura de un visualizador en Visual Basic
- Instalación de un visualizador
- En la documentación de Natvis , consulte el elemento UIVisualizer. Consulte también el ejemplo del visualizador de depurador nativo de SQLite .
Nota:
Los visualizadores personalizados no son compatibles con las aplicaciones de la Plataforma universal de Windows (UWP) y Windows 8.x.
Información general
Puede escribir un visualizador personalizado para un objeto de cualquier clase administrada, excepto para Object y Array.
La arquitectura de un visualizador de depurador tiene dos partes:
El lado del depurador se ejecuta dentro del depurador de Visual Studio y crea y muestra la interfaz de usuario del visualizador.
Dado que Visual Studio se ejecuta en el entorno de ejecución de .NET Framework, este componente debe escribirse para .NET Framework. Por este motivo, no es posible escribirlo para .NET Core.
El lado del programa en depuración se ejecuta dentro del proceso que Visual Studio está depurando (el programa en depuración). El objeto de datos que se va a visualizar (por ejemplo, un objeto String) existe en el proceso depurado. El lado que está siendo depurado envía el objeto al lado del depurador, que lo muestra en la interfaz de usuario que creaste.
El entorno de ejecución en el que compilas este componente debe coincidir con aquel en el que se ejecutará el proceso a depurar, es decir, .NET Framework o .NET Core.
El lado del depurador recibe el objeto de datos de un proveedor de objetos que implementa la interfaz IVisualizerObjectProvider. El lado del depurador envía el objeto a través del origen del objeto, que se deriva de VisualizerObjectSource.
El proveedor de objetos también puede devolver datos al origen del objeto, lo que permite escribir un visualizador que pueda editar datos. Invalida el proveedor de objetos para comunicarse con el evaluador de expresiones y el origen del objeto.
El lado depurado y el lado depurador se comunican entre sí a través de métodos Stream que serializan un objeto de datos en un Stream y deserializan el Stream de nuevo en un objeto de datos.
Puede escribir un visualizador para un tipo genérico solo si el tipo es un tipo abierto. Esta restricción es la misma que la restricción al usar el DebuggerTypeProxy atributo . Para obtener más información, consulte Uso del atributo DebuggerTypeProxy.
Es posible que los visualizadores personalizados tengan consideraciones de seguridad. Consulte Consideraciones de seguridad del visualizador.
Creación de la interfaz de usuario del lado depurador
Para crear la interfaz de usuario del visualizador en el lado del depurador, cree una clase que herede de DialogDebuggerVisualizere invalide el Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer.Show método para mostrar la interfaz. Puede usar IDialogVisualizerService para mostrar formularios Windows Forms, cuadros de diálogo y controles en el visualizador.
Utiliza IVisualizerObjectProvider métodos para obtener el objeto visualizado desde el lado del depurador.
Cree una clase que herede de DialogDebuggerVisualizer.
Nota:
Debido a los problemas de seguridad descritos en la sección siguiente, a partir de la versión 17.11 de Visual Studio 2022, los visualizadores no podrán especificar la Legacy directiva de formateador en el constructor de la clase base. A partir de ahora, los visualizadores solo pueden usar la serialización JSON para comunicarse entre el depurador y los componentes del lado depurador .
Invalide el método Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer.Show para mostrar su interfaz. Use IDialogVisualizerService métodos para mostrar formularios de Windows Forms, cuadros de diálogo y controles en tu interfaz.
Aplique DebuggerVisualizerAttribute, dándole el visualizador para mostrar (DialogDebuggerVisualizer).
Consideraciones especiales del lado del depurador para .NET 5.0+
Los visualizadores personalizados transfieren datos entre el programa en depuración y el depurador a través de la serialización binaria mediante la clase BinaryFormatter de forma predeterminada. Sin embargo, ese tipo de serialización se está restringiendo en .NET 5 y versiones posteriores debido a preocupaciones de seguridad acerca de sus vulnerabilidades irremediables. Además, se ha marcado como completamente obsoleto en ASP.NET Core 5 y su uso se producirá como se describe en la documentación principal de ASP.NET. En esta sección se describen los pasos que debe seguir para asegurarse de que el visualizador sigue siendo compatible en este escenario.
Por motivos de compatibilidad, el Show método que se invalidó en la sección anterior sigue teniendo un IVisualizerObjectProvider. Sin embargo, a partir de la versión 16.10 de Visual Studio 2019, es realmente de tipo IVisualizerObjectProvider3. Por este motivo, convierta el objeto
objectProvidera la interfaz actualizada.Al enviar objetos, como comandos o datos, al lado del depurador, utilice el método
IVisualizerObjectProvider2.Serializepara pasarlos a un flujo; determinará el mejor formato de serialización a usar en función del tiempo de ejecución del proceso depurado. A continuación, pase la secuencia al métodoIVisualizerObjectProvider2.TransferData.Si el componente del visualizador del lado depurado debe devolver algo al lado del depurador, se ubicará en el Stream objeto devuelto por el TransferData método . Utilice el método
IVisualizerObjectProvider2.GetDeserializableObjectFrompara obtener una instancia IDeserializableObject y procesarla según sea necesario; o utilice DeserializeFromJson si se trata de un tipo que sabe cómo deserializar.
Consulte la sección Consideraciones especiales del lado del depurador para .NET 5.0+ para obtener información sobre qué otros cambios se requieren en el lado del depurador cuando no se admite la Serialización Binaria.
Nota:
Si desea obtener más información sobre el problema, consulte la guía de seguridad BinaryFormatter.
Crea el origen del objeto del visualizador para el lado del depurador
En el código del lado del depurador, edite DebuggerVisualizerAttribute, proporcionando el tipo que se va a visualizar (el origen del objeto del lado del depurado) (VisualizerObjectSource). La Target propiedad establece el origen del objeto. Si omite el origen del objeto, el visualizador usará un origen de objeto predeterminado.
El código del lado del depurador contiene el código fuente del objeto que se visualiza. El objeto de datos puede invalidar los métodos de VisualizerObjectSource. Si desea crear un visualizador independiente, es necesario un archivo DLL del lado del programa en depuración.
En el código del lado depurado:
Para permitir que el visualizador edite objetos de datos, el origen del objeto debe heredar de VisualizerObjectSource y sobrescribir los métodos
TransferDataoCreateReplacementObject.Si necesita admitir varios destinos en el visualizador, puede usar los siguientes Target Framework Monikers (TFMs) en el archivo de proyecto del lado del depurador.
<TargetFrameworks>net20;netstandard2.0;netcoreapp2.0</TargetFrameworks>Estos son los únicos TFM admitidos.
Consideraciones especiales del lado del programa depurado para .NET 5.0+
Importante
Es posible que se necesiten pasos adicionales para que un visualizador funcione a partir de .NET 5.0 debido a problemas de seguridad relacionados con el método de serialización binario subyacente que se usa de forma predeterminada. Lea esta sección antes de continuar.
Si el visualizador implementa el TransferData método , use el método recién agregado GetDeserializableObject que está disponible en la versión más reciente de
VisualizerObjectSource. El IDeserializableObject objeto que devuelve ayuda a determinar el formato de serialización del objeto (binario o JSON) y a deserializar el objeto subyacente para que se pueda usar.Si el lado depurado devuelve datos al lado del depurador como parte de la
TransferDatallamada, serialice la respuesta al stream del lado del depurador mediante el método Serialize.