次の方法で共有


ビジュアライザーのアーキテクチャ

デバッガー ビジュアライザーのアーキテクチャには、次の 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 を呼び出して StreamCreateReplacementObjectに送信します。

Replace メソッドのいずれかを使用すると、視覚化対象のオブジェクトを置き換える新しいデータ オブジェクトがデバッグ対象に作成されます。 元のオブジェクトの内容を置き換えずに変更する場合は、次の表に示す Transfer メソッドのいずれかを使用します。 これらの API は、視覚化されているオブジェクトを置き換えることなく、両方向に同時にデータを転送します。

オブジェクト プロバイダー オブジェクト ソース
TransferData

または

TransferObject
TransferData