Das Item Temlate Debugger Visualizers ist zwar nicht eine neue Funktionalität in Visual Studio 2008, jedoch habe ich diese erst jetzt in meiner IDE bemerkt.

shot3

Ansporn genug um ein kleines Beispiel zu machen.

Das erste mal das ich Visualizers gesehen habe, war ich auf der XML in Action 2002 und hatte dort Dr. Richard Grimes über die Schulter geschaut. Er schrieb gerade an einem C++ Buch (ich weiß wirklich nicht mehr welches) und hatte dort einen Abschnitt diesen Visualizern gewidmet.

Mein Beispiel visualisiert Grafiken, konkreter den Typen System.Drawing.Image. Standardmässig gibt es dafür eben keinen Visualisierer, wie hier am Screenshot zu sehen.

shot0

Das Template in Visual Studio 2008 Beta 2 ausgewählt und entsprechend den Code implementiert.

Hier die Implementierung meines Visualizers:

   1: using System;
   2: using System.Drawing;
   3: using Microsoft.VisualStudio.DebuggerVisualizers;
   4:  
   5: [assembly: System.Diagnostics.DebuggerVisualizer(
   6:     typeof( MyVisualizer.MyImageVisualizer ),
   7:     typeof( VisualizerObjectSource ),
   8:     Target = typeof( System.Drawing.Image ),
   9:     Description = "Simple Image Debugger Visualizer" )]
  10:  
  11: namespace MyVisualizer
  12: {
  13:     public class MyImageVisualizer : DialogDebuggerVisualizer
  14:     {
  15:         protected override void Show( 
  16:             IDialogVisualizerService windowService, 
  17:             IVisualizerObjectProvider objectProvider )
  18:         {
  19:             Image data = ( Image ) objectProvider.GetObject();
  20:  
  21:             using( DisplayImage control = new DisplayImage( data ) )
  22:             {
  23:                 windowService.ShowDialog( control );
  24:                 if( !control.CurrentImage.Equals(data) )
  25:                 {
  26:                     data = control.CurrentImage;
  27:                     objectProvider.ReplaceObject( data );
  28:                 }
  29:             }
  30:         }
  31:     }
  32: }

Ich benutze ein UserControl zum Darstellen des Bildes und dem FileDialog der ein Austauschen des Bildes während des Debuggens ermöglicht.

In der Testanwendung mit dem Console Client hat alles einwandfrei funktioniert. Als ich jedoch den Visualizer in mein Documents\Visual Studio 2008\Visualizers (unter Vista englisch) Verzeichnis kopiert habe, bekam ich eine Exception.

Das Item Template mit Visual Studio 2008 Beta 2 referenziert noch die 2005er Version von DialogDebuggerVisualizer, also im Assembly das mit 2005 herauskam. Die Referenz einfach auf die Version 9.0.x.x umgestellt und dann hat auch der Visualizer seinen Dienst in Visual Studio 2008 Beta 2 aufgenommen.

Hier ein Screenshot während des Debuggens, der zeigt das mein Visualizer für den Typen Image angezogen wurde.

shot1

Klickt man nun auf die Lupe wird mein UserControl instanziert und ich kann entsprechend sehen wie die Grafik aussieht und diese bei Bedarf austauschen.

shot2

Im Sourcecode ist die Zeile 27 für das Ersetzen der Daten zuständig.

Vielleicht hat jemand noch ein paar Ideen was man noch so alles visualisieren könnte.