Condividi tramite


Architettura del visualizzatore

L'architettura di un visualizzatore di debugger ha due parti:

  • Il componente debugger funziona all'interno del debugger di Visual Studio. Il codice lato debugger crea e visualizza l'interfaccia utente per il visualizzatore.

  • Il lato del debuggee viene eseguito all'interno del processo di Visual Studio che sta eseguendo il debug (debuggee).

    Un visualizzatore è un componente del debugger che consente al debugger di visualizzare (visualizzare) il contenuto di un oggetto dati in un formato significativo e comprensibile. Alcuni visualizzatori supportano anche la modifica dell'oggetto dati. Scrivendo visualizzatori personalizzati, è possibile estendere il debugger per gestire i propri tipi di dati personalizzati.

    L'oggetto dati da visualizzare risiede all'interno del processo di cui si sta eseguendo il debug (processo di debug ). L'interfaccia utente che visualizzerà i dati viene creata all'interno del processo del debugger di Visual Studio:

Processo del debugger Processo di debug
Interfaccia utente del debugger (Suggerimenti, Finestra di controllo, Controllo rapido) Oggetto dati da visualizzare

Per visualizzare l'oggetto dati all'interno dell'interfaccia del debugger, è necessario il codice per comunicare tra i due processi. Di conseguenza, l'architettura del visualizzatore è costituita da due parti: codice lato del debugger e codice lato del debuggee.

Il codice lato debugger crea una propria interfaccia utente, che può essere richiamata dall'interfaccia del debugger, ad esempio un DataTip, la finestra delle espressioni da controllare o il QuickWatch. L'interfaccia del visualizzatore viene creata usando la DialogDebuggerVisualizer classe e l'interfaccia IDialogVisualizerService . Come tutte le API del visualizzatore, DialogDebuggerVisualizer e IDialogVisualizerService si trovano nel Microsoft.VisualStudio.DebuggerVisualizers spazio dei nomi.

Sezione Debugger Lato del programma in debug
Classe DialogDebuggerVisualizer

Interfaccia IDialogVisualizerService
Oggetto Data

L'interfaccia utente ottiene i dati da visualizzare da un provider di oggetti, esistente sul lato debugger:

Interfaccia del debugger Lato del Debuggee
Classe DialogDebuggerVisualizer

Interfaccia IDialogVisualizerService
Oggetto Data
Provider di oggetti (implementa IVisualizerObjectProvider)

Sul lato del programma in fase di debug, è presente un oggetto corrispondente denominato Origine dell'oggetto:

Interfaccia del debugger Lato del Debuggee
Classe DialogDebuggerVisualizer

Interfaccia IDialogVisualizerService
Oggetto Data
Provider di oggetti (implementa IVisualizerObjectProvider) Origine dell'oggetto (derivata da VisualizerObjectSource)

Il provider di oggetti fornisce i dati oggetto da visualizzare nell'interfaccia utente del visualizzatore. Il provider di oggetti ottiene i dati dell'oggetto dall'Origine dell'oggetto. Il provider di oggetti e la sorgente oggetto forniscono API per comunicare i dati degli oggetti tra la parte del debugger e la parte del debuggee.

Ogni visualizzatore deve ottenere l'oggetto dati da visualizzare. La tabella seguente illustra le API corrispondenti usate dal provider di oggetti e dall'origine oggetto per questo scopo:

Provider di oggetti Sorgente dell'oggetto
GetData

— o —

GetObject
GetData

Si noti che il provider di oggetti può usare GetData o GetObject. Entrambe le API generano una chiamata a GetData sulla sorgente oggetto. Una chiamata a Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData riempie un System.IO.Stream oggetto, che rappresenta una forma serializzata dell'oggetto visualizzato.

Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject deserializza i dati in formato oggetto, che è quindi possibile visualizzare nell'interfaccia utente creata con DialogDebuggerVisualizer. Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData inserisce i dati come dati grezzi Stream, che devi deserializzare manualmente. Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject funziona chiamando Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData per ottenere il serializzato Stream, quindi deserializzando i dati. Usare Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData quando l'oggetto non è serializzabile da .NET e richiede la serializzazione personalizzata. In tal caso, è anche necessario eseguire l'override del Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.Serialize metodo .

Se si sta creando un visualizzatore di sola lettura, la comunicazione unidirezionale con GetData o GetObject è sufficiente. Se si sta creando un visualizzatore che supporta la modifica di oggetti dati, è necessario eseguire altre operazioni. È necessario essere anche in grado di inviare nuovamente un oggetto dati dal provider di oggetti all'origine oggetto. La tabella seguente illustra le API Object Provider e Object Source usate per questo scopo:

Provider di oggetti Sorgente dell'oggetto
ReplaceData

— o —

ReplaceObject
CreateReplacementObject

Si noti ancora una volta che sono disponibili due API che il provider di oggetti può usare. I dati vengono sempre inviati dal provider di oggetti all'origine degli oggetti come Stream, ma ReplaceData è necessario serializzare l'oggetto in un Stream autonomamente.

ReplaceObject accetta un oggetto fornito, lo serializza in un Streamoggetto , quindi chiama ReplaceData per inviare l'oggetto Stream a CreateReplacementObject.

L'utilizzo di uno dei metodi Replace crea un nuovo oggetto dati nell'oggetto di debug che sostituisce l'oggetto visualizzato. Se si desidera modificare il contenuto dell'oggetto originale senza sostituirlo, utilizzare uno dei metodi Transfer illustrati nella tabella seguente. Queste API trasferiscono i dati in entrambe le direzioni contemporaneamente, senza sostituire l'oggetto visualizzato:

Provider di oggetti Sorgente dell'oggetto
TransferData

— o —

TransferObject
TransferData