Dziś będzie o tym atrybucie i co za jego pomocą możemy uczynić.
Często debuggujemy nasze aplikacje i często używamy możliwości 'podejrzenia' co dana zmienna zawiera. Niestety w przypadku bardziej skomplikowanych typów to co oferuje nam domyślnie VS nie jest wystarczające.
Weźmy dla przykłady bitmapy. To co mamy domyślnie wygląda mniej więcej tak:

Pełno danych, ale tak naprawdę, nie mówią one mam tego najważniejszego. Jak ta bitmapa wygląda. O ile lepiej nam by się żyło, gdybyśmy mogli (oczywiście nadal zachowując możliwość wyświetlenia wszystkich właściwości i zmiennych) zobaczyć taki obraz:

Wbrew pozorom nie jest to wcale takie trudne. Wszystko dzięki atrybutowi DebuggerVisualizer oraz klasie DialogDebuggerVisualizer. Ale po kolei:
Żeby stworzyć taki Visualizer, wystarczy, że utworzymy projekt typu ClassLibrary. A następnie dziedziczmy naszą klasę z DialogDebuggerVisualizer:
public class BitmapVisualizerDialog : DialogDebuggerVisualizer
{
}
Klasa ta jest abstrakcyjna i wymaga od nas napisania ciała dla metody Show. W niej robimy to co chcemy.
var item = objectProvider.GetObject();
var i = (Image) item;
var form = new CompareBitmapDialog {Image = i};
form.ShowDialog();
Gdzie CompareBitmapDialog to zwykła forma z PictureBox'em. Pominę to jak to zrobić. Myślę, że każdy będzie to potrafił.
Na koniec musimy powiedzieć jeszcze jakiego typu/-ów dotyczy ten Vizualizer. Robimy to, wspomnianym w tytule atrybutem, DebuggerVisualizer.
[assembly: DebuggerVisualizer( typeof(BitmapVisualizerDialog),
Target = typeof(Bitmap))]
[assembly: DebuggerVisualizer( typeof(BitmapVisualizerDialog),
Target = typeof(Image))]
W zasadzie już wszystko. Pozostał jeszcze deployment. Sprowadza się on do skopiowania naszego wynikowego pliku .dll do odpowiedniego folderu.
<VS Install Dir>\Common7\Packages\Debugger\Visualizers
lub
My Documents\Visual Studio\Visualizers
w zależności czy chcemy, aby dostęp mieli wszyscy czy tylko dany użytkownik. Po restarcie Visual Studio przy Bitmapach pojawi się mała lupka:

Klikając na nią uruchamiamy nasz Vizualizer.

0 komentarze:
Prześlij komentarz