astel-labs.net

C#などのプログラミングTipsや雑記をつらつらと書くかもしれないブログです。

  • Home
RSS

DebuggerVisualizer アドインの作成

Posted on 2012年11月3日 by Nymphaea
No CommentsLeave a comment

VisualStudio 2012 が発売され開発環境が新しくなり DebuggerVisualizer を一新することになったので、ついでにネタとして作り方を書いてみます
DebuggerVisualizer とは、VisualStudio でデバッグをする際に変数やパラメータをポイントするとインテリセンスに表示される虫眼鏡マークから起動するウィンドウのことです
また、DebuggerVisualizer は VisualStudio 2005 以降から作成できるようです

 

DebuggerVisualizer はデバッグのステップ実行中にビットマップなどのイメージ形式や独自クラスの内容を GUI で視覚的に表示したい時などに威力を発揮します
ただし、DebuggerVisualizer で表示可能な形式は「SerializableAttribute」属性が定義されているか、もしくは「MarshalByRefObject」クラスを継承している必要があります
今回は DebuggerVisualizer を使って Bitmap 形式を表示してみます

 

DebuggerVisualizer はクラスライブラリとしてプロジェクトを作成します
今回は「BitmapVisualizer」という名前でプロジェクトを作成します
次に、参照の追加から「アセンブリ」‐「拡張」の「Microsoft.VisualStudio.DebuggerVisualizers」を選択してプロジェクトに追加します
また、Bitmap を扱うので、併せて「アセンブリ」‐「フレームワーク」の「System.Drawing」もプロジェクトに追加しておきます

 

続いて作成したプロジェクトに、「追加」‐「新しい項目」で「全般」にある「デバッガー ビジュアライザー」を選択し、「BitmapDebuggerVisualizer.cs」としてファイルを追加します
更に、「Windows フォーム」を「BitmapViewer.cs」としてファイルを追加します
デフォルトで追加されるコードを元に、以下のように書き換えます

○BitmapDebuggerVisualizer.cs

using System;
using System.Drawing;
using Microsoft.VisualStudio.DebuggerVisualizers;

[assembly: System.Diagnostics.DebuggerVisualizer(
    typeof( BitmapVisualizer.BitmapDebuggerVisualizer ),
    Target = typeof( System.Drawing.Bitmap ),
    Description = "BitmapVisualizer" )]
namespace BitmapVisualizer
{
    /// <summary>
    /// SomeType のビジュアライザーです。  
    /// </summary>
    public class BitmapDebuggerVisualizer : DialogDebuggerVisualizer
    {
        protected override void Show( IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider )
        {
            if( windowService == null )
                throw new ArgumentNullException( "windowService" );
            if( objectProvider == null )
                throw new ArgumentNullException( "objectProvider" );

            // TODO: ビジュアライザーを表示する目的のオブジェクトを取得します。
            //       objectProvider.GetObject() の結果を視覚化 
            //       されるオブジェクトの型にキャストします。
            using( var bmp = objectProvider.GetObject() as Bitmap ) {
                if( bmp == null ) {
                    throw new ArgumentException();
                }

                // TODO: オブジェクトのビューを表示します。
                //       displayForm をユーザー独自のカスタム フォームまたはコントロールで置き換えます。
                using( var bitmapViewer = new BitmapViewer( bmp ) ) {
                    windowService.ShowDialog( bitmapViewer );
                }
            }
        }

        /// <summary>
        /// デバッガーの外部にホストすることにより、ビジュアライザーをテストします。
        /// </summary>
        /// <param name="objectToVisualize">ビジュアライザーに表示するオブジェクトです。</param>
        public static void TestShowVisualizer( object objectToVisualize )
        {
            var visualizerHost = new VisualizerDevelopmentHost( objectToVisualize, typeof( BitmapDebuggerVisualizer ) );
            visualizerHost.ShowVisualizer();
        }
    }
}

○BitmapViewer.cs

using System;
using System.Drawing;
using System.Windows.Forms;

namespace BitmapVisualizer
{
    public partial class BitmapViewer : Form
    {
        private Bitmap _bmp = null;

        public BitmapViewer( Bitmap bmp )
        {
            InitializeComponent();

            this._bmp = (Bitmap)bmp.Clone();
        }

        protected override void OnLoad( EventArgs e )
        {
            base.OnLoad( e );

            this.pictureBox1.Image = this._bmp;
        }
    }
}

 

上記の例では 「BitmapViewer.cs」のデザイナでフォーム上に「pictureBox1」という名前で「BictureBox」を貼り付けています
PictureBox は「Dock」プロパティを「Fill」設定しておくとよいかもしれません
作成したプロジェクトは以下のような構成になります

 

一応、サンプルコードで重要な個所を解説します
今回作成したサンプルコードは、デフォルトで作成されるテンプレートコードから修正している個所はほんの数行程度ですが、DebuggerVisualizer として VisualStudio に組み込む際には以下のコードが必須となります

[assembly: System.Diagnostics.DebuggerVisualizer(
    typeof( BitmapVisualizer.BitmapDebuggerVisualizer ),
    Target = typeof( System.Drawing.Bitmap ),
    Description = "BitmapVisualizer" )]

上記コードをビルドアクションがコンパイル対象になっているコード内に記載しなければ、VisualStudio が DebuggerVisualizer を認識しません
詳細は MSDN を参照してもらうとして、DebuggerVisualizer の第一引数には今回作成したクラスを指定し、Target パラメータにはデバッグ対象のクラス、Description プロパティには虫眼鏡マークをクリックしたときにメニューに表示させる名称を指定します

 

これで DebuggerVisualizer としての準備がすべて整いましたが、DebuggerVisualizer が正しく動作するかデバッグを行うため、テストプロジェクトを作成します
テストプロジェクトは「コンソールアプリケーション」で「TestConsole」という名前で作成します
プロジェクトを作成したら、参照から先に作成した「BitmapVisualizer」を追加します
この時、併せて「Microsoft.VisualStudio.DebuggerVisualizers」と「System.Drawing」も追加しておきます

○Program.cs

using System;
using System.Drawing;

namespace TestConsole
{
    class Program
    {
        [STAThread]
        static void Main( string[] args )
        {
            BitmapVisualizer.BitmapDebuggerVisualizer.TestShowVisualizer( new Bitmap( @"D:\sample.jpg" ) );
        }
    }
}

 

上記コードでは、テストの実行を行うメソッドはシングルスレッドアパートメントモデルで実行する必要があるため「STAThread」指定を追加しています
あとは Bitmap イメージを作成してパラメータとして渡すだけで、通常のアプリケーションと同じようにデバッグすることができます


実行すると、上記のようなウィンドウでイメージが表示されます
※イメージは pixiv よりお借りしてきました

 

最後に、VisualStudio に組み込むため以下のどちらかのフォルダに作成したアセンブリを配置します
○ C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Packages\Debugger\Visualizers\  (64bit 環境の場合)
○ ライブラリ\ドキュメント\Visual Studio 2012\Visualizers

上段の場所は配置に管理者権限が 必要ですが、下段の場所は管理者権限がなくても配置することができます
ただし、下段の場合はユーザーごとにアセンブリを配置する必要があります

 

アセンブリを配置したら、実際のデバッガでブレークしたときに Bitmap 型の変数に虫眼鏡マークが表示されることを確認します

上記の画像を見ると、通常ビジュアライザーが表示されない「System.Drawing.Bitmap」型の変数「bmp」に虫眼鏡マークが表示されていることがわかると思います
虫眼鏡マークのドロップダウンマークをクリックすると、コンテキストメニューで「BitmapVisualizer」が表示され、虫眼鏡マーク自体をクリックすると上記のウィンドウでイメージが表示されます

 

このように、非常に簡単に DebuggerVisualizer を作成できることがわかります
Windows フォームウィンドウをさらにカスタマイズすることで、デフォルトのデバッガでは表示することができない情報を好きなように表示させることができます

Categories: C#, プログラミング

 

WCF – ChannelFactory を利用したサービス呼び出し
WPF – SnippingTool っぽい物を作ってみた

コメントを残す

コメントを投稿するにはログインしてください。

  • 2012年11月
    日 月 火 水 木 金 土
     123
    45678910
    11121314151617
    18192021222324
    252627282930  
    « 7月   7月 »
  • 最近の投稿

    • raspberry pi に nginx をセットアップする
    • VSCode を日本語化する
    • raspberry pi に VSCode をインストールする
    • WindowsのプロダクトIDを取得する
    • SQL Server – money型とdecimal型を併用した金額計算
  • アーカイブ

    • 2020年3月
    • 2016年12月
    • 2014年6月
    • 2014年5月
    • 2013年7月
    • 2012年11月
    • 2012年7月
    • 2012年5月
    • 2012年4月
    • 2011年4月
    • 2011年1月
    • 2010年11月
    • 2010年10月
    • 2010年9月
    • 2010年8月
    • 2010年7月
    • 2010年6月
    • 2010年5月
    • 2010年4月
  • カテゴリー

    • C#
    • jQuery
    • OpenCV
    • raspberry pi
    • SharePoint
    • Silverlight
    • SQL Server
    • WCF
    • WPF
    • プログラミング
    • 未分類
    • 雑記
© astel-labs.net. Proudly Powered by WordPress | Nest Theme by YChong

このブログ内で公開されているソースコードおよびサンプルプログラムに関わるライセンスはすべて修正BSDライセンス(New BSD License)として公開しています。
但し、サンプルプログラムに含まれる外部アセンブリが同様のライセンスとは限りませんので、利用する前に必ずすべてのライセンスの確認を行ってください。