Compartilhar via


Arquitetura do visualizador

A arquitetura de um visualizador de depurador tem duas partes:

  • O lado do depurador é executado no depurador do Visual Studio. O código do lado do depurador cria e exibe a interface de usuário para o seu visualizador.

  • O lado de depuração é executado dentro do processo em que o Visual Studio está depurando (o depurador).

    Um visualizador é um componente de depurador que permite que o depurador exiba (visualizar) o conteúdo de um objeto de dados de forma significativa e compreensível. Alguns visualizadores também dão suporte à edição do objeto de dados. Ao escrever visualizadores personalizados, você pode estender o depurador para lidar com seus próprios tipos de dados personalizados.

    O objeto de dados a ser visualizado reside no processo que você está depurando (o processo de depuração ). A interface do usuário que exibirá os dados é criada no processo do depurador do Visual Studio:

Processo do depurador Processo de depuração
Interface do usuário do depurador (DataTips, Watch Window, QuickWatch) Objeto de dados a ser visualizado

Para visualizar o objeto de dados dentro da interface do depurador, você precisa de código para se comunicar entre os dois processos. Consequentemente, a arquitetura do visualizador consiste em duas partes: código lado do depurador e código lado do programa testado.

O código do lado do depurador cria sua própria interface de usuário, que pode ser invocada a partir da interface do depurador, como um DataTip, a Watch Window ou QuickWatch. A interface do visualizador é criada usando a DialogDebuggerVisualizer classe e a IDialogVisualizerService interface. Assim como todas as APIs do Visualizador, DialogDebuggerVisualizer e IDialogVisualizerService são encontrados no Microsoft.VisualStudio.DebuggerVisualizers namespace.

Lado do depurador Lado de depuração
Classe DialogDebuggerVisualizer

IDialogVisualizerService Interface
Objeto de Dados

A interface do usuário obtém os dados a serem visualizados de um Provedor de Objetos, que existe no lado do depurador:

Lado do Depurador Lado de depuração
Classe DialogDebuggerVisualizer

IDialogVisualizerService Interface
Objeto de Dados
Provedor de Objetos (implementa IVisualizerObjectProvider)

Há um objeto correspondente no lado do depurador chamado Fonte do Objeto:

Lado do Depurador Lado de depuração
Classe DialogDebuggerVisualizer

IDialogVisualizerService Interface
Objeto de Dados
Provedor de Objetos (implementa IVisualizerObjectProvider) Origem do objeto (derivada de VisualizerObjectSource)

O Provedor de Objetos fornece os dados de objeto que devem ser visualizados para a interface do usuário do visualizador. O Provedor de Objetos obtém os dados do objeto da origem do objeto. O Provedor de Objetos e a Fonte de Objeto fornecem APIs para comunicar dados de objeto entre o lado do depurador e o lado de depuração.

Cada visualizador deve fazer com que o objeto de dados seja visualizado. A tabela a seguir mostra as APIs correspondentes que o Provedor de Objetos e a Origem do Objeto usam para esta finalidade:

Provedor de Objetos Origem do objeto
GetData

— ou—

GetObject
GetData

Observe que o provedor de objetos pode usar um GetData ou GetObject. Qualquer uma das APIs resulta em uma chamada para GetData na Origem do Objeto. Uma chamada para Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData preenche uma System.IO.Stream, que representa uma forma serializada do objeto que está sendo visualizado.

Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject desserializa os dados de volta para a forma de objeto, que você pode então exibir na interface de usuário criada com DialogDebuggerVisualizer. Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData preenche os dados como dados brutos Stream, que você deve desserializar por conta própria. Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject funciona chamando Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData para obter a versão serializada de Stream, e desserializando os dados. Use Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData quando o objeto não for serializável por .NET e precisar de serialização personalizada. Nesse caso, você também deve substituir o método Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.Serialize.

Se você estiver criando um visualizador somente leitura, a comunicação unidirecional com GetData ou GetObject é suficiente. Se você estiver criando um visualizador que dê suporte à edição de objetos de dados, deverá fazer mais. Você deve ser capaz de enviar um objeto de dados do Provedor de Objetos de volta para a Fonte de Objeto também. A tabela a seguir mostra as APIs de Origem do Objeto e do Provedor de Objetos usadas para esta finalidade:

Provedor de Objetos Origem do objeto
ReplaceData

— ou—

ReplaceObject
CreateReplacementObject

Observe, novamente, que há duas APIs que o Provedor de Objetos pode usar. Os dados sempre são enviados do Provedor de Objetos para a Fonte de Objeto como um Stream, mas ReplaceData exige que você serialize o próprio objeto em um Stream.

ReplaceObject usa um objeto que você fornece, serializa-o em um Stream, e, em seguida, chama ReplaceData para enviar o Stream para CreateReplacementObject.

O uso de um dos métodos Replace cria um novo objeto de dados no depurador que substitui o objeto que está sendo visualizado. Se você quiser alterar o conteúdo do objeto original sem substituí-lo, use um dos métodos transfer mostrados na tabela a seguir. Essas APIs transferem dados em ambas as direções ao mesmo tempo, sem substituir o objeto que está sendo visualizado:

Provedor de Objetos Origem do objeto
TransferData

— ou—

TransferObject
TransferData