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

更新 : 2007 年 11 月

このトピックの内容は、次の製品に該当します。

Edition

Visual Basic

C#

C++

Web Developer

Express

トピック該当 トピック該当

マネージのみ

トピック該当

Standard

トピック該当 トピック該当

マネージのみ

トピック該当

Pro/Team

トピック該当 トピック該当

マネージのみ

トピック該当

表の凡例 :

トピック該当

対象

トピック該当なし

該当なし

トピックは該当しますが、コマンドは既定では非表示です

既定で非表示のコマンド

デバッガ ビジュアライザのアーキテクチャには、次の 2 つの部分があります。

  • デバッガ側 - Visual Studio デバッガ内で動作します。デバッガ側のコードは、ビジュアライザのユーザー インターフェイスを作成し、表示します。

  • デバッグ対象側 - Visual Studio がデバッグしているプロセス (デバッグ対象) 内で動作します。

ビジュアライザは、データ オブジェクトの内容を、意味のある理解しやすい形式で表示 (視覚化) できるようにするためのデバッガのコンポーネントです。データ オブジェクトの編集をサポートするビジュアライザもあります。カスタム ビジュアライザを作成すれば、独自のデータ型を処理できるようにデバッガを拡張することも可能です。

視覚化対象であるデータ オブジェクトは、デバッグ中のプロセス (デバッグ対象プロセス) 内に存在します。データを表示するユーザー インターフェイスは、Visual Studio デバッガ プロセス内で作成されます。

デバッガ プロセス

デバッグ対象プロセス

デバッガのユーザー インターフェイス (データヒント、ウォッチ ウィンドウ、クイック ウォッチ)

視覚化の対象となるデータ オブジェクト

デバッガのインターフェイス内でデータ オブジェクトを視覚化するには、2 つのプロセス間の通信を実現するためのコードを記述する必要があります。したがって、ビジュアライザのアーキテクチャは、デバッガ側コードとデバッグ対象側コードという、2 つの要素で構成されることになります。

デバッガ側コードでは、自身のユーザー インターフェイスが作成されます。このインターフェイスは、デバッガのインターフェイス (データヒント、ウォッチ ウィンドウ、またはクイック ウォッチ) から呼び出すことができます。ビジュアライザのインターフェイスは、DialogDebuggerVisualizer クラスおよび IDialogVisualizerService インターフェイスを使用して作成します。ビジュアライザのすべての API に共通することですが、DialogDebuggerVisualizer および IDialogVisualizerService は、Microsoft.VisualStudio.DebuggerVisualizers 名前空間に存在します。

デバッガ側

デバッグ対象側

DialogDebuggerVisualizer クラス

IDialogVisualizerService インターフェイス

データ オブジェクト

ユーザー インターフェイスは、視覚化の対象となるデータを、デバッガ側に存在するオブジェクト プロバイダから取得します。

デバッガ側

デバッグ対象側

DialogDebuggerVisualizer クラス

IDialogVisualizerService インターフェイス

データ オブジェクト

オブジェクト プロバイダ (IVisualizerObjectProvider を実装)

デバッグ対象側には、対応するオブジェクトが存在します。これをオブジェクト ソースと呼びます。

デバッガ側

デバッグ対象側

DialogDebuggerVisualizer クラス

IDialogVisualizerService インターフェイス

データ オブジェクト

オブジェクト プロバイダ (IVisualizerObjectProvider を実装)

オブジェクト ソース (VisualizerObjectSource から派生)

オブジェクト プロバイダは、視覚化の対象となるオブジェクト データをビジュアライザの UI に提供します。オブジェクト プロバイダは、このオブジェクト データをオブジェクト ソースから取得します。オブジェクト プロバイダおよびオブジェクト ソースには、デバッガ側とデバッグ対象側との間でオブジェクト データをやり取りするための API が用意されています。

ビジュアライザはすべて、視覚化の対象となるデータ オブジェクトを取得する必要があります。次の表は、この目的で使用されるオブジェクト プロバイダの API と、それに対応するオブジェクト ソースの API を示しています。

オブジェクト プロバイダ

オブジェクト ソース

GetData

または

GetObject

GetData

オブジェクト プロバイダには、GetDataGetObject の 2 つの API が存在しています。どちらの API を使用しても、オブジェクト ソースの GetData が呼び出されます。VisualizerObjectSource.GetData を呼び出すと、視覚化の対象となるオブジェクトがシリアル化されて [System.IO.Stream] に格納されます。

IVisualizerObjectProvider.GetObject では、データがオブジェクト形式へと逆シリアル化されるため、このデータをそのまま DialogDebuggerVisualizer で作成した UI に表示できます。IVisualizerObjectProvider.GetData では、データが未加工の [System.IO.Stream] として格納されるため、これは別途、逆シリアル化する必要があります。IVisualizerObjectProvider.GetObject は、IVisualizerObjectProvider.GetData を呼び出し、シリアル化された [System.IO.Stream] を受け取り、そのデータを逆シリアル化することによって機能します。オブジェクトを .NET でシリアル化できないなど、カスタムのシリアル化が必要な場合は、IVisualizerObjectProvider.GetData を使用してください。そのような場合は、VisualizerObjectSource.Serialize メソッドをオーバーライドする必要があります。シリアル化できるオブジェクトの詳細については、「シリアル化」を参照してください。

読み取り専用のビジュアライザを作成する場合は、GetData または GetObject を使った一方向の通信で十分です。データ オブジェクトの編集をサポートするビジュアライザを作成する場合、それだけでは不十分です。オブジェクト プロバイダからオブジェクト ソースへと、データ オブジェクトを戻す機能が必要となります。次の表は、この目的で使用される、オブジェクト プロバイダとオブジェクト ソースの API を示しています。

オブジェクト プロバイダ

オブジェクト ソース

ReplaceData

または

ReplaceObject

CreateReplacementObject

ここでも、オブジェクト プロバイダには、使用できる API が 2 つ存在します。データは常に [System.IO.Stream] としてオブジェクト プロバイダからオブジェクト ソースへと送られますが、ReplaceData の場合は、別途、オブジェクトを [System.IO.Stream] にシリアル化する処理が必要となります。

ReplaceObject は、指定したオブジェクトを受け取り、それを [System.IO.Stream] にシリアル化した後、ReplaceData を呼び出して、[System.IO.Stream] を CreateReplacementObject に送ります。

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

オブジェクト プロバイダ

オブジェクト ソース

TransferData

または

TransferObject

TransferData

参照

処理手順

方法 : ビジュアライザを記述する

チュートリアル : C# でビジュアライザを記述する

チュートリアル : Visual Basic でビジュアライザを記述する

チュートリアル : Visual Basic でビジュアライザを記述する

概念

ビジュアライザのセキュリティに関する考慮事項

その他の技術情報

高度なビジュアライザの作成