Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 do depurador cria e exibe a interface de usuário para o seu visualizador.
O lado de depuração é executado dentro do processo em que o Visual Studio está depurando (o depurador).
Um visualizador é um componente de depurador que permite que o depurador exiba (visualizar) o conteúdo de um objeto de dados de forma significativa e compreensível. Alguns visualizadores também dão suporte à 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 no processo que você está depurando (o processo de depuração ). A interface do usuário que exibirá os dados é criada no processo do depurador do Visual Studio:
| Processo do depurador | Processo de depuração |
|---|---|
| Interface do usuário do depurador (DataTips, Watch Window, QuickWatch) | Objeto de dados a ser visualizado |
Para visualizar o objeto de dados dentro da 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 lado do depurador e código lado do programa testado.
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 um DataTip, a Watch Window ou QuickWatch. A interface do visualizador é criada usando a DialogDebuggerVisualizer classe e a IDialogVisualizerService interface. Assim como todas as APIs do Visualizador, DialogDebuggerVisualizer e IDialogVisualizerService são encontrados no Microsoft.VisualStudio.DebuggerVisualizers namespace.
| Lado do depurador | Lado de depuração |
|---|---|
| Classe DialogDebuggerVisualizer 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 de depuração |
|---|---|
| Classe DialogDebuggerVisualizer IDialogVisualizerService Interface |
Objeto de Dados |
| Provedor de Objetos (implementa IVisualizerObjectProvider) |
Há um objeto correspondente no lado do depurador chamado Fonte do Objeto:
| Lado do Depurador | Lado de depuração |
|---|---|
| Classe DialogDebuggerVisualizer IDialogVisualizerService Interface |
Objeto de Dados |
| Provedor de Objetos (implementa IVisualizerObjectProvider) | Origem do objeto (derivada de VisualizerObjectSource) |
O Provedor de Objetos fornece os dados de objeto que devem ser visualizados para a interface do usuário do visualizador. O Provedor de Objetos obtém os dados do objeto da origem do objeto. O Provedor de Objetos e a Fonte de Objeto fornecem APIs para comunicar dados de objeto entre o lado do depurador e o lado de depuração.
Cada visualizador deve fazer com que o objeto de dados seja visualizado. A tabela a seguir mostra as APIs correspondentes que o Provedor de Objetos e a Origem do Objeto usam para esta finalidade:
| Provedor de Objetos | Origem do objeto |
|---|---|
| GetData — ou— GetObject |
GetData |
Observe que o provedor de objetos pode usar um GetData ou GetObject. Qualquer uma das APIs resulta em uma chamada para GetData na Origem do Objeto. Uma chamada para Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData preenche uma System.IO.Stream, que representa uma forma serializada do objeto que está sendo visualizado.
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject desserializa os dados de volta para a forma de objeto, que você pode então exibir na interface de usuário criada com DialogDebuggerVisualizer.
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData preenche os dados como dados brutos Stream, que você deve desserializar por conta própria.
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject funciona chamando Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData para obter a versão serializada de Stream, e desserializando os dados. Use Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData quando o objeto não for serializável por .NET e precisar de 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 é suficiente. Se você estiver criando um visualizador que dê 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 de Objeto também. A tabela a seguir mostra as APIs de Origem do Objeto e do Provedor de Objetos usadas para esta 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 sempre são enviados do Provedor de Objetos para a Fonte de Objeto como um Stream, mas ReplaceData exige que você serialize o próprio objeto em um Stream.
ReplaceObject usa um objeto que você fornece, serializa-o em um Stream, e, 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 você quiser 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 |