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 フォームウィンドウをさらにカスタマイズすることで、デフォルトのデバッガでは表示することができない情報を好きなように表示させることができます
コメントを残す
コメントを投稿するにはログインしてください。