Lenguaje
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 mediante el modelo nuevo, consulte la documentación en Crear visualizadores del depurador de Visual Studio en su lugar. 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 con un icono de lupa
. Puede seleccionar el icono de una información sobre datos, la ventana Inspección o el cuadro de diálogo Inspección rápida del depurador y luego 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 depurado se ejecuta dentro del proceso que Visual Studio depura (el depurado). El objeto de datos que se va a visualizar (por ejemplo, un objeto String) existe en el proceso depurado. El lado depurado envía el objeto al lado depurador, que lo muestra en la interfaz de usuario que se crea.
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 depurado envía el objeto a través del origen de 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. Reemplace el proveedor de objetos para comunicarse con el evaluador de expresiones y el origen de 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 Stream y deserializan de nuevo Stream 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.
Utilice los métodos IVisualizerObjectProvider para obtener el objeto visualizado en el lado 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 utilizar la serialización JSON para comunicarse entre los componentes del lado depurador y los componentes del lado depurado.
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 los lados depurado y 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 regirá por la documentación de ASP.NET Core. 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 necesita devolver algo al lado depurador, se ubicará en el objeto Stream devuelto por el método TransferData. 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.
Crear el origen del objeto de visualizador del lado depurado
En el código del depurador, edite el objeto DebuggerVisualizerAttribute, asignándole el tipo que se va a visualizar (el origen del objeto del lado 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 depurado contiene el origen del objeto que se visualiza. El objeto de datos puede invalidar los métodos de VisualizerObjectSource. Un archivo DLL del lado depurado es necesario si desea crear un visualizador independiente.
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 la compatibilidad con múltiples versiones (multi-targeting) en el visualizador, puede usar los siguientes monikers de la plataforma de destino (TFM) en el archivo del proyecto del lado depurado.
<TargetFrameworks>net20;netstandard2.0;netcoreapp2.0</TargetFrameworks>Estos son los únicos TFM admitidos.
Consideraciones especiales del lado 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 depurador como parte de la llamada
TransferData, serialice la respuesta a la secuencia del lado depurador a través del método Serialize.