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 Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData preenche um System.IO.Stream, que representa um formato serializado do objeto que está sendo visualizado.

O Microsoft.VisualStudio.DebuggerVisualizers.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 Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData preenche os dados como Streambruto, que você deve desserializar. O Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject funciona chamando Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData para obter o Stream serializado, em seguida, desserializando os dados. Use Microsoft.VisualStudio.DebuggerVisualizers.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 Microsoft.VisualStudio.DebuggerVisualizers.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 Stream, mas ReplaceData exige que você serialize o objeto em um Stream.

O ReplaceObject usa o objeto que você fornece, serializa-o em um Stream e, em seguida, chama o ReplaceData para enviar o 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