読者です 読者をやめる 読者になる 読者になる

Debugger Visualizerを自作する

Visual Studio では、ブレークポイントで止めた時に以下の図のように変数の中身を視覚的に見ることができます。

ここで見られるのは普通は数値や文字列ぐらいに限られます。しかし例えばUriクラスならば、そのUriの示す先のWebページが見られたりしたら、(実用性は置いといて)結構面白いと思います。そのような独自の視覚化機能(Debugger Visualizer)をクラスごとにそれぞれ自作することができます。

対象とするクラスは既存のもの・自分で定義したもの問わず可能ですが、SerializableAttributeがマークされているか、若しくはMarshalByRefObjectクラスを継承している必要があります。この条件を満たさないクラスに対してDebugger Visualizerを作る方法については、後日書く予定です。

1. プロジェクトの作成

Debugger Visualizerの自作はVisual Studio 2005以降で対応しています。

クラス ライブラリ としてプロジェクトを新規作成します。名前は適当に MyDebuggerVisualizers とでもしておきます。

2. 参照設定

Microsoft.VisualStudio.DebuggerVisualizers を参照に追加します。

3. ビューアの作成

Uriの示すWebページを表示するためのフォームを作成します。Windowsフォームを追加し、その上にWebBrowserコントロールを貼り付けます。手抜き実装のため、プロパティのModifiersをPublicにしておきます。

4. UriDebuggerVisualizer クラス

UriDebuggerVisualizer というクラスを作ります。DialogDebuggerVisualizerを継承させます。こんな感じで。

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.VisualStudio.DebuggerVisualizers;

namespace MyDebuggerVisualizers
{
    public class UriDebuggerVisualizer : DialogDebuggerVisualizer
    {
        protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            // 対象のURI
            Uri uri = (Uri)objectProvider.GetObject();

            // 表示するフォームを作成
            using (Form1 form = new Form1())
            {
                // WebBrowserで表示
                form.webBrowser1.Navigate(uri);

                // フォームの表示
                windowService.ShowDialog(form);
            }
        }
    }
}

このShowメソッドが、Debugger Visualizerでの視覚化の際に呼び出されます。詳細はこちらを参照。

5. Debugger VisualizerをVisual Studioで利用できるように通知する

AssemblyInfo.cs の一番下に以下の記述を追加します。対象となるクラス(Uri)と、そのDebuggerVisualizerを登録しています。

[assembly: System.Diagnostics.DebuggerVisualizer(
    typeof(MyDebuggerVisualizers.UriDebuggerVisualizer),
    Target = typeof(System.Uri),
    Description = "Uri Visualizer"
)]

6.DLLのコピー

この時点でビルドすると、成功すれば MyDebuggerVisualizers.dll が生成されます。これをC:\Program Files\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\Visualizersにコピーします(VS2008の場合。お手持ちのバージョンによって変わります)。

若しくは、マイドキュメントのVisual Studio 2008¥Visualizersにコピーしても良いです。 こちらは管理者権限が無くともユーザが自由に置けます。


もしこのDebugger Visualizerを変更した際は、それを適用させるには再びここにコピーしなければなりません。面倒なら、「ビルド イベント」の「ビルド後に実行するコマンド ライン」に、

copy "$(TargetPath)" "C:\Program Files\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\Visualizers"

のように書いておけば、ビルドの度に自動的にコピーされます。

7.テスト

これでおしまいです。適当にUriを使うようなプログラムを書いて、ブレークポイントに引っかけてみましょう。すると、以前まで無かった虫眼鏡のボタンができているはずです。そこから「Uri Visualizer」を選択します。

すると、先ほど作成したビューアが開き、無事Uriの示すGoogleのページが表示されます。