Partilhar via


Arquitetura do visualizador

A arquitetura de um visualizador para depurador consiste em duas partes:

  • O lado do depurador é executado dentro do depurador do Visual Studio. O código do lado do depurador cria e exibe a interface de utilizador para o visualizador.

  • A parte do debuggee é executada dentro do processo que o Visual Studio está a depurar (o debuggee).

    Um visualizador é um componente do depurador que permite que o depurador exiba (visualize) o conteúdo de um objeto de dados de forma significativa e compreensível. Alguns visualizadores também suportam a 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 dentro do processo que você está depurando (o processo de depuração ). A interface do usuário que exibirá os dados é criada dentro do processo do depurador do Visual Studio:

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

Para visualizar o objeto de dados na 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 do lado do depurador e código do lado do depurador .

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 DataTip, Watch Window ou QuickWatch. A interface do visualizador é criada usando a DialogDebuggerVisualizer classe e a IDialogVisualizerService interface. Como todas as APIs do Visualizer, DialogDebuggerVisualizer e IDialogVisualizerService são encontrados no Microsoft.VisualStudio.DebuggerVisualizers namespace.

Lado do depurador Lado Debuggee
DialogDebuggerVisualizer Classe

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 do Debuggeado
DialogDebuggerVisualizer Classe

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

Há um objeto correspondente no lado do depurador chamado Object Source:

Lado do depurador Lado Debuggee
DialogDebuggerVisualizer Classe

IDialogVisualizerService Interface
Objeto de Dados
Provedor de objetos (implementa IVisualizerObjectProvider) Fonte do objeto (derivada de VisualizerObjectSource)

O Provedor de Objetos fornece os dados do objeto que devem ser visualizados para a interface do usuário do visualizador. O Provedor de Objeto obtém os dados do objeto da Fonte do Objeto. O Provedor de Objetos e a Fonte de Objetos fornecem APIs para comunicar dados de objetos 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 de Objeto e a Fonte do Objeto usam para essa finalidade:

Provedor de objetos Origem do objeto
GetData

—ou—

GetObject
GetData

Observe que o provedor de objetos pode usar um GetData ou GetObject. Qualquer API resulta em uma chamada para GetData no Object Source. Uma chamada para Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData preenche um System.IO.Stream, que representa a forma serializada do objeto a ser visualizado.

Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject desserializa os dados de volta para a forma de objeto, que pode ser exibida na interface de utilizador criada com DialogDebuggerVisualizer. Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData preenche os dados como um raw Stream, que você mesmo deve desserializar. Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject funciona chamando Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData para obter o Stream serializado e, em seguida, desserializando os dados. Use Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData quando o objeto não é serializável pelo .NET e requer serialização personalizada. Nesse caso, você também deve substituir o Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.Serialize método.

Se estiver a criar um visualizador somente leitura, a comunicação num só sentido com GetData ou GetObject é suficiente. Se você estiver criando um visualizador que ofereça 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 do Objeto também. A tabela a seguir mostra as APIs do Provedor de Objetos e da Fonte de Objeto usadas para essa 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 são sempre enviados do Provedor de Objetos para a Fonte de Objetos como um Stream, mas ReplaceData requer que o objeto seja serializado por você em um Stream.

ReplaceObject pega um objeto que você fornece, serializa-o em um Streame, 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 desejar 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