Compartir vía


Arquitectura de un visualizador

La arquitectura de un visualizador del depurador tiene dos partes:

  • El lado depurador se ejecuta dentro del depurador de Visual Studio. El código del lado depurador crea y muestra la interfaz de usuario para el visualizador.

  • El lado depurado se ejecuta dentro del proceso que Visual Studio depura (el depurado).

    Un visualizador es un componente del depurador que permite al depurador mostrar (visualizar) el contenido de un objeto de datos en un formato significativo y comprensible. Algunos visualizadores también admiten la edición del objeto de datos. Si escribe visualizadores personalizados, puede ampliar el depurador para que controle sus propios tipos de datos personalizados.

    El objeto de datos que se va a visualizar reside dentro del proceso que se está depurando (el proceso depurado). La interfaz de usuario que mostrará los datos se crea dentro del proceso del depurador de Visual Studio:

Proceso del depurador Proceso depurado
Interfaz de usuario del depurador (Información sobre datos, ventana Inspección, Inspección rápida) Objeto de datos que se va a visualizar

Para visualizar el objeto de datos dentro de la interfaz del depurador, se necesita código para comunicarse entre los dos procesos. Por lo tanto, la arquitectura del visualizador está compuesta de dos partes: el código del lado depurador y el código del lado depurado.

El código del lado del depurador crea su propia interfaz de usuario, a la que se puede invocar desde la interfaz del depurador, como una Información sobre datos, la ventana Inspección o Inspección rápida. La interfaz del visualizador se crea mediante la clase DialogDebuggerVisualizer y la interfaz IDialogVisualizerService. Como todas las API del visualizador, DialogDebuggerVisualizer e IDialogVisualizerService se encuentran en el espacio de nombres Microsoft.VisualStudio.DebuggerVisualizers.

Lado depurador Lado depurado
Clase DialogDebuggerVisualizer

Interfaz IDialogVisualizerService
Objetos de datos

La interfaz de usuario obtiene los datos que se van a visualizar de un proveedor de objetos, que se encuentra en el lado depurador:

Lado depurador Lado depurado
Clase DialogDebuggerVisualizer

Interfaz IDialogVisualizerService
Objetos de datos
Proveedor de objetos (implementa IVisualizerObjectProvider)

Hay un objeto correspondiente en el lado depurado denominado origen de objetos:

Lado depurador Lado depurado
Clase DialogDebuggerVisualizer

Interfaz IDialogVisualizerService
Objetos de datos
Proveedor de objetos (implementa IVisualizerObjectProvider) Origen de objetos (se deriva de VisualizerObjectSource)

El proveedor de objetos proporciona los datos de objeto que van a visualizarse en la interfaz de usuario del visualizador. El proveedor de objetos recibe los datos de objeto del origen de objetos. El proveedor de objetos y el origen de objetos proporcionan una serie de API para que los datos de objeto se comuniquen entre el lado depurador y el lado depurado.

Cada visualizador debe obtener el objeto de datos que va a visualizarse. En la siguiente tabla se muestran las API correspondientes que el proveedor de objetos y el origen de objetos utilizan para este propósito:

Proveedor de objetos Origen de objetos
GetData

-O bien-

GetObject
GetData

Tenga en cuenta que el proveedor de objetos puede utilizar GetData o GetObject. Cada API genera una llamada a GetData en el origen de objetos. Una llamada a Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData rellena System.IO.Stream, que representa el formato serializado del objeto que se está visualizando.

Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject vuelve a deserializar los datos en el formato de objeto, que después se puede mostrar en la interfaz de usuario que se cree con DialogDebuggerVisualizer. Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData rellena los datos como Stream sin formato, que debe deserializar. Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject funciona llamando a Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData para obtener los Stream serializados y deserializando los datos seguidamente. Utilice Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData cuando .NET no pueda serializar el objeto y se requiera una serialización personalizada. En tal caso, también deberá reemplazar el método Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.Serialize.

Si está creando un visualizador de sólo lectura, una comunicación unidireccional con GetData o GetObject será suficiente. Si está creando un visualizador que admite la edición de objetos de datos, el proceso es más complicado. También debe poder enviar un objeto de datos desde el proveedor de objetos de vuelta al origen de objetos. En la siguiente tabla se muestran las API del proveedor de objetos y del origen de objetos que se utilizan para este fin:

Proveedor de objetos Origen de objetos
ReplaceData

-O bien-

ReplaceObject
CreateReplacementObject

De nuevo, tenga en cuenta que hay dos API que el proveedor de objetos puede utilizar. Los datos siempre se envían desde el proveedor de objetos hasta el origen de objetos como Stream, pero ReplaceData requiere que serialice el objeto en Stream.

ReplaceObject toma el objeto suministrado, lo serializa en Stream y, a continuación, llama a ReplaceData para enviar Stream a CreateReplacementObject.

Al utilizar uno de los métodos de reemplazo, se crea un nuevo objeto de datos en el código depurado que reemplaza al objeto que está visualizándose. Si desea cambiar el contenido del objeto original sin reemplazarlo, utilice uno de los métodos de transferencia que se muestran en la siguiente tabla. Estas API transfieren los datos en ambas direcciones al mismo tiempo, sin reemplazar el objeto que se está visualizando:

Proveedor de objetos Origen de objetos
TransferData

o

TransferObject
TransferData