デバッガー ビジュアライザーのアーキテクチャには、次の 2 つの部分があります。
デバッガー側は、Visual Studio デバッガー内で実行されます。 デバッガー側のコードは、ビジュアライザーのユーザー インターフェイスを作成して表示します。
デバッグ対象側は、Visual Studio がデバッグしているプロセス (デバッグ対象) 内で実行されます。
ビジュアライザーは、デバッガーがデータ オブジェクトの内容をわかりやすい形式で表示 (視覚化) できるようにするデバッガー コンポーネントです。 一部のビジュアライザーでは、データ オブジェクトの編集もサポートされています。 カスタム ビジュアライザーを記述することで、独自のカスタム データ型を処理するようにデバッガーを拡張できます。
視覚化するデータ オブジェクトは、デバッグ中のプロセス ( デバッグ対象 プロセス) 内に存在します。 データを表示するユーザー インターフェイスは、Visual Studio デバッガー プロセス内に作成されます。
| デバッガー プロセス | デバッグ対象プロセス |
|---|---|
| デバッガーのユーザー インターフェイス (DataTips、ウォッチ ウィンドウ、クイック ウォッチ) | 視覚化するデータ オブジェクト |
デバッガー インターフェイス内でデータ オブジェクトを視覚化するには、2 つのプロセス間で通信するコードが必要です。 したがって、ビジュアライザー アーキテクチャは、 デバッガー側 コードと デバッグ対象側 コードの 2 つの部分で構成されます。
デバッガー側のコードは、独自のユーザー インターフェイスを作成します。これは、データヒント、ウォッチ ウィンドウ、クイック ウォッチなどのデバッガー インターフェイスから呼び出すことができます。 ビジュアライザー インターフェイスは、 DialogDebuggerVisualizer クラスと IDialogVisualizerService インターフェイスを使用して作成されます。 すべてのビジュアライザー API と同様に、DialogDebuggerVisualizer と IDialogVisualizerService は Microsoft.VisualStudio.DebuggerVisualizers 名前空間にあります。
| デバッガー側 | デバッグ対象側 |
|---|---|
| DialogDebuggerVisualizer クラス IDialogVisualizerService インターフェイス |
データ オブジェクト |
ユーザー インターフェイスは、デバッガー側に存在するオブジェクト プロバイダーから視覚化されるデータを取得します。
| デバッガー側 | デバッグ対象側 |
|---|---|
| DialogDebuggerVisualizer クラス IDialogVisualizerService インターフェイス |
データ オブジェクト |
| オブジェクト プロバイダー ( IVisualizerObjectProviderを実装) |
デバッグ対象側には、オブジェクト ソースと呼ばれる対応するオブジェクトがあります。
| デバッガー側 | デバッグ対象側 |
|---|---|
| DialogDebuggerVisualizer クラス IDialogVisualizerService インターフェイス |
データ オブジェクト |
| オブジェクト プロバイダー ( IVisualizerObjectProviderを実装) | オブジェクト ソース ( VisualizerObjectSource から派生) |
オブジェクト プロバイダーは、ビジュアライザー UI に視覚化されるオブジェクト データを提供します。 オブジェクト プロバイダーは、オブジェクト ソースからオブジェクト データを取得します。 オブジェクト プロバイダーとオブジェクト ソースは、デバッガー側とデバッグ対象側の間でオブジェクト データを通信するための API を提供します。
すべてのビジュアライザーは、視覚化するデータ オブジェクトを取得する必要があります。 次の表は、オブジェクト プロバイダーとオブジェクト ソースがこの目的で使用する対応する API を示しています。
| オブジェクト プロバイダー | オブジェクト ソース |
|---|---|
| GetData または GetObject |
GetData |
オブジェクト プロバイダーは、 GetData または GetObjectを使用できることに注意してください。 どちらの API でも、オブジェクト ソースで GetData が呼び出されます。 Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetDataの呼び出しにより、視覚化されているオブジェクトのシリアル化された形式を表すSystem.IO.Streamに記入されます。
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject では、データがオブジェクト フォームに逆シリアル化され、 DialogDebuggerVisualizerで作成した UI に表示できるようになります。
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData は生の Streamとしてデータを入力します。これは、自分で逆シリアル化する必要があります。
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject は、 Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData を呼び出してシリアル化された Streamを取得し、データを逆シリアル化することで機能します。 オブジェクトが .NET によってシリアル化できず、カスタム シリアル化が必要な場合は、 Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData を使用します。 その場合は、 Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.Serialize メソッドもオーバーライドする必要があります。
読み取り専用ビジュアライザーを作成する場合は、 GetData または GetObject との一方向の通信で十分です。 データ オブジェクトの編集をサポートするビジュアライザーを作成する場合は、さらに多くのことを行う必要があります。 オブジェクト プロバイダーからオブジェクト ソースにもデータ オブジェクトを送信できる必要があります。 次の表に、この目的で使用されるオブジェクト プロバイダー API とオブジェクト ソース API を示します。
| オブジェクト プロバイダー | オブジェクト ソース |
|---|---|
| ReplaceData または ReplaceObject |
CreateReplacementObject |
ここでも、オブジェクト プロバイダーが使用できる 2 つの API があることに注意してください。 データは常にオブジェクト プロバイダーからオブジェクト ソースに Streamとして送信されますが、 ReplaceData はオブジェクトを自分で Stream にシリアル化する必要があります。
ReplaceObject は、指定したオブジェクトを受け取り、それを Streamにシリアル化してから、 ReplaceData を呼び出して Stream を CreateReplacementObjectに送信します。
Replace メソッドのいずれかを使用すると、視覚化対象のオブジェクトを置き換える新しいデータ オブジェクトがデバッグ対象に作成されます。 元のオブジェクトの内容を置き換えずに変更する場合は、次の表に示す Transfer メソッドのいずれかを使用します。 これらの API は、視覚化されているオブジェクトを置き換えることなく、両方向に同時にデータを転送します。
| オブジェクト プロバイダー | オブジェクト ソース |
|---|---|
| TransferData または TransferObject |
TransferData |