Navigatie

Contact

Send mail to the author(s) E-mail

View Richard Soeteman's profile on LinkedIn

RSS 2.0 | Atom 1.0 | CDF

Archief

Categorieën

Blogroll

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

Sign In

Zoeken

# Sunday, 03 August 2008
Sunday, 03 August 2008 08:27:53 (GMT Daylight Time, UTC+01:00) ( Visual Studio )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

We kennen allemaal de kracht van een debug visualizer, even snel de data van een dataset bekijken, selecteer de juiste visualizer in Visual Studio en een mooi debugger dialog window wordt getoond met daarin je complete datastructuur en data. Het maken van een debugger visualizer is ook redelijk simpel. Voor wie dat nog nooit heeft gedaan raad ik aan deze video eens te bekijken.

Het nadeel van deze video en andere tutorials die over dit onderwerp gaan is dat ze altijd een serializable object gebruiken. Nu zijn je eigen objecten vaak wel serializable, maar er zijn ook heel veel objecten niet serializable en soms wil je daar echt een visualizer voor hebben. Probeer je deze objecten toch te gebruiken krijg je de volgende foutmelding te zien.

NonSerializableErrorMessage 

Een aantal maanden geleden werkte ik op een project waar intensief gebruik werd gemaakt van querystring- en formulierdata en wilde hiervoor een Visualizer maken. Ik werd direct geconfronteerd met bovenstaande foutmelding en besloot wat dieper in de materie te duiken. Middels onderstaand code voorbeeld zal ik uitleggen wat er gebeurd.

   1:  using System.Diagnostics;
   2:  using System.Web.UI;
   3:  using Microsoft.VisualStudio.DebuggerVisualizers;
   4:   
   5:  [assembly: DebuggerVisualizer(typeof(PageErrorVisualizer.PageErrorVisualizer), typeof(VisualizerObjectSource), Target = typeof(Page), Description = "PageErrorVisualizer Visualizer")]
   6:  namespace PageErrorVisualizer
   7:  {
   8:      /// <summary>
   9:      /// The Visualizer for type System.Web.UI.Page
  10:      /// </summary>
  11:      public class PageErrorVisualizer : DialogDebuggerVisualizer
  12:      {
  13:          /// <summary>
  14:          /// Shows the object in the visualizer form
  15:          /// </summary>
  16:          protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
  17:          {
  18:              Page page = (Page)objectProvider.GetObject();
  19:   
  20:              //Initialize the Visualizer Form and Show the data
  21:              using (VisualizerForm frm = new VisualizerForm())
  22:              {
  23:                  frm.ShowVisualizer(pageData);
  24:              }
  25:          }
  26:      }
  27:  }

Wanneer je een debug visualizer maakt zal je in het Assembly attribuut moeten aangeven dat we een DebuggerVisualizer aan het maken zijn en verwacht de volgende gegevens:

  • Het object type van de Visualizer die we gaan gebruiken
  • Het object type van de VisualizerObjectSource die we willen gebruiken
  • Het object type waar we een visualizer voor willen maken
  • De omschrijving die in Visual studio wordt getoond wannneer we de visualizer selecteren

Het VisualizerObjectSource object dat standaard in visual studio zit bleek de boosdoener. In het standaard  VisualizerObjectSource object wordt er vanuit gegaan dat een object serializable is, wat dus niet altijd het geval is en daarmee de oorzaak van bovenstaande foutmelding. Nu kunnen we van deze klasse afleiden. Eén van de methoden die we kunnen overschrijven is de methode GetData. Getdata verwacht het object waar we een visualizer voor willen maken en de stream waar de data ingeplaatst mag worden.

Onderstaand voorbeeld toont een versimpelde vorm van  de klasse die ik gebruikt heb. In GetData cast ik het target object naar een page object en creëer ik een instantie van PageData object. Het PageData object is een eigen gemaakt serializable object dat de benodigde waarden kan vasthouden.  Hier kan ik vervolgens de benodigde data op plaatsen.  Uiteindelijk vervang ik het Page object in target door mijn eigen PageData object en de base functionaliteit zorgt ervoor dat het PageData object netjes serialized wordt en in de visualizer gebruikt kan worden.

   1:  using System.Data;
   2:  using System.Web;
   3:  using Microsoft.VisualStudio.DebuggerVisualizers;
   4:   
   5:  namespace WebVisualizers.ObjectSource
   6:  {
   7:      /// <summary>
   8:      /// Specialized ObjectSource for System.Web.UI.Page
   9:      /// </summary>
  10:      /// <remarks>
  11:      /// This class is needed because the System.Web.UI.Page is not serializable and IVisualizerObjectProvider expects it to be serializable
  12:      /// In the GetData Method System.Web.UI.Page will be turned into something that is Serializable
  13:      /// </remarks>
  14:      public class WebPageObjectSource : VisualizerObjectSource
  15:      {
  16:          /// <summary>
  17:          /// Takes a Page object get Data from it and store it into PageData
  18:          /// Replace the target object wit PageData and call the base functionality
  19:          /// </summary>
  20:          /// <param name="target">System.Web.UI.Page</param>
  21:          /// <param name="outgoingData">Output stream (PageData)</param>
  22:          public override void GetData(object target, System.IO.Stream outgoingData)
  23:          {
  24:              if (target != null)
  25:              {
  26:                  Page page = (Page)target; ;
  27:                  PageData pageData = new PageData();
  28:                  //Fill Pagedata based on page object
  29:                  //example pageData.Add(page.Session)
  30:   
  31:                  //Replace target with PageData object
  32:                  target = pageData;
  33:              }
  34:              //Call Base functionality
  35:              base.GetData(target, outgoingData);
  36:          }
  37:      }
  38:  }

Op deze manier kunnen we dus voor elk gewenst object een Debug Visualizer maken, mits we in een eigen VisualizerObjectSource klasse ervoor zorgen dat het object in target vervangen wordt door een serializable object wat de benodigde data vasthoudt.  De code die ik in deze blogpost heb gebruikt, maakt deel uit van het WebVisualizer project wat ik enige tijd geleden op codeplex heb geplaatst. De volledige source code van dit project is hier te downloaden.

Comments [0] | | # 
# Thursday, 27 July 2006
Thursday, 27 July 2006 11:27:47 (GMT Daylight Time, UTC+01:00) ( Visual Studio )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Op deze site word je uitgelegd hoe je in Visual studio kan googelen op geselecteerde tekst. Je kan niet alleen zoeken in je source window maar ook in je output windows. Google wordt gestart als een nieuw tabblad binnen visual studio.

De macro werkt in Visual Studio 2003 en 2005

Comments [0] | | # 
# Friday, 07 July 2006
Friday, 07 July 2006 12:10:59 (GMT Daylight Time, UTC+01:00) ( Visual Studio )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Wanneer je normaliter een webservice project toevoegt aan je solution wordt deze automatisch meegestart wanneer je je windows applicatie start. Van de week had ik te maken met een webservice die niet automatisch wilde starten en mocht ik deze handmatig gaan starten. Waarom de webservice niet automatisch startte was me onduidelijk. Achteraf bleek dit te komen doordat de webservice was ontwikkeld met gebruik van het web application project. Het web application project wordt behandeld als een windows applicatie i.p.v. website en daardoor wordt de webservice niet automatisch gestart. Inmiddels had ik al een work arround gevonden. Op je solution properties kan je aangeven dat je meerdere projecten wilt starten. Ook kan je de volgorde instellen. In onderstaande afbeelding heb ik mijn webservice en windows project opgegeven. Ik laat de webservice als eerste starten omdat ik op deze manier zeker weet dat deze gestart is voordat mijn applicatie hem gaat consumeren en hierdoor een foutmelding geeft.

Nu wordt zowel de webservice als de windows applicatie gestart. Het vervelende is alleen dat de webservice tijdens het starten een browser scherm opent. Dit is op te lossen door de project properties van de webservice te openen. In het onderdeel web kan je een start action opgeven. Zet deze op "Don't open a page. Wait for a request from an external application".

Comments [0] | | # 
# Monday, 29 May 2006
Monday, 29 May 2006 13:04:27 (GMT Daylight Time, UTC+01:00) ( Visual Studio )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Zoals ik in een eerdere post al eens heb aangegeven staat Option Strict standaard uit in VB.Net. Dit is echter een optie die je altijd aan wil zetten. In VS2005 is dit aan te passen. Volg hiervoor de volgende stappen:

- Selecteer Tools
- Selecteer Options
- Selecteer "Show all settings"
- Klap het menu "Projects and Solutions" uit

Onder VB Defaults kan je de standaard instellingen aanpassen.

Comments [0] | | #