Arquitetura de Visualizador
This topic applies to:
Edition |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
Managed only |
||||
Pro, Premium e Ultimate |
Managed only |
The architecture of a debugger visualizer has two parts:
The debugger side runs within the Visual Studio debugger. The debugger-side code creates and displays the user interface for your visualizer.
The debuggee side runs within the process Visual Studio is debugging (the debuggee).
Um visualizer é um componente do depurador que permite que o depurador exibir (Visualizar) o conteúdo de um objeto de dados de forma significativa, é 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 a 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 de Visual Studio:
O depurador de processo |
Processo de depuração |
---|---|
O depurador de interface do usuário (QuickWatch DataTips, a janela de inspeção) |
Objeto de dados a 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 visualisador consiste em duas partes: lado do depurador código e debuggee side código.
O código do lado do depurador cria sua própria interface de usuário, que pode ser chamada a partir da interface do depurador, como, por exemplo, 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 na Microsoft.VisualStudio.DebuggerVisualizers namespace.
Lado do depurador |
Lado a ser depurado |
---|---|
Classe de DialogDebuggerVisualizer Interface de 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 de DialogDebuggerVisualizer Interface de IDialogVisualizerService |
Objeto de dados |
Provedor de objeto (implementa IVisualizerObjectProvider) |
Há um objeto correspondente no lado do elemento a ser depurado chamado objeto de fonte:
Lado do depurador |
Lado a ser depurado |
---|---|
Classe de DialogDebuggerVisualizer Interface de IDialogVisualizerService |
Objeto de dados |
Provedor de objeto (implementa IVisualizerObjectProvider) |
Fonte de objeto (derivado de VisualizerObjectSource) |
O provedor de objeto fornece os dados do objeto que está a ser visualizado para o visualisador de interface do usuário. O provedor de objeto obtém os dados do objeto da fonte de objeto. O provedor de objeto e o objeto de origem fornecem APIs para se comunicar entre o lado do depurador e o lado de debugee de dados do objeto.
Cada visualisador deve obter o objeto de dados a 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 |
Origem de objeto |
---|---|
—or— |
Observe que o provedor de objeto pode usar um GetData ou GetObject. Qualquer API resulta em uma chamada para GetData na fonte de objeto. 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 de volta para o formulário de objeto, o que você pode exibir a interface do usuário que você criar com DialogDebuggerVisualizer. IVisualizerObjectProvider.GetDatapreenche os dados como um bruto [System.IO.Stream], que você mesmo deve desserializar. IVisualizerObjectProvider.GetObjectfunciona chamando IVisualizerObjectProvider.GetData para obter o serializado [System.IO.Stream], em seguida, ao desserializar dados. Use IVisualizerObjectProvider.GetData quando o objeto não é serializável por.NET e requer serialização personalizada. Nesse caso, você também deverá 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 que oferece suporte a edição de objetos de dados, você deve fazer mais. Você deve ser capaz de enviar um objeto de dados do provedor de objeto de volta 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 |
Origem de objeto |
---|---|
—or— |
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-la em um [System.IO.Stream], em seguida, chama ReplaceData para enviar o [System.IO.Stream] para CreateReplacementObject.
Usar um dos métodos de substituição cria um novo objeto de dados em que o depurado 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 |
Origem de objeto |
---|---|
—or— |
Consulte também
Tarefas
Demonstra Passo a passo: Writing a Visualizer em C#
Demonstra Passo a passo: Writing a Visualizer em Visual Basic
Demonstra Passo a passo: Writing a Visualizer em Visual Basic