Arquitetura de Visualizador
A arquitetura de um visualizador de depurador tem duas partes:
O lado do depurador executa com o depurador de Visual Studio.O código do debugger-side cria e exibe a interface do usuário para seu visualisador.
O debuggee side é executado dentro do processo de depuração de Visual Studio (o debuggee).
Um visualizer é um componente do depurador que permite que o depurador exibir (Visualizar) o conteúdo de um objeto de dados em um formulário significativo e compreensível.Alguns visualizadores oferecem suporte a edição do objeto de dados também.Escrevendo visualizadores personalizados, você pode estender o depurador para lidar com seus próprios tipos de dados personalizados.
O objeto de dados para ser visualizado reside dentro do processo que você está depurando (o debuggee processo).A interface do usuário que irá exibir os dados é criada dentro do processo de depurador Visual Studio:
Processo de depurador |
Processo de depuração |
---|---|
O depurador de interface do usuário (DataTips, a janela Watch, QuickWatch) |
Objeto de dados para ser visualizado |
Para visualizar o objeto de dados dentro da interface do depurador, você precisa de código para a comunicação entre os dois processos.Conseqüentemente, a arquitetura do Visualizador consiste em duas partes: lado do depurador código e debuggee side código.
O código do debugger-side cria sua própria interface de usuário, que pode ser chamada da interface do depurador, como um DataTip, a janela Watch ou QuickWatch.A interface do visualizador é criada usando o DialogDebuggerVisualizer classe e o IDialogVisualizerService interface.Como todas as APIs Visualizer, DialogDebuggerVisualizer e IDialogVisualizerService são encontrados de Microsoft.VisualStudio.DebuggerVisualizers namespace.
Lado do depurador |
Lado a ser depurado |
---|---|
Classe DialogDebuggerVisualizer Interface IDialogVisualizerService |
Objeto de dados |
A interface do usuário obtém os dados para ser visualizado de um provedor de objeto, o que existe no lado do depurador:
Lado do depurador |
Lado a ser depurado |
---|---|
Classe DialogDebuggerVisualizer Interface IDialogVisualizerService |
Objeto de dados |
Objeto provedor (implementa IVisualizerObjectProvider) |
Há um objeto correspondente no debuggee side chamado objeto de fonte:
Lado do depurador |
Lado a ser depurado |
---|---|
Classe DialogDebuggerVisualizer Interface IDialogVisualizerService |
Objeto de dados |
Objeto provedor (implementa IVisualizerObjectProvider) |
Fonte de objeto (derivado de VisualizerObjectSource) |
O provedor de objeto fornece os dados do objeto a ser visualizado para o visualisador UI.O objeto provedor obtém os dados do objeto da fonte de objeto.O provedor de objeto e o objeto de origem fornecem APIs para comunicar dados de objeto entre o lado do depurador e o lado debugee.
Cada visualizador deve obter o objeto de dados para ser visualizado.A tabela a seguir mostra as APIs correspondentes o provedor de objeto e o objeto de fonte usam para essa finalidade:
Provedor de objeto |
Objeto de fonte |
---|---|
- ou - |
Observe que o provedor de objeto pode usar um GetData ou GetObject.Qualquer API resulta em uma chamada para GetData no objeto de fonte.Uma chamada para VisualizerObjectSource.GetData preenche uma [System.IO.Stream], que representa um formulário serializado do objeto que está sendo visualizado.
IVisualizerObjectProvider.GetObjectdesserializa os dados no formulário de objeto, você pode exibir na interface de usuário que você criar com DialogDebuggerVisualizer.IVisualizerObjectProvider.GetDataPreencha os dados como um bruto [System.IO.Stream], que devem desserializar sozinho.IVisualizerObjectProvider.GetObjectfunciona chamando IVisualizerObjectProvider.GetData para obter o serializado [System.IO.Stream], e desserializar os dados.Use IVisualizerObjectProvider.GetData quando o objeto não é serializável por.NET e requer serialização personalizada.Nesse caso, você também deve substituir o VisualizerObjectSource.Serialize método.
Se você estiver criando um visualizador somente leitura, a comunicação unidirecional com GetData ou GetObject é suficiente.Se você estiver criando um visualizador suporta edição de objetos de dados, você deve fazer mais.Você deve ser capaz de enviar um objeto de dados do provedor de objeto para o objeto de fonte também.A tabela a seguir mostra o objeto provedor e APIs de origem do objeto usado para essa finalidade:
Provedor de objeto |
Objeto de fonte |
---|---|
- ou - |
Novamente, observe que há duas APIs que pode usar o provedor de objeto.Dados sempre são enviados do provedor de objeto para o objeto de fonte como um [System.IO.Stream], mas ReplaceData requer que você serializar o objeto em um [System.IO.Stream] você mesmo.
ReplaceObjectObtém um objeto que você fornecer, serializa-lo em um [System.IO.Stream], chama ReplaceData para enviar o [System.IO.Stream] para CreateReplacementObject.
Usando um dos métodos substituir cria um novo objeto de dados no debuggee que substitui o objeto sendo visualizado.Se você quiser alterar o conteúdo do objeto original sem substituí-la, use um dos métodos de transferência mostrados na tabela a seguir.Essas APIs transferir dados em ambas as direções ao mesmo tempo, sem substituir o objeto que está sendo visualizado:
Provedor de objeto |
Objeto de fonte |
---|---|
- ou - |
Consulte também
Tarefas
Passo a passo: Writing a Visualizer em C#
Passo a passo: Writing a Visualizer em Visual Basic
Passo a passo: Writing a Visualizer em Visual Basic