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 depurador cria e exibe a interface do usuário para o visualizador.

  • O lado a ser depurado é executado dentro do processo que o Visual Studio está depurando (o lado a ser depurado).

Um visualizador é um componente de depurador que permite que o depurador exiba (visualize) o conteúdo de um objeto de dados em um formato significativo e legível. Alguns visualizadores também dão suporte à edição do objeto de dados. Ao escrever visualizadores personalizados, você poderá 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ê estiver depurando (o processo a ser depurado). A interface do usuário que exibirá os dados é criada no processo a ser depurado do Visual Studio:

Processo do depurador

Processo a ser depurado

Interface de usuário do depurador (DataTips, janela de inspeção, QuickWatch)

Objeto de dados a ser visualizado

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

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

O lado do depurador

O lado a ser depurado

Classe DialogDebuggerVisualizer

Interface de IDialogVisualizerService

Objeto de dados

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

O lado do depurador

O lado a ser depurado

Classe DialogDebuggerVisualizer

Interface de IDialogVisualizerService

Objeto de dados

Provedor do Objeto (implementa IVisualizerObjectProvider)

Há um objeto correspondente no lado a ser depurado chamado de Origem do Objeto:

O lado do depurador

O lado a ser depurado

Classe DialogDebuggerVisualizer

Interface de IDialogVisualizerService

Objeto de dados

Provedor do Objeto (implementa IVisualizerObjectProvider)

Origem do Objeto (derivada de VisualizerObjectSource)

O Provedor do Objeto fornece os dados do objeto que devem ser visualizado na interface do usuário do visualizador. O Provedor do Objeto obtém os dados do objeto da Origem do Objeto. O Provedor do Objeto e a Origem do Objeto fornecem APIs para comunicar dados de objeto entre o lado do depurador e o lado a ser depurado.

Cada visualizador deve obter o objeto de dados a ser visualizado. A tabela a seguir mostra as APIs correspondentes que o Provedor do Objeto e a Origem do Objeto usam para esse propósito:

Provedor do Objeto

Origem do Objeto

GetData

—ou—

GetObject

GetData

Observe que o provedor do objeto pode usar GetData ou GetObject. Qualquer API resulta em uma chamada para GetData na Origem do Objeto. Uma chamada para VisualizerObjectSource.GetData preenche um [System.IO.Stream], que representa um formato serializado do objeto que está sendo visualizado.

O IVisualizerObjectProvider.GetObject desserializa os dados de volta no formato do objeto, que você pode exibir na interface do usuário que cria com DialogDebuggerVisualizer. O IVisualizerObjectProvider.GetData preenche os dados como [System.IO.Stream]bruto, que você deve desserializar. O IVisualizerObjectProvider.GetObject funciona chamando IVisualizerObjectProvider.GetData para obter o [System.IO.Stream] serializado, em seguida, desserializando os dados. Use IVisualizerObjectProvider.GetData quando o objeto não for serializável pelo .NET e não exigir serialização personalizada. Nesse caso, você também deve substituir o método VisualizerObjectSource.Serialize.

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

Provedor do Objeto

Origem do Objeto

ReplaceData

—ou—

ReplaceObject

CreateReplacementObject

Observe, novamente, que há duas APIs que o Provedor do Objeto pode usar. Os dados são enviados sempre do Provedor do Objeto para a Origem do Objeto como [System.IO.Stream], mas ReplaceData exige que você serialize o objeto em um [System.IO.Stream].

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

Usar um dos métodos de substituir cria um novo objeto de dados no lado a ser depurado 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 de transferência 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 do Objeto

Origem do Objeto

TransferData

—ou—

TransferObject

TransferData

Consulte também

Tarefas

Como escrever um visualizador

Instruções passo a passo: escrevendo um visualizador em C#

Instruções passo a passo: escrevendo um visualizador no Visual Basic

Instruções passo a passo: escrevendo um visualizador no Visual Basic

Conceitos

Considerações de segurança do visualizador