Compartir a través de


Arquitectura del visualizador

La arquitectura de un visualizador de depurador tiene dos partes:

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

  • El lado del programa en depuración se ejecuta dentro del proceso que Visual Studio está depurando (el programa en depuración).

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

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

Proceso del depurador Proceso bajo depuración
Interfaz de usuario del depurador (Pistas de datos, Ventana de observació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, necesita código para comunicarse entre los dos procesos. Por lo tanto, la arquitectura del visualizador consta de dos partes: del código del lado depurador y del código del lado depurado.

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

Lado del depurador Lado del programa en depuración
DialogDebuggerVisualizer Clase

IDialogVisualizerService (interfaz)
Data (objeto)

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

Lado del depurador Lado depurado
DialogDebuggerVisualizer Clase

Interfaz IDialogVisualizerService
Data (objeto)
Proveedor de objetos (implementa IVisualizerObjectProvider)

Hay un objeto correspondiente en el lado del depurador denominado Fuente del Objeto:

Lado del depurador Lado de depuración
Clase DialogDebuggerVisualizer

IDialogVisualizerService (interfaz)
Data (objeto)
Proveedor de objetos (implementa IVisualizerObjectProvider) Origen de objeto (derivado de VisualizerObjectSource)

El proveedor de objetos proporciona los datos de objeto que se van a visualizar en la interfaz de usuario del visualizador. El proveedor de objetos obtiene los datos del objeto del origen del objeto. El proveedor de objetos y el origen de objetos proporcionan API para comunicar los datos del objeto entre el lado del depurador y el lado depurado.

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

Proveedor de objetos Origen del objeto
GetData

-O bien-

GetObject
GetData

Observe que el proveedor de objetos puede usar GetData o GetObject. Cualquiera de las API da como resultado una llamada a GetData en el origen del objeto. Una llamada a Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData completa un System.IO.Stream, que representa una forma serializada del objeto que se está visualizando.

Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject deserializa los datos de nuevo en el formulario de objeto, que luego puede mostrar en la interfaz de usuario que crea con DialogDebuggerVisualizer. Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData rellena los datos como datos sin procesar Stream, que debe deserializar usted mismo. Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject funciona llamando a Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData para obtener los datos serializados Stream, y a continuación, deserializar los datos. Se usa Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData cuando .NET no puede serializar el objeto y requiere serialización personalizada. En ese caso, también debe invalidar el Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.Serialize método .

Si va a crear un visualizador de solo lectura, la comunicación unidireccional con GetData o GetObject es suficiente. Si va a crear un visualizador que admita la edición de objetos de datos, debe hacer más. También debe ser capaz de enviar un objeto de datos desde el Proveedor de Objetos al Origen de Objetos. En la tabla siguiente se muestran las API de proveedor de objetos y origen de objetos que se usan para este propósito:

Proveedor de objetos Origen del objeto
ReplaceData

-O bien-

ReplaceObject
CreateReplacementObject

Tenga en cuenta, de nuevo, que hay dos API que el proveedor de objetos puede usar. Los datos siempre se envían desde el proveedor de objetos al origen del objeto como un Stream, pero ReplaceData requiere que serialices el objeto por ti mismo en un Stream.

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

El uso de uno de los métodos Replace crea un nuevo objeto de datos en el entorno de depuración que reemplaza al objeto que está siendo visualizado. Si desea cambiar el contenido del objeto original sin reemplazarlo, use uno de los métodos Transfer que se muestran en la tabla siguiente. Estas API transfieren datos en ambas direcciones al mismo tiempo, sin reemplazar el objeto que se está visualizando:

Proveedor de objetos Origen del objeto
TransferData

-O bien-

TransferObject
TransferData