<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://community.bartdesmet.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>B# .NET Blog : Visual Studio 2005</title><link>http://community.bartdesmet.net/blogs/bart/archive/tags/Visual+Studio+2005/default.aspx</link><description>Tags: Visual Studio 2005</description><dc:language>en</dc:language><generator>CommunityServer 2007 (Build: 20423.869)</generator><item><title>Writing custom Visual Studio 2005 Debugger Visualizers</title><link>http://community.bartdesmet.net/blogs/bart/archive/2007/04/04/writing-custom-visual-studio-2005-debugger-visualizers.aspx</link><pubDate>Wed, 04 Apr 2007 10:50:50 GMT</pubDate><guid isPermaLink="false">863c5522-913f-4a64-ac0a-bd5f05abad0f:12321</guid><dc:creator>bart</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.bartdesmet.net/blogs/bart/rsscomments.aspx?PostID=12321</wfw:commentRss><comments>http://community.bartdesmet.net/blogs/bart/archive/2007/04/04/writing-custom-visual-studio-2005-debugger-visualizers.aspx#comments</comments><description>&lt;p&gt;A little-known feature in Visual Studio 2005 is the possibility to create a custom debugger visualizer. In this post, we'll take a closer look at this feature. A debugger visualizer allows you to associate a custom control or Windows Form with an object type definition in order to visualize that particular type in a user-friendly fashion while debugging in Visual Studio 2005. Assume the following type definition:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:e9454d3e-9008-4dca-b17e-3fbbaa3ea389" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Bar
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; name;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; age;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; secret &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Foo&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Bar(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; name, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; age)
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.name &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; name;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.age &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; age;
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Name
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; name; }
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { name &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value; }
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Age
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; age; }
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { age &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value; }
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Secret
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; secret; }
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { secret &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value; }
        }
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Assume a simple application that does the following:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:745120ee-e8fe-4104-8b12-637c311984a2" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#999999;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;partial&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Form1 : Form
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Form1()
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;            InitializeComponent();
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; button1_Click(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; sender, EventArgs e)
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#999999;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Bar b &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Bar(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Bart De Smet&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;24&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#999999;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#999999;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Set a breakpoint on line 11 and execute the application using the debugger. Normally you'll see something like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bartdesmet.net/images/WritingcustomVisualStudio2005DebuggerVis_141A3/image07.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="160" src="http://www.bartdesmet.net/images/WritingcustomVisualStudio2005DebuggerVis_141A3/image0_thumb1.png" width="453" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Observe the zoom glass icon displayed next to the strings name and secret. If you click the arrow at the right of it, you see this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bartdesmet.net/images/WritingcustomVisualStudio2005DebuggerVis_141A3/image010.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="183" src="http://www.bartdesmet.net/images/WritingcustomVisualStudio2005DebuggerVis_141A3/image0_thumb2.png" width="454" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;These three, the "Text Visualizer", "XML Visualizer" and "HTML Visualizer", are so-called debugger visualizers. What we want to do, is to create such a visualizer for our Bar type. In order to do so, add a new item to the project and choose for the &lt;strong&gt;Debugger Visualizer template&lt;/strong&gt; type and call it BarVisualizer:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bartdesmet.net/images/WritingcustomVisualStudio2005DebuggerVis_141A3/image04.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="143" src="http://www.bartdesmet.net/images/WritingcustomVisualStudio2005DebuggerVis_141A3/image03.png" width="240" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Change the code as follows:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:6194a9a1-9538-45d9-b78c-9dea09992dc8" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; BarVisualizer : DialogDebuggerVisualizer
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            Bar data &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (Bar)objectProvider.GetObject();
            windowService.ShowDialog(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; BarVisualizerControl(data));
        }
    }

    [DebuggerVisualizer(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(BarVisualizer), Description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Bar Visualizer&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
    [Serializable]
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Bar
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; name;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; age;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; secret &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Foo&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Bar(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; name, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; age)
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.name &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; name;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.age &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; age;
        }

        [Browsable(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;), Category(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Author&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;), Description(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name of the author&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Name
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; name; }
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { name &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value; }
        }

        [Browsable(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;), Category(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Author&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;), Description(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Age of the author&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Age
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; age; }
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { age &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value; }
        }

        [Browsable(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Secret
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; secret; }
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { secret &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value; }
        }
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;For the Bar type, observe we've added a few attributes from &lt;strong&gt;System.ComponentModel&lt;/strong&gt; to make these display properly in a PropertyGrid control, as shown below. More specifically, these attributes give the properties a friendly name, as well as a category. The Secret property won't be displayed because we set it's browsable attribute to false.&lt;/p&gt;
&lt;p&gt;The most important portion however, is the &lt;strong&gt;DebuggerVisualizer&lt;/strong&gt; attribute on top of the class, telling the VS2005 debugger which type to load as the debugger visualizer for the type. Our visualizer, &lt;strong&gt;BarVisualizer&lt;/strong&gt;, creates a new &lt;strong&gt;BarVisualizerControl&lt;/strong&gt; instance to show the object. It's defined like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bartdesmet.net/images/WritingcustomVisualStudio2005DebuggerVis_141A3/image013.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="300" src="http://www.bartdesmet.net/images/WritingcustomVisualStudio2005DebuggerVis_141A3/image0_thumb3.png" width="399" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;This user control simply contains a (.NET 2.0) &lt;strong&gt;PropertyGrid&lt;/strong&gt; object, called propertyGrid1. The code behind contains the following:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:520a56cc-3cc2-4e0d-8304-f0c5c884aa60" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;partial&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; BarVisualizerControl : UserControl
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; BarVisualizerControl(Bar bar)
        {
            InitializeComponent();
            propertyGrid1.SelectedObject &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; bar;
        }
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Congratulations, your first debugger visualizer is ready! Run the application in the debugger with the breakpoint set as mentioned earlier and observe the visualizer being available in the VS2005 debugger:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bartdesmet.net/images/WritingcustomVisualStudio2005DebuggerVis_141A3/image016.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="99" src="http://www.bartdesmet.net/images/WritingcustomVisualStudio2005DebuggerVis_141A3/image0_thumb4.png" width="460" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;When you click the visualization icon, the following appears:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bartdesmet.net/images/WritingcustomVisualStudio2005DebuggerVis_141A3/image018.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="240" src="http://www.bartdesmet.net/images/WritingcustomVisualStudio2005DebuggerVis_141A3/image017.png" width="230" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Nice, isn't it? Of course, you could create much more complicated debugger visualizers that host a bunch of functionality. Just to give you an idea, think of a visualizer for a database connection kind of class that allows to test the connection using the settings available, or to open up a query creationtool to run against the connectionto check whether or not authorization to certain tables or sprocs works correctly for the given connection settings.&lt;/p&gt;
&lt;p&gt;Furthermore, you can also attach a visualizer to a type you don't maintain yourself, by using the [assembly: DebuggerVisualizer(...)] attribute inside a class library project. Compile the project and copy the DLL file to the %programfiles%\Microsoft Visual Studio 8\Common7\Packages\Debugger\Visualizers folder. An example is shown below:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:630b0050-8a33-4b17-8619-0074e1a82b47" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections.Generic;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Diagnostics;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Forms;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; Microsoft.VisualStudio.DebuggerVisualizers;

[assembly: DebuggerVisualizer(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(MyVisualizers.StringVisualizer), &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(VisualizerObjectSource), Target &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;), Description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;My String Visualizer&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; MyVisualizers
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; StringVisualizer : DialogDebuggerVisualizer
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; data &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;)objectProvider.GetObject();
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; (Form f &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Form())
            {
                f.Text &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; data;
                windowService.ShowDialog(f);
            }
        }
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://www.bartdesmet.net/images/WritingcustomVisualStudio2005DebuggerVis_141A3/image02.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="168" src="http://www.bartdesmet.net/images/WritingcustomVisualStudio2005DebuggerVis_141A3/image0_thumb.png" width="443" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Notice you can also change the object through the visualizer; have a look at the IVisualizerObjectProvider's ReplaceObject and TransferObject methods, as well as the IsObjectReplaceable read-only property.&lt;/p&gt;
&lt;p&gt;Have fun!&lt;/p&gt;&lt;img src="http://community.bartdesmet.net/aggbug.aspx?PostID=12321" width="1" height="1"&gt;</description><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/Visual+Studio+2005/default.aspx">Visual Studio 2005</category></item><item><title>Team Foundation Server and fully qualified domain names</title><link>http://community.bartdesmet.net/blogs/bart/archive/2007/02/20/team-foundation-server-and-fully-qualified-domain-names.aspx</link><pubDate>Tue, 20 Feb 2007 12:28:01 GMT</pubDate><guid isPermaLink="false">863c5522-913f-4a64-ac0a-bd5f05abad0f:12198</guid><dc:creator>bart</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.bartdesmet.net/blogs/bart/rsscomments.aspx?PostID=12198</wfw:commentRss><comments>http://community.bartdesmet.net/blogs/bart/archive/2007/02/20/team-foundation-server-and-fully-qualified-domain-names.aspx#comments</comments><description>&lt;p&gt;For the moment, I'm responsible to set up a TFS machine for a team project that's performed over the internet. No big deal you might think? Well, there are some issues that you have to beware of.&lt;/p&gt; &lt;p&gt;The most 'difficult' one is the "fully qualified domain name" issue. When you install TFS, quite a bunch of references to the machine are kept as the NETBIOS name (e.g. TFSLAB01). These references are used by lots of services (e.g. a page called tfsredirect.aspx will use a registry setting to gather reports in the SharePoint environment) as well as the Team Explorer clients (for which settings are obtained via and exported through a web service call to the TFS machine).&lt;/p&gt; &lt;p&gt;As you can imagine, the server naming above does work out for intranet scenarios but on the internet a name like TFSLAB01 is worthless. There are a few solutions to this:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Have every team member connect to the company over VPN.&lt;/li&gt; &lt;li&gt;Modify the hosts file on each team member's dev box by adding an entry that points TFSLAB01 (the TFS server name) to the right IP.&lt;/li&gt; &lt;li&gt;Change some settings on the TFS machine to use the FQDN. Read &lt;a href="http://bloggingabout.net/blogs/mglaser/archive/2007/01/31/hosting-team-foundation-server-on-a-fully-qualified-domain-name-fqdn.aspx"&gt;Mike Glaser's blog entry&lt;/a&gt; for more information.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Have fun!&lt;/p&gt;&lt;img src="http://community.bartdesmet.net/aggbug.aspx?PostID=12198" width="1" height="1"&gt;</description><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/Visual+Studio+2005/default.aspx">Visual Studio 2005</category></item><item><title>Visual Studio tip - select a rectangular block of code</title><link>http://community.bartdesmet.net/blogs/bart/archive/2007/02/17/visual-studio-tip-select-a-rectangular-block-of-code.aspx</link><pubDate>Sun, 18 Feb 2007 00:30:22 GMT</pubDate><guid isPermaLink="false">863c5522-913f-4a64-ac0a-bd5f05abad0f:12179</guid><dc:creator>bart</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.bartdesmet.net/blogs/bart/rsscomments.aspx?PostID=12179</wfw:commentRss><comments>http://community.bartdesmet.net/blogs/bart/archive/2007/02/17/visual-studio-tip-select-a-rectangular-block-of-code.aspx#comments</comments><description>&lt;p&gt;A little tip but definitely a time-saver in case you didn't know about it yet... Quite a bit of Word users should be familiar with this one:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.bartdesmet.net/images/VisualStudiotipselectarectangularblockof_150E/image01.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="186" src="http://www.bartdesmet.net/images/VisualStudiotipselectarectangularblockof_150E/image0.png" width="240" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;What I'm talking about is &lt;em&gt;ALT+mouse selection&lt;/em&gt; (any official marketing name for this feature out there?). &lt;font color="#008000"&gt;Guidelines: hold the ALT button on the keyboard and make a selection with the mouse; you'll be able to select a "rectangular block" of text.&lt;/font&gt; But did you know it's out there in Visual Studio too?&lt;/p&gt; &lt;p&gt;The reason for this post: recently a reader of my blog complained about the line numbering in my code samples:&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:296e9116-ef57-4dff-834f-1f870a300034" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#999999;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections.Generic;
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Text;
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; RunspaceDemo
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Class1
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#999999;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Bar()
&lt;/span&gt;&lt;span style="color:#999999;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#999999;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Hi there&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#999999;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#999999;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }
&lt;/span&gt;&lt;span style="color:#999999;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;When copying this piece of code to Visual Studio, you'll see something like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bartdesmet.net/images/VisualStudiotipselectarectangularblockof_150E/image03.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="206" src="http://www.bartdesmet.net/images/VisualStudiotipselectarectangularblockof_150E/image02.png" width="240" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Of course, you could manually delete all of the line numbers. However, using ALT+select this becomes much easier:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bartdesmet.net/images/VisualStudiotipselectarectangularblockof_150E/image05.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="206" src="http://www.bartdesmet.net/images/VisualStudiotipselectarectangularblockof_150E/image04.png" width="240" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Just press Delete and you're ready to go!&lt;/p&gt;&lt;img src="http://community.bartdesmet.net/aggbug.aspx?PostID=12179" width="1" height="1"&gt;</description><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/Visual+Studio+2005/default.aspx">Visual Studio 2005</category></item><item><title>Visual Studio 2005 SP1</title><link>http://community.bartdesmet.net/blogs/bart/archive/2006/12/15/Visual-Studio-2005-SP1.aspx</link><pubDate>Fri, 15 Dec 2006 16:20:37 GMT</pubDate><guid isPermaLink="false">863c5522-913f-4a64-ac0a-bd5f05abad0f:12114</guid><dc:creator>bart</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.bartdesmet.net/blogs/bart/rsscomments.aspx?PostID=12114</wfw:commentRss><comments>http://community.bartdesmet.net/blogs/bart/archive/2006/12/15/Visual-Studio-2005-SP1.aspx#comments</comments><description>&lt;p&gt;Finally, it's here: &lt;a href="http://msdn.microsoft.com/vstudio/support/vs2005sp1/"&gt;download now&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://community.bartdesmet.net/aggbug.aspx?PostID=12114" width="1" height="1"&gt;</description><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/Visual+Studio+2005/default.aspx">Visual Studio 2005</category></item><item><title>Sandcastle December 06 CTP</title><link>http://community.bartdesmet.net/blogs/bart/archive/2006/12/10/Sandcastle-December-06-CTP.aspx</link><pubDate>Sun, 10 Dec 2006 21:25:44 GMT</pubDate><guid isPermaLink="false">863c5522-913f-4a64-ac0a-bd5f05abad0f:12059</guid><dc:creator>bart</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.bartdesmet.net/blogs/bart/rsscomments.aspx?PostID=12059</wfw:commentRss><comments>http://community.bartdesmet.net/blogs/bart/archive/2006/12/10/Sandcastle-December-06-CTP.aspx#comments</comments><description>&lt;p&gt;I blogged about Sandcastle in the past, over &lt;a href="http://community.bartdesmet.net/blogs/bart/archive/2006/07/30/4147.aspx"&gt;here&lt;/a&gt;. You can grab the &lt;a href="http://blogs.msdn.com/sandcastle/archive/2006/12/10/announcing-december-sandcastle-ctp.aspx"&gt;December 06 CTP&lt;/a&gt; from the Microsoft-website now. Take a look at the &lt;a href="http://blogs.msdn.com/sandcastle/default.aspx"&gt;Sandcastle MSDN Blog&lt;/a&gt; too.&lt;/p&gt;&lt;img src="http://community.bartdesmet.net/aggbug.aspx?PostID=12059" width="1" height="1"&gt;</description><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/Visual+Studio+2005/default.aspx">Visual Studio 2005</category><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/.NET+Framework+v2.0/default.aspx">.NET Framework v2.0</category><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/C_2300_+2.0/default.aspx">C# 2.0</category></item><item><title>Fun with MPPG/MPLex - Visual Studio 2005 SDK version 3.0</title><link>http://community.bartdesmet.net/blogs/bart/archive/2006/10/22/4594.aspx</link><pubDate>Sun, 22 Oct 2006 08:49:00 GMT</pubDate><guid isPermaLink="false">863c5522-913f-4a64-ac0a-bd5f05abad0f:4594</guid><dc:creator>bart</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.bartdesmet.net/blogs/bart/rsscomments.aspx?PostID=4594</wfw:commentRss><comments>http://community.bartdesmet.net/blogs/bart/archive/2006/10/22/4594.aspx#comments</comments><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;Did you know the third version of the &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=7e0fdd66-698a-4e6a-b373-bd0642847ab7&amp;amp;DisplayLang=en"&gt;Visual Studio 2005 SDK&lt;/A&gt; was shipped about one&amp;nbsp;month ago? I missed this one out for a while, so it's time to explore it right now. Check out &lt;A href="http://blogs.msdn.com/somasegar/archive/2006/10/04/Next-step-in-VS-2005-SDK.aspx"&gt;Somasegar's WebLog&lt;/A&gt; too for information on it.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;One great thing in there is the &lt;STRONG&gt;MPPG/MPLex &lt;/STRONG&gt;parser/lexer twin (just like yacc/lex or bison/flex) sample that comes with the SDK. I saw this project (called &lt;A href="http://www.plas.fit.qut.edu.au/gppg/Default.aspx"&gt;GPPG&lt;/A&gt;) from Queensland University quite a while ago (after attending the &lt;A href="http://blogs.msdn.com/joelpob/archive/2005/10/04/476965.aspx"&gt;Good For Nothing Compiler&lt;/A&gt; session at the PDC last year) and have been skimming over it because of my interest in compilers. The big difference with &lt;A href="http://dinosaur.compilertools.net/"&gt;yacc/lex&lt;/A&gt; is the output language, which is C# instead of C.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;As you might already know by now, I spend a lot of my free time on the "dark side", inside the runtime (cf. SSCLI), messing around with specs (cf. ECMA-335) and having fun with compiler technology (cf. some-personal-project-without-a-name). I'll try to blog about MPPG/MPLex experiences in the near future.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;If this isn't something to spend your Sunday afternoon on ...&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&lt;FONT size=1&gt;Bart De Smet - Ghent - 10/12/06 1:55 &lt;EM&gt;(deferred post)&lt;/EM&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://community.bartdesmet.net/aggbug.aspx?PostID=4594" width="1" height="1"&gt;</description><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/Personal/default.aspx">Personal</category><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/Visual+Studio+2005/default.aspx">Visual Studio 2005</category></item><item><title>Visual Studio Team Edition for Database Professionals (aka DataDude) CTP 6</title><link>http://community.bartdesmet.net/blogs/bart/archive/2006/10/18/4625.aspx</link><pubDate>Wed, 18 Oct 2006 20:05:00 GMT</pubDate><guid isPermaLink="false">863c5522-913f-4a64-ac0a-bd5f05abad0f:4625</guid><dc:creator>bart</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.bartdesmet.net/blogs/bart/rsscomments.aspx?PostID=4625</wfw:commentRss><comments>http://community.bartdesmet.net/blogs/bart/archive/2006/10/18/4625.aspx#comments</comments><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;&lt;A href="http://blogs.msdn.com/gertd/"&gt;Gert Drapers&lt;/A&gt;&lt;/STRONG&gt;, development manager for DataDude and SQL guru for life, &lt;/FONT&gt;&lt;A href="http://blogs.msdn.com/gertd/archive/2006/10/17/vsdbpro-ctp6-goes-live.aspx"&gt;&lt;FONT face=Arial size=2&gt;announces the availability of CTP6 on his blog&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;. Also notice the RTM release is scheduled for Q1 2007.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;For the Belgians not attending &lt;A href="http://www.mseventseurope.com/TechEd/06/pre/defaultitf.aspx"&gt;TechEd IT Forum&lt;/A&gt; (most developers don't I guess, but there are exceptions like me), &lt;STRONG&gt;&lt;A href="http://blogs.msdn.com/guntherb"&gt;Gunther Beersaerts&lt;/A&gt;&lt;/STRONG&gt; will deliver an &lt;STRONG&gt;MSDN Evening Session on November 15, 2006&lt;/STRONG&gt;: &lt;A href="http://www.microsoft.com/belux/msdn/nl/events/2006/20061115_vstsdb.mspx"&gt;Introducing Visual Studio Team Edition for Database Professionals&lt;/A&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Time to become datadudes, don't we?&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://community.bartdesmet.net/aggbug.aspx?PostID=4625" width="1" height="1"&gt;</description><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/SQL+Server+2005/default.aspx">SQL Server 2005</category><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/Visual+Studio+2005/default.aspx">Visual Studio 2005</category></item><item><title>Visual Studio 2005 SP1 Beta available</title><link>http://community.bartdesmet.net/blogs/bart/archive/2006/09/26/4494.aspx</link><pubDate>Wed, 27 Sep 2006 00:54:00 GMT</pubDate><guid isPermaLink="false">863c5522-913f-4a64-ac0a-bd5f05abad0f:4494</guid><dc:creator>bart</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.bartdesmet.net/blogs/bart/rsscomments.aspx?PostID=4494</wfw:commentRss><comments>http://community.bartdesmet.net/blogs/bart/archive/2006/09/26/4494.aspx#comments</comments><description>&lt;FONT face=Arial size=2&gt;Rather unexpectedly, the availability of a SP1 beta for Visual Studio 2005 was announced today by &lt;/FONT&gt;&lt;A href="http://blogs.msdn.com/somasegar/archive/2006/09/26/772250.aspx"&gt;&lt;FONT face=Arial size=2&gt;soma&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;. As usual, everyone is welcome to join the beta programme on Microsoft Connect. Enjoy!&lt;/FONT&gt;&lt;img src="http://community.bartdesmet.net/aggbug.aspx?PostID=4494" width="1" height="1"&gt;</description><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/Visual+Studio+2005/default.aspx">Visual Studio 2005</category></item><item><title>An ASP.NET .ashx HTTP handler for Code 39 barcode generation</title><link>http://community.bartdesmet.net/blogs/bart/archive/2006/09/19/4450.aspx</link><pubDate>Tue, 19 Sep 2006 09:21:00 GMT</pubDate><guid isPermaLink="false">863c5522-913f-4a64-ac0a-bd5f05abad0f:4450</guid><dc:creator>bart</dc:creator><slash:comments>104</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.bartdesmet.net/blogs/bart/rsscomments.aspx?PostID=4450</wfw:commentRss><comments>http://community.bartdesmet.net/blogs/bart/archive/2006/09/19/4450.aspx#comments</comments><description>&lt;P&gt;&lt;FONT face=Arial color=#000080 size=3&gt;&lt;STRONG&gt;Introduction&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;In my &lt;/FONT&gt;&lt;A href="/blogs/bart/archive/2006/09/18/4432.aspx"&gt;&lt;FONT face=Arial size=2&gt;previous blog post on Code 39 barcodes&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;, I've shown you guys how to generate Code 39 barcodes using managed code. Today, we'll take it another step forward and make barcode generation available through an .ashx ASP.NET 2.0 HTTP handler.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial color=#000080 size=3&gt;&lt;STRONG&gt;About ASP.NET 2.0 Generic Handlers&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;One of the great things in ASP.NET is the concepts of "generic handlers". Basically you can look at it as just another kind of object that can process HTTP requests, however outside the scope of a page (which targets 'classic' HTML-based output). You might have heard about &lt;STRONG&gt;HTTP handlers &lt;/STRONG&gt;too and basically these are the&amp;nbsp;same except for the fact that you can bind an HTTP handler to any file extension (as long as you IIS configuration permits) whileas a generic handler just lives behind the .ashx extension and is directly supported in Visual Studio 2005 web site projects. In the end all handlers implement &lt;A href="http://msdn2.microsoft.com/en-us/library/system.web.ihttphandler.aspx"&gt;System.Web.IHttpHandler&lt;/A&gt;. Last but not least, you'll be able to host any ASP.NET HTTP&amp;nbsp;Handler directly in IIS 7 too (which I'll blog about later on).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT face=Arial color=#000080 size=3&gt;Our online Code39 barcode generator&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;First of all create a new web site project in Visual Studio 2005:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;IMG src="http://www.bartdesmet.net/images/code39ashx01.jpg"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Next, add a new generic handler called "Code39Generator.ashx" to the project:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;IMG src="http://www.bartdesmet.net/images/code39ashx02.jpg"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;This will generate the following piece of code:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&amp;lt;%&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;@&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;WebHandler&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;Language&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;="C#"&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;Class&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;="Code39Generator"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt; %&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;using&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; System;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt; System.Web;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;public&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;class&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Code39Generator&lt;/FONT&gt;&lt;FONT size=2&gt; : &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;IHttpHandler&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; ProcessRequest (&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;HttpContext&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; context) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Response.ContentType = &lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"text/plain"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Response.Write(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"Hello World"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;bool&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; IsReusable {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; get&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; return&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;false&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Exactly, "Hello World" made it to the built-in code snippets in Visual Studio 2005. Our task is to create a suitable &lt;STRONG&gt;ProcessRequest&lt;/STRONG&gt; method that returns an image with a requested barcode. Requested by means of the querystring that is. The &lt;STRONG&gt;IsReusable&lt;/STRONG&gt; property is used by the ASP.NET runtime to find out whether the instance of our handler can be reused for multiple requests. That's fine for us, as we don't have intentions to turn our handler instance to garbage once a request has passed through the pipeline:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;bool&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; IsReusable {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; get&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; return&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;STRONG&gt;&lt;U&gt;true&lt;/U&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;On to the real stuff now. First of all make sure the Code39 and Code39Settings classes&amp;nbsp;(&lt;A href="/blogs/bart/archive/2006/09/18/4432.aspx"&gt;see previous post&lt;/A&gt;) are available in the context of the web site project. You can do that by&amp;nbsp;CTRL-C,V-ing the code to a class file or by referencing a class library project. I've chosen to walk the former path as shown below:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;IMG src="http://www.bartdesmet.net/images/code39ashx03.jpg"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Make sure to declare the classes as follows:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=Arial size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;using&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt; System;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt; System.Collections.Generic;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt; System.Diagnostics;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt; System.Drawing;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt; System.Drawing.Imaging;&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;public&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;class&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008080 size=2&gt;Code39Settings&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp; ...&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;class&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008080 size=2&gt;Code39&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp; ...&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Back to our .ashx file. First let's fix some namespace imports:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=Arial size=2&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;using&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; System;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; System.Web;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; System.IO;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; System.Drawing;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;FONT size=2&gt; System.Drawing.Imaging;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Real stuff happens a little further, in the ProcessRequest method which we define like this:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; ProcessRequest(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;HttpContext&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; context)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt; code = context.Request[&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"code"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;];&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt;&lt;FONT size=2&gt; (code != &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;null&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Image&lt;/FONT&gt;&lt;FONT size=2&gt; img = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Code39&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;(code.ToUpper()).Paint();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Response.ContentType = &lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"image/png"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;[] b = GetImageBytes(img);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Response.OutputStream.Write(b, 0, b.Length);&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;The basic idea is simple: just take the generated image from our Code39 class's&amp;nbsp;Paint method&amp;nbsp;and send it back to the client as an image/png type of HTTP response. In order to do so, we'll need the bytes of the image.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&lt;STRONG&gt;&lt;U&gt;Note:&lt;/U&gt;&lt;/STRONG&gt; It would be easier if we could write this:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=Arial&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;img.Save(context.Response.OutputStream, &lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080 size=2&gt;ImageFormat&lt;/FONT&gt;&lt;FONT size=2&gt;.Png);&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;However this causes the following exception to occur:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;
&lt;TABLE bgColor=#ffffcc&gt;

&lt;TR&gt;
&lt;TD&gt;&lt;CODE&gt;&lt;PRE&gt;[ExternalException (0x80004005): A generic error occurred in GDI+.]
   System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams) +568
   System.Drawing.Image.Save(Stream stream, ImageFormat format) +33
   Code39Generator.ProcessRequest(HttpContext context) +157
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +390
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp;amp; completedSynchronously) +65&lt;/PRE&gt;&lt;/CODE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;There are lots of forum threads on this issue (just &lt;A href="http://www.live.com/"&gt;Live Search&lt;/A&gt; for it), most of which have to do with permissions when trying to save images on the server's disk. However, I decided to create a code-based workaround as I have some indications permissions might not be the issue in this case (and even if they were, I rather like to have the solution just work in xcopy deployment scenarios). &lt;/FONT&gt;&lt;FONT face=Arial&gt;Therefore, here it is, the &lt;STRONG&gt;GetImagesBytes&lt;/STRONG&gt; method:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=Arial&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;/FONT&gt;&lt;FONT size=2&gt;[] GetImageBytes(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Image&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; image)&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;&amp;nbsp;&amp;nbsp; ImageCodecInfo&lt;/FONT&gt;&lt;FONT size=2&gt; codec = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;null&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp; foreach&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;ImageCodecInfo&lt;/FONT&gt;&lt;FONT size=2&gt; e &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;in&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;ImageCodecInfo&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;.GetImageEncoders())&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt;&lt;FONT size=2&gt; (e.MimeType == &lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"image/png"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; codec = e;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp; using&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;EncoderParameters&lt;/FONT&gt;&lt;FONT size=2&gt; ep = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;EncoderParameters&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;())&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ep.Param[0] = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;EncoderParameter&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Encoder&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;.Quality, 100L);&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;MemoryStream&lt;/FONT&gt;&lt;FONT size=2&gt; ms = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;MemoryStream&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; image.Save(ms, codec, ep);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt; ms.ToArray();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;This one just works fine. So, press F5 to run the web site project and see the ASP.NET Development Server getting ready to serve you:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&lt;IMG src="http://www.bartdesmet.net/images/code39ashx04.jpg"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Right-click the icon and choose "Open in Web Browser" if the system didn't do this already by itself. You should see the directory listing now:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&lt;IMG src="http://www.bartdesmet.net/images/code39ashx05.jpg"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Click the Code39Generator.ashx file and patch the browser address bar by appending &lt;EM&gt;?code=BART&lt;/EM&gt; to it (e.g. &lt;A href="http://localhost:49587/Code39/Code39Generator.ashx?code=BART"&gt;http://localhost:49587/Code39/Code39Generator.ashx?code=BART&lt;/A&gt;&amp;nbsp;- the port will much likely be different on your machine). There we go:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&lt;IMG src="http://www.bartdesmet.net/images/code39ashx06.jpg"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Stay tuned for even more barcode fun soon!&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;img src="http://community.bartdesmet.net/aggbug.aspx?PostID=4450" width="1" height="1"&gt;</description><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/ASP.NET+v2.0/default.aspx">ASP.NET v2.0</category><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/Visual+Studio+2005/default.aspx">Visual Studio 2005</category><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/C_2300_+2.0/default.aspx">C# 2.0</category></item><item><title>Conditional compilation in C# - explaining System.Diagnostics.ConditionalAttribute</title><link>http://community.bartdesmet.net/blogs/bart/archive/2006/08/30/4368.aspx</link><pubDate>Thu, 31 Aug 2006 05:04:00 GMT</pubDate><guid isPermaLink="false">863c5522-913f-4a64-ac0a-bd5f05abad0f:4368</guid><dc:creator>bart</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.bartdesmet.net/blogs/bart/rsscomments.aspx?PostID=4368</wfw:commentRss><comments>http://community.bartdesmet.net/blogs/bart/archive/2006/08/30/4368.aspx#comments</comments><description>&lt;P&gt;&lt;FONT face=Arial color=#000080 size=3&gt;&lt;STRONG&gt;Introduction&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Conditional compilation is one of the much unknown powerful features that are available in .NET and more specifically in the C#, VB.NET and J# compilers. In this post, I'd like to show you how to take benefit from this feature, applied to C#.&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=Arial size=2&gt;
&lt;P&gt;&lt;FONT face=Arial color=#000080 size=3&gt;&lt;STRONG&gt;An example&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;using&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; System;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; System.Diagnostics;&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;class&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008080 size=2&gt;Program&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp; static&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; Main(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;[] args)&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DebugLog(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"Before loop"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;int&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; i = 0; i &amp;lt; 10; i++)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;.WriteLine(i);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DebugLog(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"After loop"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp; [&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080 size=2&gt;Conditional&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"DEBUG"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;)]&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp; private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;static&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; DebugLog(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; s)&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;.WriteLine(s);&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;First compile the program using one of the following options:&lt;/FONT&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;In Visual Studio 2005 with the active configuration set to &lt;EM&gt;Debug&lt;/EM&gt;.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;On the command-line using &lt;EM&gt;csc /define:DEBUG Program.cs&lt;/EM&gt;. (Note: this is &lt;STRONG&gt;&lt;U&gt;not&lt;/U&gt;&lt;/STRONG&gt; the same as &lt;EM&gt;csc /debug+ Program.cs&lt;/EM&gt;)&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Add &lt;EM&gt;#define DEBUG&lt;/EM&gt; in the program code.&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;When you execute the program, you'll see:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;Before loop&lt;BR&gt;0&lt;BR&gt;1&lt;BR&gt;2&lt;BR&gt;3&lt;BR&gt;4&lt;BR&gt;5&lt;BR&gt;6&lt;BR&gt;7&lt;BR&gt;8&lt;BR&gt;9&lt;BR&gt;After loop&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;In the IL code you'll see something like this:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=Arial size=2&gt;&lt;FONT size=3&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;IL_0000: nop&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;&lt;STRONG&gt;IL_0001: ldstr "Before loop"&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;&lt;STRONG&gt;IL_0006: call void Program::DebugLog(string)&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_000b: nop&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_000c: ldc.i4.0&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_000d: stloc.0&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_000e: br.s IL_001b&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0010: ldloc.0&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0011: call void [mscorlib]System.Console::WriteLine(int32)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0016: nop&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0017: ldloc.0&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0018: ldc.i4.1&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0019: add&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_001a: stloc.0&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_001b: ldloc.0&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_001c: ldc.i4.s 10&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_001e: clt&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0020: stloc.1&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0021: ldloc.1&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0022: brtrue.s IL_0010&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;&lt;STRONG&gt;IL_0024: ldstr "After loop"&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;&lt;FONT color=#008000&gt;IL_0029: call void Program::DebugLog(string)&lt;/FONT&gt;&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_002e: nop&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_002f: ret&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Nothing special going on despite the declaration of the &lt;FONT face="Courier New"&gt;[&lt;FONT color=#008080 size=2&gt;Conditional&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"DEBUG"&lt;/FONT&gt;&lt;FONT size=2&gt;)]&lt;/FONT&gt;&lt;/FONT&gt; attribute. However, let's compile the same application now as a release build:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=Arial size=2&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;In Visual Studio 2005 with the active configuration set to &lt;EM&gt;Release&lt;/EM&gt;.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;On the command-line using &lt;EM&gt;csc Program.cs&lt;/EM&gt;.&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Now the output will be:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;0&lt;BR&gt;1&lt;BR&gt;2&lt;BR&gt;3&lt;BR&gt;4&lt;BR&gt;5&lt;BR&gt;6&lt;BR&gt;7&lt;BR&gt;8&lt;BR&gt;9&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;and the corresponding IL is:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=Arial size=2&gt;&lt;FONT size=3&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;IL_0000: nop&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0001: ldc.i4.0&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0002: stloc.0&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0003: br.s IL_0010&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0005: ldloc.0&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0006: call void [mscorlib]System.Console::WriteLine(int32)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_000b: nop&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_000c: ldloc.0&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_000d: ldc.i4.1&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_000e: add&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_000f: stloc.0&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0010: ldloc.0&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0011: ldc.i4.s 10&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0013: clt&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0015: stloc.1&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0016: ldloc.1&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0017: brtrue.s IL_0005&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;IL_0019: ret&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;So, no single call to the DebugLog method was emitted in the Main's code. Powerful isn't it? The coolest thing about all this is that you don't have to decorate your code using a bunch of #if statements, like this:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp; static&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; Main(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;[] args)&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;FONT color=#0000ff size=2&gt;#if&lt;/FONT&gt;&lt;FONT size=2&gt; DEBUG&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DebugLog(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"Before loop"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&lt;FONT color=#0000ff&gt;#endif&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;int&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; i = 0; i &amp;lt; 10; i++)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;.WriteLine(i);&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;#if&lt;/FONT&gt;&lt;FONT size=2&gt; DEBUG&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DebugLog(&lt;FONT color=#800000 size=2&gt;"After loop"&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&lt;FONT color=#0000ff&gt;#endif&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;One advantage of the latter approach might be that you can also #if DEBUG ... #endif the DebugLog method itself. Using conditional compilation the DebugLog method will get compiled no matter what.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;A few remarks to conclude:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;The ConditionalAttribute &lt;STRONG&gt;can only be applied to methods and to attribute classes &lt;/STRONG&gt;(that is: classes that derive from System.Attribute). Thus property and event accessors can't be decorated using this attribute.&lt;BR&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;The &lt;STRONG&gt;Debug&lt;/STRONG&gt; and &lt;STRONG&gt;Trace&lt;/STRONG&gt; classes of the .NET Framework use the ConditionalAttribute. So you don't have to worry about any performance hit whatsoever when you call various methods of these classes as a debugging aid. These calls just won't make it in the release build (or better: non-debug builds), e.g.:&lt;BR&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;[&lt;FONT color=#008080 size=2&gt;Conditional&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"DEBUG"&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;)]&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;static&lt;/SPAN&gt; &lt;SPAN&gt;void&lt;/SPAN&gt; Assert (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN&gt;bool&lt;/SPAN&gt; condition&lt;BR&gt;)&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;The &lt;STRONG&gt;C++ compiler doesn't support the ConditionalAttribute&lt;/STRONG&gt;; you'll have to rely on #if conditionals to include/exclude debugging code.&lt;BR&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;The &lt;STRONG&gt;ConditionalAttribute&lt;/STRONG&gt; allows multiple decorations per method (or attribute class):&lt;BR&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;FONT face="Courier New" size=2&gt;[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Method, AllowMultiple=&lt;SPAN&gt;true&lt;/SPAN&gt;)] &lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;Therefore you can do things such as (cf. section 17.4.2.2 of the C# specification):&lt;BR&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp; [&lt;FONT color=#008080 size=2&gt;Conditional&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"ALPHA"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;)]&lt;BR&gt;&amp;nbsp;&amp;nbsp; [&lt;FONT color=#008080 size=2&gt;Conditional&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"BETA"&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;)]&lt;/FONT&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp; private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;static&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; DebugLog(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt; s)&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Attribute decorations are emitted to the metadata of a class. Because of this, you can get ConditionalAttribute working across languages and assemblies. An example of a class definition in C#:&lt;BR&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;public static class&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT face="Courier New" color=#008080 size=2&gt;Helper&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp; [&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080 size=2&gt;Conditional&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"DEBUG"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;)]&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp; public &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;static&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; DebugLog(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; s)&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;.WriteLine(s);&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;BR&gt;&lt;BR&gt;&lt;FONT face=Arial&gt;and its usage in VB:&lt;BR&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;Class &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008080 size=2&gt;Program&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp; Shared Sub &lt;/FONT&gt;&lt;FONT size=2&gt;Main(&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008080&gt;Helper&lt;/FONT&gt;.DebugLog(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"Before loop"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;)&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim &lt;FONT color=#000000&gt;i&amp;nbsp;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;As Integer&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;i =&amp;nbsp;0&amp;nbsp;&lt;FONT color=#0000ff&gt;To&lt;/FONT&gt; 10&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;.WriteLine(i)&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008080&gt;Helper&lt;/FONT&gt;.DebugLog(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"After loop"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;End Sub&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;End Class&lt;BR&gt;&lt;BR&gt;&lt;FONT face=Arial color=#000000&gt;This will yield the same result as the C# only example, because the VB compiler can find out (using the metadata of class Helper) that calls to DebugLog should only be made when a DEBUG build is made.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face=Arial color=#000080 size=3&gt;&lt;STRONG&gt;References&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;More information on the &lt;A href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspx"&gt;ConditionalAttribute&lt;/A&gt; can be found in the MSDN Library.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;The C# compiler reserved attributes can be found in section 17.4 of the &lt;A href="http://download.microsoft.com/download/8/1/6/81682478-4018-48fe-9e5e-f87a44af3db9/CSharp%202.0%20Specification.doc"&gt;C# specification&lt;/A&gt;.&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Enjoy!&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://community.bartdesmet.net/aggbug.aspx?PostID=4368" width="1" height="1"&gt;</description><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/Visual+Studio+2005/default.aspx">Visual Studio 2005</category><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/.NET+Framework+v2.0/default.aspx">.NET Framework v2.0</category><category domain="http://community.bartdesmet.net/blogs/bart/archive/tags/C_2300_+2.0/default.aspx">C# 2.0</category></item></channel></rss>