<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://mattonsoftware.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">mattonsoftware.com</title><subtitle type="html">Perennial Thoughts on Software Development</subtitle><id>http://mattonsoftware.com/atom.aspx</id><link rel="alternate" type="text/html" href="http://mattonsoftware.com/default.aspx" /><link rel="self" type="application/atom+xml" href="http://mattonsoftware.com/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.61129.1">Community Server</generator><updated>2005-07-25T22:27:00Z</updated><entry><title>PPUtil: A Utility for Publisher Policy Generation</title><link rel="alternate" type="text/html" href="http://mattonsoftware.com/archive/2007/03/11/pputil-a-utility-for-publisher-policy-generation.aspx" /><id>http://mattonsoftware.com/archive/2007/03/11/pputil-a-utility-for-publisher-policy-generation.aspx</id><published>2007-03-11T09:23:00Z</published><updated>2007-03-11T09:23:00Z</updated><content type="html">&lt;p&gt;The &lt;a href="http://msdn2.microsoft.com/en-us/library/dz32563a.aspx" class=""&gt;conventional method&lt;/a&gt;
of creating publisher policy (PP) assemblies becomes cumbersome when
dealing with many assemblies, and many earlier versions of assemblies&lt;sup&gt;&lt;a href="http://mattonsoftware.com/archive/2007/03/11/pputil-a-utility-for-publisher-policy-generation.aspx#FOOTNOTE_1" class="" title="Footnote 1" target="_self"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;PPUtil is a configuration-based utility for generating PP for many
assemblies/versions. This tool was authored using .NET 2.0, however,
the resultant PP assemblies can be used with .NET 1.0/1.1-compiled
assemblies.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Download&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Binaries: &lt;a href="http://mattonsoftware.com/source/PPUtil_Binaries_v1_0_0_0.zip" class=""&gt;PPUtil_Binaries_v1_0_0_0.zip&lt;/a&gt; &lt;br&gt;&lt;/li&gt;&lt;li&gt;Source: &lt;a href="http://mattonsoftware.com/source/PPUtil_Source_v1_0_0_0.zip" class=""&gt;PPUtil_Source_v1_0_0_0.zip&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
This work is licensed under a &lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;Creative Commons Attribution 3.0 License&lt;/a&gt;.&lt;br&gt;
&lt;p&gt;&lt;b&gt;Usage&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;PPUtil configurationFile outputDirectory&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Common Usage Scenarios&amp;nbsp;&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Redirect a specific earlier version of an assembly to a later version;&lt;/li&gt;&lt;li&gt;Redirect a range of earlier versions of an assembly to a later version.&lt;/li&gt;&lt;/ul&gt;
In both scenarios, resolution of the redirection for the earlier assembly
versions is limited to major/minor version combinations i.e. build and revision numbers are not considered. This is due to the design of the
publisher policy mechanism itself.&amp;nbsp; &lt;p&gt;&lt;b&gt;Configuration Examples&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Redirect a specific earlier version of an assembly to a later version&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Use the oldVersion attribute of the bindingRedirect element to
specify the specific earlier version to redirect from. The major/minor
component of the oldVersion will typically correspond to the
oldMajorMinorVersion attribute of the publisherPolicy element.&lt;br&gt;&lt;br&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;publisherPolicy&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt; &lt;br&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;assemblies&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt; &lt;br&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;assembly&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:'Courier New';"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;SampleAssembly&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:'Courier New';"&gt;publicKeyToken&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;baa3201a127d8068&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:'Courier New';"&gt;strongNameKeyPath&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;SampleKey.snk&lt;/span&gt;"&lt;span style="color:blue;"&gt; &amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt; &lt;br&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;publisherPolicies&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt; &lt;br&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;publisherPolicy&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:'Courier New';"&gt;oldMajorMinorVersion&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;1.0.0.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt; &lt;br&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;bindingRedirect&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt; &lt;/span&gt;&lt;span style="background:lime none repeat scroll 0% 50%;font-size:10pt;color:red;font-family:'Courier New';-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;oldVersion&lt;/span&gt;&lt;span style="background:lime none repeat scroll 0% 50%;font-size:10pt;color:blue;font-family:'Courier New';-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;=&lt;/span&gt;&lt;span style="background:lime none repeat scroll 0% 50%;font-size:10pt;font-family:'Courier New';-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;"&lt;span style="color:blue;"&gt;1.0.0.0&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;newVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;1.1.0.0&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt; &lt;br&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;publisherPolicy&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt; &lt;br&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;publisherPolicies&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt; &lt;br&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;assembly&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt; &lt;br&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;assemblies&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&amp;nbsp; &lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&lt;br&gt;&lt;/span&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;publisherPolicy&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;/span&gt; &lt;/p&gt;
&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;i&gt;Redirect a range of earlier versions of an assembly to a later version&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Use the oldLowestVersion and oldHighestVersion attributes of the
bindingRedirect element to specify the range of earlier versions to
redirect from.&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;publisherPolicy&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;assemblies&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;assembly&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:'Courier New';"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;SampleAssembly&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; publicKeyToken&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;baa3201a127d8068&lt;/span&gt;"&lt;span&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:'Courier New';"&gt;strongNameKeyPath&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;SampleKey.snk&lt;/span&gt;"&lt;span&gt; &amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;publisherPolicies&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;publisherPolicy&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:'Courier New';"&gt;oldMajorMinorVersion&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;2.0&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;2.0.0.0&lt;/span&gt;"&lt;span&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;bindingRedirect&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt; &lt;/span&gt;&lt;span style="background:lime none repeat scroll 0% 50%;font-size:10pt;color:red;font-family:'Courier New';-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;oldLowestVersion&lt;/span&gt;&lt;span style="background:lime none repeat scroll 0% 50%;font-size:10pt;color:blue;font-family:'Courier New';-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;=&lt;/span&gt;&lt;span style="background:lime none repeat scroll 0% 50%;font-size:10pt;font-family:'Courier New';-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;"&lt;span style="color:blue;"&gt;2.0.0.0&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;/span&gt;&lt;span style="background:lime none repeat scroll 0% 50%;font-size:10pt;color:red;font-family:'Courier New';-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="background:lime none repeat scroll 0% 50%;font-size:10pt;color:red;font-family:'Courier New';-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;oldHighestVersion&lt;/span&gt;&lt;span style="background:lime none repeat scroll 0% 50%;font-size:10pt;color:blue;font-family:'Courier New';-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;=&lt;/span&gt;&lt;span style="background:lime none repeat scroll 0% 50%;font-size:10pt;font-family:'Courier New';-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;"&lt;span style="color:blue;"&gt;2.1.0.9&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:'Courier New';"&gt;newVersion&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;2.2.0.0&lt;/span&gt;"&lt;span&gt; /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;publisherPolicy&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;publisherPolicies&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;assembly&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;assemblies&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;span&gt;&lt;br&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;publisherPolicy&lt;/span&gt;&amp;gt;&lt;/p&gt;
&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;/span&gt;
&lt;p&gt;&lt;b&gt;Tips&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;The provided configuration file must include a configuration
section declaration for the publisherPolicy configuration section, as
follows. The utility will also detect the absence of this declaration
and prompt the user accordingly.&lt;/li&gt;&lt;/ul&gt;

&lt;blockquote&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;configuration&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;configSections&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;section&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:'Courier New';"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;publisherPolicy&lt;/span&gt;"&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;span style="color:red;"&gt; type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;PublisherPolicyTool.Configuration.PublisherPolicyConfigurationSection, PPUtil&lt;/span&gt;"&lt;span&gt; /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;configSections&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;br&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:maroon;font-family:'Courier New';"&gt;configuration&lt;/span&gt;&amp;gt; &lt;span style="font-size:10pt;color:blue;font-family:'Courier New';"&gt;&lt;/span&gt;&lt;/blockquote&gt;

&lt;ul&gt;&lt;li&gt;The PP assembly itself is versioned. When there are multiple
versions of a&amp;nbsp;PP assembly available, the version with the highest
number is used. In .NET 1.0/1.1 a bug exists in the assembly loader
whereby when determining the&amp;nbsp;PP assembly with the highest number, &lt;a href="http://blogs.msdn.com/junfeng/archive/2005/12/16/504555.aspx" class=""&gt;the version numbers are sorted in alphabetic order, rather than numeric order&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;The same strong name key used to sign the assembly the PP applies to must be used to sign the PP assembly;&lt;/li&gt;&lt;li&gt;When GACing a PP assembly, the generated PP configuration file must reside in the same folder as the PP assembly;&lt;/li&gt;&lt;li&gt;To diagnose binding issues, the binding resolution can be traced using fuslogw or &lt;a href="http://blogs.msdn.com/suzcook/archive/2003/05/29/57120.aspx" class=""&gt;output to disk by modifying registry values&lt;/a&gt;;&lt;/li&gt;&lt;/ul&gt;
&lt;b&gt;Acknowledgments&lt;/b&gt; 
&lt;p&gt;The idea of using the managed assembly builder APIs for PP generation was derived from &lt;a href="http://weblogs.asp.net/okloeten/archive/2004/02/24/79143.aspx" class=""&gt;Omers publisher policy generation sample&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Footnotes&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;a class="" title="FOOTNOTE_1" name="FOOTNOTE_1"&gt;&lt;/a&gt;1:
Generating&amp;nbsp;PP involves specifying the old version (major and minor
version number resolution) of an assembly that the binding policy
within the PP assembly will be applied to. The old version corresponds
to an earlier version of an assembly that is referenced by dependent
assemblies. &lt;br&gt;&lt;/p&gt;&lt;img src="http://mattonsoftware.com/aggbug.aspx?PostID=685" width="1" height="1"&gt;</content><author><name>matt</name><uri>http://mattonsoftware.com/members/matt.aspx</uri></author><category term=".NET" scheme="http://mattonsoftware.com/archive/tags/.NET/default.aspx" /><category term="Tools" scheme="http://mattonsoftware.com/archive/tags/Tools/default.aspx" /><category term="PublisherPolicy" scheme="http://mattonsoftware.com/archive/tags/PublisherPolicy/default.aspx" /></entry><entry><title>IIS 6:  Logging Application Pool Recycling Events to the Event Log</title><link rel="alternate" type="text/html" href="http://mattonsoftware.com/archive/2006/10/18/23.aspx" /><id>http://mattonsoftware.com/archive/2006/10/18/23.aspx</id><published>2006-10-18T12:40:00Z</published><updated>2006-10-18T12:40:00Z</updated><content type="html">By default, IIS 6 logs application pool recycling events to the event
log when memory limits are exceeded (noting that a memory limit is not
set by default) and after elapsed time (29 hours by default). &lt;br&gt;&lt;br&gt;There
are other reasons for application pool recycling events, such as
modifications to configuration files and manual recycling requests
issued by administrators. Logging of recycling events to the event
log is controlled by the LogEventOnRecycle metabase property
(interpreted as a bitflag).&lt;br&gt;&lt;br&gt;Updating the LogEventOnRecycle
property to consider other recycling events can be achieved using
adsutils.vbs, or by manually editing the metabase. The following
examples enable logging for all possible recycling events.&lt;br&gt;&lt;br&gt;&lt;b&gt;Updating using adsutils.vbs&lt;/b&gt;&lt;br&gt;&lt;br&gt;cscript adsutil.vbs Set w3svc/AppPools/DefaultAppPool/LogEventOnRecycle 255 &lt;br&gt;&lt;br&gt;&lt;b&gt;Updating by Editing the Metabase&lt;/b&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;Stop IIS: iisreset -stop&lt;/li&gt;&lt;li&gt;Backup the metabase (found at: %WINDIR%\system32\inetsrv\MetaBase.xml)&amp;nbsp;&lt;/li&gt;&lt;li&gt;Modify the LogEventOnRecycle property: &lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;Branch :&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /LM/W3SVC/AppPools/ &lt;br&gt;Key Name:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LogEventOnRecycle &lt;br&gt;New Value:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 255 (default is 137) &lt;br&gt;&lt;br&gt;The metabase can be edited using the Metabase Explorer (available as part of the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=56fc92ee-a71a-4c73-b628-ade629c89499&amp;amp;DisplayLang=en"&gt;IIS 6 Resource Kit Tools&lt;/a&gt;).&lt;br&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Start IIS: iisreset -start &lt;/li&gt;&lt;/ul&gt;For further information about the LogEventOnRecycle metabase property, see the following articles: &lt;br&gt;&lt;blockquote&gt;&lt;a href="http://support.microsoft.com/kb/332088/EN-US/"&gt;How to modify Application Pool Recycling events in IIS 6.0&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/6f43da84-38b0-422b-aa2b-195643d05d22.mspx?mfr=true"&gt;LogEventOnRecycle Metabase Property&lt;/a&gt;&lt;br&gt;&lt;/blockquote&gt;Also
note that IIS creates worker processes for application pools on demand.
Thus, a recycle request may be issued but not result in an event log
entry if no actual worker process is active. For more information:&lt;br&gt;&lt;blockquote&gt;&lt;a href="http://blogs.msdn.com/david.wang/archive/2006/02/28/Why_IIS6_Application_Pool_Recycle_Events_are_not_logged.aspx"&gt;Why IIS6 Application Pool Recycle Events are Not Logged&lt;/a&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;img src="http://mattonsoftware.com/aggbug.aspx?PostID=23" width="1" height="1"&gt;</content><author><name>matt</name><uri>http://mattonsoftware.com/members/matt.aspx</uri></author><category term="IIS" scheme="http://mattonsoftware.com/archive/tags/IIS/default.aspx" /></entry><entry><title>LibCheck: Highlight Public API Differences Between Assembly Revisions</title><link rel="alternate" type="text/html" href="http://mattonsoftware.com/archive/2006/09/28/21.aspx" /><id>http://mattonsoftware.com/archive/2006/09/28/21.aspx</id><published>2006-09-28T13:50:00Z</published><updated>2006-09-28T13:50:00Z</updated><content type="html">&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=4b5b7f29-1939-4e5b-a780-70e887964165&amp;amp;displaylang=en"&gt;LibCheck&lt;/a&gt; is an assembly comparison tool that:&lt;br&gt;&lt;br&gt;&lt;i&gt;"... allows you to compare two versions of an assembly, and determine the differences. The tool reports the differences as a combination of 'removed' and 'added' APIs."&lt;/i&gt;&lt;br&gt;&lt;br&gt;The comparison results present:&lt;br&gt;&lt;ul&gt;&lt;li&gt;"removed" items: the original member has been either removed or modified;&lt;/li&gt;&lt;li&gt;"added" items: member has been added to the new version, or is a modified form of an original member;&lt;/li&gt;&lt;li&gt;breaking changes highlighted in red.&lt;/li&gt;&lt;/ul&gt;The following example compares two versions of an assembly.&lt;br&gt;&lt;br&gt;&lt;b&gt;Generating Metadata for Comparison&lt;/b&gt;&lt;br&gt;&lt;br&gt;libcheck.exe -store &lt;i&gt;AssemblyName FolderNameToStoreResults &lt;/i&gt;-full &lt;i&gt;FolderContainingAssembly&lt;/i&gt;&lt;br&gt;&lt;br&gt;For example:&lt;br&gt;&lt;br&gt;&amp;nbsp; libcheck.exe -store HelloWorld.dll 1.0.0.0 -full C:\HelloWorldV1\&lt;br&gt;&lt;br&gt;&amp;nbsp; libcheck.exe -store HelloWorld.dll 2.0.0.0 -full C:\HelloWorldV2\&lt;br&gt;&lt;br&gt;&lt;b&gt;Performing the Comparison&lt;/b&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; libcheck.exe -compare &lt;i&gt;FolderContainingFirstStoreResults FolderContainingSecondStoreResults &lt;/i&gt;&lt;br&gt;&lt;br&gt;For example:&lt;br&gt;&lt;br&gt;&amp;nbsp; libcheck.exe -compare 1.0.0.0 2.0.0.0 &lt;br&gt;&lt;br&gt;Here is an &lt;a HREF="/examples/libcheck/APIChanges1.0.0.0to2.0.0.0.html"&gt;example comparison report&lt;/a&gt;.&lt;br&gt;&lt;img src="http://mattonsoftware.com/aggbug.aspx?PostID=21" width="1" height="1"&gt;</content><author><name>matt</name><uri>http://mattonsoftware.com/members/matt.aspx</uri></author><category term=".NET" scheme="http://mattonsoftware.com/archive/tags/.NET/default.aspx" /><category term="Tools" scheme="http://mattonsoftware.com/archive/tags/Tools/default.aspx" /></entry><entry><title>Debugging Production Applications using ADPlus</title><link rel="alternate" type="text/html" href="http://mattonsoftware.com/archive/2006/09/21/debugging-production-applications-using-adplus.aspx" /><id>http://mattonsoftware.com/archive/2006/09/21/debugging-production-applications-using-adplus.aspx</id><published>2006-09-22T03:02:00Z</published><updated>2006-09-22T03:02:00Z</updated><content type="html">&lt;p&gt;ADPlus is used to take snapshots of processes in&amp;nbsp;environments where development-time debugging tools are not available e.g. Production server farms, end-users workstations. ADPlus is a Visual Basic&amp;nbsp;script provided as part of the Debugging Tools for Windows&amp;nbsp;that wraps the CDB debugger. &lt;/p&gt;

&lt;p&gt;Snapshots of processes&amp;nbsp;taken with ADPlus are analysed using the Windows Debugger (WinDbg). Managed processes in particular are analysed using SOS.dll, which contains extensions to WinDbg for debugging managed processes.&lt;/p&gt;&lt;p&gt;Practical applications include taking snapshots of&amp;nbsp;WinForms and
ASP.NET&amp;nbsp;processes to interrogate unhandled exceptions, memory
utilisation, resource contention etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Installing Debugging Tools for Windows in Target Environment&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download &lt;a href="http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx"&gt;debugging tools&lt;/a&gt;; 
&lt;/li&gt;&lt;li&gt;XCOPY deploy to target environment; 
&lt;/li&gt;&lt;li&gt;Create a folder to store snapshots; 
&lt;/li&gt;&lt;li&gt;Set CScript as the default scripting engine (required by ADPlus, also requires Windows Script Host 5.6 or higher, interrogate version using CSCRIPT /? command)&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote dir="ltr"&gt;
&lt;p&gt;CSCRIPT /H:CScript&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Taking a Snapshop using ADPlus&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The following&amp;nbsp;examples demonstrate&amp;nbsp;taking a snapshot of a WinForms process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Via process id&lt;br&gt;ADPlus.vbs -c ADPlus_Config.xml -p 968&lt;br&gt;
&lt;/li&gt;&lt;li&gt;Via process name&lt;br&gt;ADPlus.vbs -c ADPlus_Config.xml -pn HelloWorldGUI.exe&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Note that ADPlus will warn that the _NT_SYMBOL_PATH environment variable is not set. This is ok&amp;nbsp;as the environment variable&amp;nbsp;is not required for taking snapshots, however, it is required for analysing the snapshot later.&lt;/p&gt;
&lt;p&gt;The following example ADPlus_Config.xml file configures ADPlus for Hang mode (hang mode instructs ADPlus to take the&amp;nbsp;snapshot immediately,&amp;nbsp;crash mode is another option that attaches the debugger to the process, then waits for process to exit before generating the snapshot):&lt;/p&gt;
&lt;p&gt;&amp;lt;ADPlus&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Settings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RunMode&amp;gt;&lt;strong&gt;HANG&lt;/strong&gt;&amp;lt;/RunMode&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Option&amp;gt;Quiet&amp;lt;/Option&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;OutputDir&amp;gt; &lt;strong&gt;C:\Snapshots&lt;/strong&gt; &amp;lt;/OutputDir&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Settings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Load sos.dll --&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;PreCommands&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Cmd&amp;gt; .load C:\Program Files\Debugging Tools for Windows\clr10\sos.dll &amp;lt;/Cmd&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/PreCommands&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Exceptions&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Do a unique mini dump with full heap on every --&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- first chance exception.&amp;nbsp;--&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Config&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Code&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AllExceptions&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Code&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Actions1&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FullDump;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Actions1&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ReturnAction1&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GN&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ReturnAction1&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Config&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Exceptions&amp;gt;&lt;br&gt;&amp;lt;/ADPlus&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Using WinDBG and SOS.dll&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install debugging tools; 
&lt;/li&gt;&lt;li&gt;Add installation location to PATH environment variable; 
&lt;/li&gt;&lt;li&gt;Create a folder to store symbols; 
&lt;/li&gt;&lt;li&gt;Add new environment variable, referencing the symbols folder:&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote dir="ltr"&gt;
&lt;p&gt;Name: _NT_SYMBOL_PATH&lt;br&gt;Value: SRV*&lt;strong&gt;c:\temp\symbols&lt;/strong&gt;* &lt;a href="http://msdl.microsoft.com/download/symbols"&gt;http://msdl.microsoft.com/download/symbols&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This setting is used by WinDbg to dynamically download symbols (pdb files) on demand.&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Launch WinDbg.exe; 
&lt;/li&gt;&lt;li&gt;Open the snapshot using File --&amp;gt;&amp;nbsp;Open Crash Dump; 
&lt;/li&gt;&lt;li&gt;Load SOS.dll by entering the following command: &lt;/li&gt;&lt;/ul&gt;
&lt;blockquote dir="ltr"&gt;
&lt;p&gt;.load C:\Program Files\Debugging Tools for Windows\clr10\sos.dll&lt;/p&gt;&lt;/blockquote&gt;
&lt;p dir="ltr"&gt;Useful WinDbg/SOS.dll commands are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;!help (all available commands)&lt;/div&gt;
&lt;/li&gt;&lt;li&gt;
&lt;div&gt;!help &amp;lt;functionname&amp;gt; (help on provided function)&lt;/div&gt;
&lt;/li&gt;&lt;li&gt;
&lt;div&gt;!clrstack (shows managed stack)&lt;/div&gt;
&lt;/li&gt;&lt;li&gt;
&lt;div&gt;!dae (dumps all managed exceptions, noting that instances of ExecutionEngineException, StackOverflowException and OutOfMemoryException&amp;nbsp; are normal)&lt;/div&gt;
&lt;/li&gt;&lt;li&gt;
&lt;div&gt;!EEStack (shows full stack trace, including managed and unmanaged calls)&lt;/div&gt;
&lt;/li&gt;&lt;li&gt;
&lt;div&gt;!do (dump object, including fields) &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p dir="ltr"&gt;&lt;strong&gt;Further Information&lt;/strong&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;Q286350"&gt;How to use ADPlus to troubleshoot "hangs" and "crashes"&lt;/a&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/DBGrm.asp"&gt;Production Debugging for .NET Framework Applications&lt;/a&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/05/03/Bugslayer/"&gt;Mini Dump Snapshots and the New SOS&lt;/a&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;a href="http://blogs.msdn.com/tess/archive/2005/11/30/498297.aspx"&gt;Tips on Debugging Managed Exceptions with ADPlus and WinDbg&lt;/a&gt;&lt;/p&gt;&lt;img src="http://mattonsoftware.com/aggbug.aspx?PostID=20" width="1" height="1"&gt;</content><author><name>matt</name><uri>http://mattonsoftware.com/members/matt.aspx</uri></author><category term=".NET" scheme="http://mattonsoftware.com/archive/tags/.NET/default.aspx" /><category term="Tools" scheme="http://mattonsoftware.com/archive/tags/Tools/default.aspx" /><category term="Debugging" scheme="http://mattonsoftware.com/archive/tags/Debugging/default.aspx" /></entry><entry><title>OPML Listing</title><link rel="alternate" type="text/html" href="http://mattonsoftware.com/archive/2006/08/05/11.aspx" /><id>http://mattonsoftware.com/archive/2006/08/05/11.aspx</id><published>2006-08-05T06:02:00Z</published><updated>2006-08-05T06:02:00Z</updated><content type="html">From time to time, I'm asked by my colleagues which feeds I subscribe to. The following is an OPML listing of my subscriptions:&lt;br&gt;&lt;br&gt;&lt;a href="/opml/it_subscriptions.xml"&gt;IT Subscriptions.xml&lt;/a&gt;&lt;br&gt;&lt;br&gt;Enjoy!&lt;br&gt;&lt;img src="http://mattonsoftware.com/aggbug.aspx?PostID=11" width="1" height="1"&gt;</content><author><name>matt</name><uri>http://mattonsoftware.com/members/matt.aspx</uri></author><category term="General" scheme="http://mattonsoftware.com/archive/tags/General/default.aspx" /></entry><entry><title>.NET Resources: Updated</title><link rel="alternate" type="text/html" href="http://mattonsoftware.com/archive/2006/05/06/9.aspx" /><id>http://mattonsoftware.com/archive/2006/05/06/9.aspx</id><published>2006-05-06T09:25:00Z</published><updated>2006-05-06T09:25:00Z</updated><content type="html">Managing  hyperlinks via CommunityServer has become too cumbersome, I've shifted these resources to del.icio.us, as follows:&lt;br&gt;&lt;br&gt;&lt;a href="http://del.icio.us/MattDunn"&gt;http://del.icio.us/MattDunn&lt;/a&gt;&lt;br&gt;&lt;br&gt;You can also subscribe to changes via the following feed:&lt;br&gt;&lt;br&gt;&lt;a href="http://del.icio.us/rss/MattDunn"&gt;http://del.icio.us/rss/MattDunn&lt;/a&gt;&lt;br&gt;&lt;br&gt;Many thanks to &lt;a href="http://www.holliday.com.au/"&gt;Grant&lt;/a&gt; for the tip!&lt;br&gt;&lt;img src="http://mattonsoftware.com/aggbug.aspx?PostID=9" width="1" height="1"&gt;</content><author><name>matt</name><uri>http://mattonsoftware.com/members/matt.aspx</uri></author><category term=".NET" scheme="http://mattonsoftware.com/archive/tags/.NET/default.aspx" /></entry><entry><title>Issues Migrating from .NET 1.0 to .NET 1.1</title><link rel="alternate" type="text/html" href="http://mattonsoftware.com/archive/2006/03/06/8.aspx" /><id>http://mattonsoftware.com/archive/2006/03/06/8.aspx</id><published>2006-03-06T11:48:00Z</published><updated>2006-03-06T11:48:00Z</updated><content type="html">Mainstream support for .NET 1.0 &lt;A href="http://support.microsoft.com/lifecycle/?p1=1248"&gt;ends 30 June 2007&lt;/A&gt;. For organisations migrating from .NET 1.0 to .NET 1.1, the following changes are for&amp;nbsp; consideration:&lt;BR&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A class="" title="Backwards Breaking Changes from version 1.0 to 1.1" href="http://www.gotdotnet.com/team/changeinfo/Backwards1.0to1.1/default.aspx" target=""&gt;Backwards Breaking Changes from version 1.0 to 1.1&lt;/A&gt; 
&lt;LI&gt;&lt;A class="" title="API Changes between versions of the .NET Framework: Version 1.0 to Version 1.1" href="http://www.gotdotnet.com/team/upgrade/v1.1/v1.0tov1.1changes.zip" target=""&gt;API Changes between versions of the .NET Framework: Version 1.0 to Version 1.1&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;In addition to the changes listed above, the following issues were encountered during a recent migration activity. &lt;BR&gt;&lt;BR&gt;&lt;B&gt;Web Service &lt;/B&gt;&lt;B&gt;WSDL Generation Issue&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;After upgrading websites from ASP.NET 1.0 to 1.1, the following error message may be encountered&lt;/FONT&gt;:&lt;/FONT&gt;&lt;BR&gt;
&lt;UL&gt;
&lt;P&gt;&lt;I&gt;The XML element named 'HelloWorldMethodResponse' from namespace '&lt;/FONT&gt;&lt;/I&gt;&lt;I&gt;http://www.test.com&lt;/I&gt;&lt;I&gt;' references a method and a type. Change the method's message name using WebMethodAttribute or change the type's root element using the XmlRootAttribute.&lt;/FONT&gt;&lt;/I&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/UL&gt;
&lt;P&gt;This error occurs when the WSDL for a web service is being generated. &lt;/FONT&gt;Note that the error message includes two possible solutions. The first of these solutions which recommends changing the web methods message name using the WebMethodAttribute is undesirable as this will alter the WSDL contract and break existing consumers. The second of the two solutions, applying the XmlRoot attribute to the web methods return type, will resolve the error, however, this requires recompilation of existing web service assemblies.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Properties of web methods that cause this error include:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;The return type is a class or structure;&lt;/FONT&gt; 
&lt;LI&gt;The return type is named [WebMethodName]Response;&lt;BR&gt;&lt;/FONT&gt;
&lt;LI&gt;The web method accepts no parameters (or has parameters that do not serialise to a complex type in the WSDL, for example, strings, integers).&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;This error does not affect the invocation of existing client proxies as they do not consume the WSDL at runtime.&lt;/FONT&gt;&amp;nbsp; This issue will affect development activities when the WSDL is requested, for example, when re-generating client-side proxies using the Visual Studio Add/Update Web Reference feature.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;To resolve this issue, apply the XmlRoot attribute to the return type of the WebMethod, noting the following:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;The ElementName should be of the form [ResponseType]Dummy. Note that no element named HelloWorldMethodResponseDummy will appear in the WSDL;&lt;/FONT&gt; 
&lt;LI&gt;The DataType property should be set to the response type. &lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;An example application of the XmlRoot attribute is as follows:&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;[WebMethod(Description = &lt;FONT color=#a52a2a&gt;"Test Method"&lt;/FONT&gt;)]&lt;/FONT&gt;&lt;BR&gt;&lt;B&gt;&lt;FONT face="Courier New" size=2&gt;[return: XmlRoot(Namespace = &lt;FONT color=#a52a2a&gt;"&lt;/FONT&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;FONT color=#a52a2a&gt;&lt;B&gt;&lt;U&gt;&lt;FONT face="Courier New" size=2&gt;http://www.test.com/&lt;/FONT&gt;&lt;/U&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#a52a2a&gt;"&lt;/FONT&gt;, &lt;/FONT&gt;&lt;/B&gt;&lt;BR&gt;&lt;B&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT face="Courier New" size=2&gt;ElementName = &lt;FONT color=#a52a2a&gt;"HelloWorldMethodResponseDummy"&lt;/FONT&gt;, &lt;/FONT&gt;&lt;/B&gt;&lt;BR&gt;&lt;B&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT face="Courier New" size=2&gt;DataType = &lt;FONT color=#a52a2a&gt;"HelloWorldMethodResponse"&lt;/FONT&gt;, &lt;/FONT&gt;&lt;/B&gt;&lt;BR&gt;&lt;B&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT face="Courier New" size=2&gt;IsNullable = false)]&lt;/FONT&gt;&lt;/B&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#0000ff&gt;public &lt;/FONT&gt;HelloWorldMethodResponse HelloWorldMethod()&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;{&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;return new&lt;/FONT&gt; HelloWorldMethodResponse();&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;B&gt;Activator.CreateInstance() raises a System.MissingMethodException &lt;/B&gt;&lt;B&gt;exception when creating instances of Arrays&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;In order for the Activator.CreateInstance() method to create instances of a given type, the type must define a public default constructor. In .NET 1.0, the Activator does not raise an exception when creating instances of Arrays (which has a private default constructor), however, this issue has been fixed for .NET 1.1 and now raises a System.MissingMethodException ("No parameterless constructor defined for this object") exception as expected.&lt;BR&gt;&lt;BR&gt;To resolve this issue, the Array.CreateInstance() method can be used instead of Activator.CreateInstance(), as follows:&lt;BR&gt;
&lt;BLOCKQUOTE&gt;&lt;FONT face="Courier New" color=#000000 size=2&gt;...&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;if &lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;(typeToInstantiate.IsArray) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type elementType = typeToInstantiate.GetElementType(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; newInstance = Array.CreateInstance(elementType, arraySize); &lt;BR&gt;} &lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;else &lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; newInstance = Activator.CreateInstance(typeToInstantiate); &lt;BR&gt;}&lt;/FONT&gt;&lt;BR&gt;&lt;/BLOCKQUOTE&gt;&lt;img src="http://mattonsoftware.com/aggbug.aspx?PostID=8" width="1" height="1"&gt;</content><author><name>matt</name><uri>http://mattonsoftware.com/members/matt.aspx</uri></author><category term=".NET" scheme="http://mattonsoftware.com/archive/tags/.NET/default.aspx" /></entry><entry><title>Diagnosing Binary Formatter Version Incompatability Problems</title><link rel="alternate" type="text/html" href="http://mattonsoftware.com/archive/2006/02/27/7.aspx" /><id>http://mattonsoftware.com/archive/2006/02/27/7.aspx</id><published>2006-02-28T11:37:00Z</published><updated>2006-02-28T11:37:00Z</updated><content type="html">Clients consuming remoting services hosted in IIS (and therefore
exposed via the HTTP channel) configured to use the binary formatter
may receive the following error:&lt;br&gt;
	&lt;br&gt;
		&lt;i&gt;An unhandled exception of type 'System.Runtime.Serialization. SerializationException' occurred in mscorlib.dll&lt;br&gt;
				&lt;br&gt;Additional information: BinaryFormatter Version incompatibility. Expected Version 1.0. Received Version 1008738336.1684104552.&lt;br&gt;&lt;/i&gt;
		&lt;br&gt;&lt;a target="" class="" title="This article" href="http://www.thinktecture.com/Resources/RemotingFAQ/BINARYVERSIONMISMATCH.html"&gt;This article&lt;/a&gt;
explains that the above error is masking the original exception, and
describes a mechanism for tracing this exception. However, this tracing
process requires opening additional ports on the server, which may be
problematic if the application under inspection is hosted in a secured
environment.&lt;br&gt;
				&lt;br&gt;An alternative to tracing the error is to configure
the remoting service to use the SOAP formatter instead of the binary
formatter, which will allow the original exception to propogate to the
client correctly. The SOAP formatter is the default formatter for the
HTTP channel, so assuming the remoting system is configured
declaratively, the following elements can be removed/commented out of
the configuration files:&lt;br&gt;
						&lt;br&gt;
							&lt;b&gt;Client &lt;br&gt;
									&lt;br&gt;&lt;/b&gt;
							&lt;font color="#a52a2a"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;configuration&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;system.runtime.remoting&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;application&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;channels&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;channel &lt;font color="#ff0000"&gt;ref&lt;/font&gt;&lt;font color="#0000ff"&gt;="http"&amp;gt;&lt;/font&gt;&lt;br&gt;
													&lt;font color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;
													&lt;font color="#008000"&gt;&amp;lt;clientProviders&lt;/font&gt;
													&lt;font color="#008000"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;
													&lt;font color="#008000"&gt;&amp;lt;formatter &lt;/font&gt;
													&lt;font color="#008000"&gt;ref&lt;/font&gt;
													&lt;font color="#008000"&gt;="binary" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;
													&lt;font color="#008000"&gt;&amp;lt;/clientProviders&lt;/font&gt;
													&lt;font color="#008000"&gt;&amp;gt;&lt;/font&gt;
													&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;channel&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;channels&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;application&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;system.runtime.remoting&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;configuration&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;
							&lt;br&gt;
								&lt;br&gt;
									&lt;b&gt;Server&lt;/b&gt;
									&lt;br&gt;
										&lt;br&gt;
											&lt;font color="#a52a2a"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;configuration&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;system.runtime.remoting&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;application&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;channels&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;channel &lt;font color="#ff0000"&gt;ref&lt;/font&gt;&lt;font color="#0000ff"&gt;="http"&lt;/font&gt;&lt;font color="#ff0000"&gt;port&lt;/font&gt;&lt;font color="#0000ff"&gt;="1234"&lt;/font&gt;&amp;gt;&lt;br&gt;
																	&lt;font color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;
																	&lt;font color="#008000"&gt;&amp;lt;serverProviders&lt;/font&gt;
																	&lt;font color="#008000"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;
																	&lt;font color="#008000"&gt;&amp;lt;formatter &lt;/font&gt;
																	&lt;font color="#008000"&gt;ref&lt;/font&gt;
																	&lt;font color="#008000"&gt;="binary"&lt;/font&gt;
																	&lt;font color="#008000"&gt;/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;
																	&lt;font color="#008000"&gt;&amp;lt;/serverProviders&lt;/font&gt;
																	&lt;font color="#008000"&gt;&amp;gt;&lt;/font&gt;
																	&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;channel&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;channels&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;application&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;system.runtime.remoting&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;configuration&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;
											&lt;br&gt;
												&lt;br&gt;
													Also note that custom errors must be disabled 
on the server for the original exception to propogate correctly:&lt;br&gt;
															&lt;br&gt;
																&lt;font color="#a52a2a"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;configuration&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;system.web&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;customErrors &lt;font color="#ff0000"&gt;mode&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#ff0000"&gt;=&lt;font color="#0000ff"&gt;"&lt;/font&gt;&lt;/font&gt;Off" /&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;system.web&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;configuration&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;
													&lt;br&gt;&lt;img src="http://mattonsoftware.com/aggbug.aspx?PostID=7" width="1" height="1"&gt;</content><author><name>matt</name><uri>http://mattonsoftware.com/members/matt.aspx</uri></author><category term=".NET" scheme="http://mattonsoftware.com/archive/tags/.NET/default.aspx" /></entry><entry><title>WinForms use of AssemblyInformationalVersion Attribute </title><link rel="alternate" type="text/html" href="http://mattonsoftware.com/archive/2006/02/25/6.aspx" /><id>http://mattonsoftware.com/archive/2006/02/25/6.aspx</id><published>2006-02-26T06:58:00Z</published><updated>2006-02-26T06:58:00Z</updated><content type="html">The AssemblyInformationalVersion attribute provides a secondary
mechanism for versioning an assembly without modifying the value of the
AssemblyVersion attribute, thus consumers of an assembly do not need to
apply binding redirects or publisher policy when revisions of an
assembly are deployed.&lt;br&gt;&lt;br&gt;Contrary to the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemReflectionAssemblyInformationalVersionAttributeClassTopic.asp"&gt;documentation&lt;/a&gt;:&lt;br&gt;&lt;br&gt;&lt;i&gt;The attribute defined by this class attaches additional version information to 
an assembly for documentation purposes only. &lt;b&gt;This data is never used at runtime.&lt;/b&gt;&lt;/i&gt;&lt;br&gt;&lt;br&gt;this attribute is referenced by the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.application.productversion.aspx"&gt;System.Windows.Forms.Application.ProductVersion&lt;/a&gt; static property, which in turn is referenced by the &lt;a target="" class="" title="CommonAppDataPath" href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.application.commonappdatapath.aspx"&gt;Application.CommonAppDataPath&lt;/a&gt;, &lt;a target="" class="" title="LocalUserAppDataPath" href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.application.localuserappdatapath%28VS.80%29.aspx"&gt;Application.LocalUserAppDataPath&lt;/a&gt; and &lt;a target="" class="" title="UserAppDataPath" href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.application.userappdatapath%28VS.80%29.aspx"&gt;Application.UserAppDataPath&lt;/a&gt; static properties. This is the case for the&amp;nbsp; .NET 1.* and .NET 2.0 class libraries.&lt;br&gt;&lt;br&gt;If
the AssemblyInformationalVersion attribute is applied to the base
executable, the ProductVersion property and its dependent properties
will use this value instead of the AssemblyVersion attribute value.&lt;br&gt;&lt;br&gt;Microsoft states that this behaviour is &lt;a href="http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=00fd41bf-1a6f-4bf6-ac60-8146edd72bf7"&gt;by design&lt;/a&gt;.&lt;br&gt;&lt;img src="http://mattonsoftware.com/aggbug.aspx?PostID=6" width="1" height="1"&gt;</content><author><name>matt</name><uri>http://mattonsoftware.com/members/matt.aspx</uri></author><category term=".NET" scheme="http://mattonsoftware.com/archive/tags/.NET/default.aspx" /></entry><entry><title>Writing Well-Factored Code</title><link rel="alternate" type="text/html" href="http://mattonsoftware.com/archive/2005/08/26/5.aspx" /><id>http://mattonsoftware.com/archive/2005/08/26/5.aspx</id><published>2005-08-27T12:24:00Z</published><updated>2005-08-27T12:24:00Z</updated><content type="html">Coding is a design activity conducted at the lowest level. Similar to
analysis and design patterns aiding their respective phases
of the software development process, coding patterns exist to aid the
implementation phase.&lt;br&gt;&lt;br&gt;
Common coding patterns/techniques include:&lt;br&gt;&lt;ul&gt;&lt;li&gt;Keep methods small, focussing on discrete tasks;&lt;/li&gt;&lt;li&gt;Early exit to reduce nesting;&lt;/li&gt;&lt;li&gt;Use private fields to reduce internal parameter passing;&lt;/li&gt;&lt;li&gt;Use regions as a categorisation mechanism, not to hide code; and&lt;br&gt;&lt;/li&gt;&lt;li&gt;Use internal commenting sparingly.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Keep Methods Small, Focussing on Discrete Tasks&lt;/b&gt;&lt;br&gt;&lt;br&gt;Implementing
methods of short length facilitates functional decomposition, making it
easier to debug errors and more clearly communicate the intent of code.
Consider the following example:&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;public class&lt;/font&gt; Employee&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;public void&lt;/font&gt; DoWork()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;font color="#0000ff"&gt;this&lt;/font&gt;.ProcessOrders();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;this&lt;/font&gt;.TakeBreak();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;this&lt;/font&gt;.SweepFloor();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;font color="#000000"&gt;&lt;br&gt;&lt;br&gt;&lt;/font&gt;Issues associated with this technique include:&lt;br&gt;&lt;ul&gt;&lt;li&gt;Appropriate method length;&lt;/li&gt;&lt;li&gt;
Method naming;&lt;/li&gt;&lt;li&gt;
Focus on allocation of responsibilities;&lt;/li&gt;&lt;li&gt;
Reuse benefits; and&lt;/li&gt;&lt;li&gt;Perceived Performance Implications.&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;Appropriate Method Length&lt;/i&gt;&lt;br&gt;&lt;br&gt;Well-factored methods should be 5-10 lines in length. If methods exceed this length, then further factoring is required.&lt;br&gt;&lt;br&gt;
There will
be instances whereby decomposing methods to achieve this goal does not
add value, examples being methods that perform mapping functions or
rudimentary validation.&lt;br&gt;&lt;br&gt;&lt;i&gt;Method Naming&lt;/i&gt;&lt;br&gt;&lt;br&gt;
It is imperative to name methods that reflect the intent of the
behaviour of the method. Such names should also be kept as short as
possible. Appropriate naming of methods significantly reduces the need
for internal commenting. &lt;br&gt;&lt;br&gt;&lt;i&gt;Focus on Allocation of Responsibilities&lt;/i&gt;&lt;br&gt;&lt;br&gt;
Decomposing methods into smaller functions, or responsibilities, also
makes it easier to see which classes are responsible for what
behaviour. Reallocation of responsibilities often results from method
factoring. This is a key component of &lt;a href="http://www.wirfs-brock.com/Design.html"&gt;Responsibility-Driven Design&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;i&gt;
Reuse Benefits&lt;/i&gt;&lt;br&gt;&lt;br&gt;Factoring
methods into smaller functions makes it
easier for functionality to be reused/overridden/extended by
subclasses. This also avoids the common problem of large methods being
copied into subclasses to change a small part of the method,
leading to future maintenence issues.&lt;br&gt;&lt;br&gt;&lt;i&gt;Perceived Performance Implications&lt;/i&gt;&lt;br&gt;&lt;br&gt;
Factoring methods into smaller functions implies an increase
in the number of method invocations, which can lead to performance
concerns regarding the overall  increased cost of&amp;nbsp; method
invocation. For normal business
code, this low-level concern is unfounded. &lt;br&gt;&lt;br&gt;
If you are writing a core
function for a framework (similar to the core services provided by the
.NET Framework), then the cost of method invocation may become
important. To address this issue, profiling of the problem area should be conducted, then act accordingly.&lt;br&gt;&lt;br&gt;&lt;b&gt;Early Exit to Reduce Nesting&lt;/b&gt;&lt;br&gt;&lt;br&gt;Exiting early from methods reduces nesting and indentation. Consider the following example:&lt;br&gt;&lt;br&gt;Before:&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;public class&lt;/font&gt; Employee&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;public double&lt;/font&gt; CalculateExpectedBonus(&lt;font color="#0000ff"&gt;double &lt;/font&gt;salary)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;double &lt;/font&gt;total = &lt;font color="#a52a2a"&gt;0&lt;/font&gt;;&lt;br&gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;if&lt;/font&gt; ((salary != &lt;font color="#0000ff"&gt;null &lt;/font&gt;) &amp;amp;&amp;amp; (salary &amp;gt; &lt;font color="#a52a2a"&gt;0&lt;/font&gt;))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;if&lt;/font&gt; ((_name != &lt;font color="#0000ff"&gt;null&lt;/font&gt;) &amp;amp;&amp;amp; (_name.StartsWith(&lt;font color="#a52a2a"&gt;"FRED"&lt;/font&gt;)))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; total = salary * (_weight / _height);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; }&lt;br&gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;return &lt;/font&gt;total;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;br&gt;&lt;br&gt;
After:&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;
public class&lt;/font&gt; Employee&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;public double&lt;/font&gt; CalculateExpectedBonus(&lt;font color="#0000ff"&gt;double &lt;/font&gt;salary)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;if &lt;/font&gt;((salary == &lt;font color="#0000ff"&gt;null &lt;/font&gt;) || (salary == &lt;font color="#a52a2a"&gt;0&lt;/font&gt;))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#a52a2a"&gt;0&lt;/font&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if &lt;/font&gt;((_name == &lt;font color="#0000ff"&gt;null&lt;/font&gt;) || (!_name.StartsWith(&lt;font color="#a52a2a"&gt;"FRED"&lt;/font&gt;)))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#a52a2a"&gt;0&lt;/font&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;return &lt;/font&gt;salary * (_weight / _height);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;br&gt;&lt;br&gt;Implementing this technique commonly involves reversing logic and
reduces the need for temporary variables. Both of these factors are
realised in the above example. Guard clauses are the most common
application of this technique.&lt;br&gt;&lt;br&gt;
Methods that have a void return type can use a return; statement. &lt;br&gt;&lt;br&gt;
Note that the idea of early exit is somtimes disliked as methods
should have one point of exit for simplicitly reasons. This
concern is unfounded due to the increased complexity involved in
conforming to the
single exit principal, as demonstrated by the above (albeit contrived)
example. &lt;br&gt;&lt;br&gt;&lt;b&gt;Use Private Fields to Reduce Internal Parameter Passing&lt;/b&gt;&lt;br&gt;&lt;br&gt;
Private fields can be defined to reduce parameter
passing between methods internal to a class. Consider the
following example:&lt;br&gt;&lt;br&gt;
Before:&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;
public class&lt;/font&gt; Order&lt;br&gt;
{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;font color="#0000ff"&gt;public void&lt;/font&gt; Process()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; ArrayList orderItems = &lt;font color="#0000ff"&gt;new &lt;/font&gt;ArrayList();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;this&lt;/font&gt;.RetrieveOrderItems(orderItems);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;this&lt;/font&gt;.ProcessOrderItems(orderItems);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;private void&lt;/font&gt; RetrieveOrderItems(ArrayList orderItems)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&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; SqlDataReader dataReader = command.ExecuteReader();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;while &lt;/font&gt;(dataReader.Read())&lt;br&gt;
&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; OrderItem orderItem = &lt;font color="#0000ff"&gt;new &lt;/font&gt;OrderItem(dataReader);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; orderItems.Add(orderItem);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&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; ...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;private void&lt;/font&gt; ProcessOrderItems(ArrayList orderItems)&lt;br&gt;

&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; &lt;font color="#0000ff"&gt;foreach&lt;/font&gt;(OrderItem item &lt;font color="#0000ff"&gt;in &lt;/font&gt;orderItems)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; OrderItemDispatcher.Instance.Send(item);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;br&gt;&lt;br&gt;
After:&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;
public class&lt;/font&gt; Order&lt;br&gt;

{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;private&lt;/font&gt; ArrayList _orderItems;&lt;br&gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;public &lt;/font&gt;Order()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _orderItems = &lt;font color="#0000ff"&gt;new &lt;/font&gt;ArrayList();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;font color="#0000ff"&gt;public void&lt;/font&gt; Process()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;this&lt;/font&gt;.RetrieveOrderItems();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;this&lt;/font&gt;.ProcessOrderItems();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;private void&lt;/font&gt; RetrieveOrderItems()&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;

&amp;nbsp;&amp;nbsp;&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; SqlDataReader dataReader = command.ExecuteReader();&lt;br&gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;while &lt;/font&gt;(dataReader.Read())&lt;br&gt;

&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; OrderItem orderItem = &lt;font color="#0000ff"&gt;new &lt;/font&gt;OrderItem(dataReader);&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _orderItems.Add(orderItem);&lt;br&gt;

&amp;nbsp;&amp;nbsp;&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; ...&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;private void&lt;/font&gt; ProcessOrderItems()&lt;br&gt;


&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; &lt;font color="#0000ff"&gt;foreach&lt;/font&gt;(OrderItem item &lt;font color="#0000ff"&gt;in &lt;/font&gt;_orderItems)&lt;br&gt;

&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; OrderItemDispatcher.Instance.Send(item);&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;

}&lt;br&gt;&lt;br&gt;As
the number of parameters passed between methods increases, so to
does the complexity of the code. The use of private fields alleviates
this issue.&lt;br&gt;&lt;br&gt;
Note that this technique is sometimes disliked as it becomes more
difficult to identify where a given private field is referenced and
modified, leading to hidden dependencies between methods. Adoption of this
technique is a trade-off for simplicity. Most modern IDEs have
reference identification facilities, which further alleviate this
concern.&lt;br&gt;&lt;br&gt;&lt;b&gt;Use Regions as a Categorisation Mechansism, Not to Hide Code&lt;/b&gt;&lt;br&gt;&lt;br&gt;Regions
are intended to be used to categorise methods, not to hide code.
If&amp;nbsp; the latter is evident, then the code requires refactoring.
Common uses of regions include categorisation of Constructors, Private
Fields, Private Methods and Public Methods, as demonstrated in my
earlier article &lt;a href="http://mattonsoftware.com/archive/2005/07/25/4.aspx"&gt;Implementing the State Pattern in C#&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Generated code is an exception to this rule.&lt;br&gt;&lt;br&gt;&lt;b&gt;Use Internal Commenting Sparingly&lt;/b&gt;&lt;br&gt;&lt;br&gt;Internal
comments should be used sparingly, and only where the intent of a
statement is not obvious. Alternatively, the preferred approach is to
factor the statement into a method with an appropriate name
indicating the
intent.&lt;br&gt;&lt;br&gt;Internal comments that state the obvious do not add value, and add 'noise' to the surrounding code. Consider the following
example:&lt;br&gt;&lt;br&gt;&lt;font color="#008000"&gt;// Add the order item to the order&lt;/font&gt;&lt;br&gt;
order.Add(orderItem);&lt;br&gt;&lt;br&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br&gt;&lt;br&gt;
Coding patterns can be applied during the initial development phase and
as part of maintenence activities, and ultimately deter the onset of
software entropy (a.k.a. &lt;a href="http://www.laputan.org/mud/mud.html"&gt;Big Ball of Mud&lt;/a&gt;
software architectures). The adoption of such techniques results in
clearer communication that simplifies the maintainability and extensibility of code.&lt;br&gt;&lt;img src="http://mattonsoftware.com/aggbug.aspx?PostID=5" width="1" height="1"&gt;</content><author><name>matt</name><uri>http://mattonsoftware.com/members/matt.aspx</uri></author><category term="Coding" scheme="http://mattonsoftware.com/archive/tags/Coding/default.aspx" /></entry><entry><title>Implementing the State Pattern in C#</title><link rel="alternate" type="text/html" href="http://mattonsoftware.com/archive/2005/07/25/4.aspx" /><id>http://mattonsoftware.com/archive/2005/07/25/4.aspx</id><published>2005-07-26T13:45:00Z</published><updated>2005-07-26T13:45:00Z</updated><content type="html">Implementing&amp;nbsp;behavior that adapts to changes to the internal state of an object is a difficult task.&amp;nbsp; If not designed correctly, such behavior can contain duplicate/nested conditional logic that is difficult to understand and maintain. &lt;BR&gt;&lt;BR&gt;&lt;B&gt;Overview of the State Pattern&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;The state pattern encapsulates state-based behavior in discrete classes. Responsibilities are identified and delegated to appropriate states, whilst polymorphism eliminates conditional logic, and delegation removes duplication. &lt;BR&gt;&lt;BR&gt;Such factoring simplifies logic and ultimately results in code that is easier to maintain and extend over time. &lt;BR&gt;&lt;BR&gt;&lt;B&gt;Applying the State Pattern&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;Applying the state pattern entails:&lt;BR&gt;
&lt;UL&gt;
&lt;LI&gt;Defining the state machine, including the states and transitions; 
&lt;LI&gt;Defining an abstract base class that includes default implementations for all properties and behavior handled by the state machine; 
&lt;LI&gt;Defining concrete classes for each state which derive from the abstract base class; 
&lt;UL&gt;
&lt;LI&gt;Define properties and methods for each concrete class which override default implementations from the base class;&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Delegating to the state machine from the enclosing class.&lt;/LI&gt;&lt;/UL&gt;Consider the following application of the state pattern.&lt;BR&gt;&lt;BR&gt;&lt;B&gt;An Example, the Order Class&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;An Order can be processed (either successfully or unsuccessfully) or cancelled. &lt;BR&gt;&lt;BR&gt;&lt;B&gt;Defining the State Machine&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;The states (including the initial and final states), and the transitions with respect to the Order class are:&lt;BR&gt;&lt;BR&gt;States: &lt;BR&gt;
&lt;UL&gt;
&lt;LI&gt;&amp;nbsp; New, Processed, Cancelled.&lt;/LI&gt;&lt;/UL&gt;Initial State:&lt;BR&gt;
&lt;UL&gt;
&lt;LI&gt;The New state.&lt;BR&gt;&lt;/LI&gt;&lt;/UL&gt;Final States:&lt;BR&gt;
&lt;UL&gt;
&lt;LI&gt;The Processed and Cancelled states.&lt;/LI&gt;&lt;/UL&gt;Transitions:&lt;BR&gt;
&lt;UL&gt;
&lt;LI&gt;Process() = Successful, between the New and Processed states; 
&lt;LI&gt;Process() = Unsuccessful, both starting and finishing at the New state; 
&lt;LI&gt;Cancel() between the New and Cancelled states.&lt;/LI&gt;&lt;/UL&gt;The complete Order state machine is as follows:&lt;BR&gt;&lt;BR&gt;&lt;IMG id=Order_State_Diagram alt="Order Example State Diagram" src="/Images/Order_Example_State_Machine.JPG" border=0&gt;&lt;BR&gt;&lt;B&gt;Defining the Abstract Base Class&lt;/B&gt;&lt;BR&gt;&lt;FONT color=#000000&gt;&lt;BR&gt;The abstract base class of the state machine is defined as follows:&lt;BR&gt;&lt;/FONT&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color=#000000&gt;Methods corresponding to each of the state transitions are required. These methods will do nothing by default, and will be overridden by subclasses as &lt;/FONT&gt;&lt;FONT color=#000000&gt;appropriate&lt;/FONT&gt;&lt;FONT color=#000000&gt;. Each method will accept a reference to an object of the enclosing class &lt;/FONT&gt;&lt;FONT color=#000000&gt;as a parameter &lt;/FONT&gt;&lt;FONT color=#000000&gt;(the Order class in this example) which they can manipulate if required;&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT color=#000000&gt;For each state, an associated querying property is required, the default implementation of which will return false;&lt;/FONT&gt; 
&lt;LI&gt;The abstract base class, and derived classes, should be marked as internal as they are only intended to be accessed by the enclosing class.&lt;/LI&gt;&lt;/UL&gt;The abstract base class for the Order example will be called OrderState, the implementation of which is as follows:&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;internal abstract class&lt;/FONT&gt; OrderState&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#region&lt;/FONT&gt; Public Properties&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public virtual bool&lt;/FONT&gt; IsNew&lt;BR&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;get &lt;/FONT&gt;{ &lt;FONT color=#0000ff&gt;return false&lt;/FONT&gt;; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; public virtual bool &lt;/FONT&gt;IsProcessed&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get &lt;/FONT&gt;{ &lt;FONT color=#0000ff&gt;return false&lt;/FONT&gt;; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public virtual bool&lt;/FONT&gt; IsCancelled&lt;BR&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;get &lt;/FONT&gt;{ &lt;FONT color=#0000ff&gt;return false&lt;/FONT&gt;; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#endregion&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#region&lt;/FONT&gt; Public Methods&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public virtual void&lt;/FONT&gt; Process(Order order)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&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; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; public virtual void&lt;/FONT&gt; Cancel(Order order)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&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; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; #endregion&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&lt;B&gt;Defining the Concrete Subclasses&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#000000&gt;Concrete subclasses for each of the states are defined as follows:&lt;BR&gt;&lt;/FONT&gt;
&lt;UL&gt;
&lt;LI&gt;Each subclass is implemented as a singleton, and does not maintain state for thread-safety reasons. See &lt;A href="http://www.yoda.arachsys.com/csharp/singleton.html"&gt;Implementing the Singleton Pattern in C#&lt;/A&gt; for an in-depth discussion of thread-safe singleton implementations. 
&lt;LI&gt;Each subclass overrides the appropriate querying property to return true; 
&lt;LI&gt;Each subclass may override the state transition methods to perform desired behavior. These implementations will also reset the current state of the object of the enclosing class (which is the main reason the object reference is provided).&lt;/LI&gt;&lt;/UL&gt;The concrete subclasses for the Order example are called OrderNewState, OrderProcessedState and OrderCancelledState, the implementation of which are as follows:&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; internal class&lt;/FONT&gt; OrderNewState : OrderState&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; #region&lt;/FONT&gt; Private Fields&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;private static readonly&lt;/FONT&gt; OrderNewState _instance = &lt;FONT color=#0000ff&gt;new &lt;/FONT&gt;OrderNewState();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#endregion&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#region &lt;/FONT&gt;Constructor&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;private &lt;/FONT&gt;OrderNewState()&lt;BR&gt;&amp;nbsp;&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; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#endregion&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#region&lt;/FONT&gt; Public Static Properties&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; public static&lt;/FONT&gt; OrderNewState Instance&lt;BR&gt;&amp;nbsp;&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;&amp;nbsp; &lt;FONT color=#0000ff&gt;get &lt;/FONT&gt;{ &lt;FONT color=#0000ff&gt;return &lt;/FONT&gt;_instance; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#endregion&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#region&lt;/FONT&gt; Public Properties&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public override bool&lt;/FONT&gt; IsNew&lt;BR&gt;&amp;nbsp;&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;&amp;nbsp; &lt;FONT color=#0000ff&gt;get &lt;/FONT&gt;{&lt;FONT color=#0000ff&gt; return true&lt;/FONT&gt;; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; #endregion&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; #region&lt;/FONT&gt; Public Methods&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; public override void &lt;/FONT&gt;Process(Order order)&lt;BR&gt;&amp;nbsp;&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;&amp;nbsp; &lt;FONT color=#0000ff&gt;bool &lt;/FONT&gt;success = &lt;FONT color=#0000ff&gt;false&lt;/FONT&gt;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; // Do Processing...&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;if &lt;/FONT&gt;(success)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; order.State = OrderProcessedState.Instance;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;base&lt;/FONT&gt;.Process(order);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public override void &lt;/FONT&gt;Cancel(Order order)&lt;BR&gt;&amp;nbsp;&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;&amp;nbsp; order.State = OrderCancelledState.Instance;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;base&lt;/FONT&gt;.Cancel(order);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#endregion&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; internal class&lt;/FONT&gt; OrderProcessedState : OrderState&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; #region&lt;/FONT&gt; Private Fields&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; private static readonly&lt;/FONT&gt; OrderProcessedState _instance = &lt;FONT color=#0000ff&gt;new &lt;/FONT&gt;OrderProcessedState();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; #endregion&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#region&lt;/FONT&gt; Constructor&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;private &lt;/FONT&gt;OrderProcessedState()&lt;BR&gt;&amp;nbsp;&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; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#endregion&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#region &lt;/FONT&gt;Public Static Properties&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; public static&lt;/FONT&gt; OrderProcessedState Instance&lt;BR&gt;&amp;nbsp;&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;&amp;nbsp; &lt;FONT color=#0000ff&gt;get &lt;/FONT&gt;{ &lt;FONT color=#0000ff&gt;return &lt;/FONT&gt;_instance; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#endregion&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#region&lt;/FONT&gt; Public Properties&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public new bool&lt;/FONT&gt; IsProcessed&lt;BR&gt;&amp;nbsp;&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;&amp;nbsp; &lt;FONT color=#0000ff&gt;get &lt;/FONT&gt;{ &lt;FONT color=#0000ff&gt;return true&lt;/FONT&gt;; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#endregion&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; internal class &lt;/FONT&gt;OrderCancelledState : OrderState&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#region&lt;/FONT&gt; Private Fields&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;private static readonly&lt;/FONT&gt; OrderCancelledState _instance = &lt;FONT color=#0000ff&gt;new &lt;/FONT&gt;OrderCancelledState();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; #endregion&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#region&lt;/FONT&gt; Constructor&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;private &lt;/FONT&gt;OrderCancelledState()&lt;BR&gt;&amp;nbsp;&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; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#endregion&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; #region &lt;/FONT&gt;Public Static Properties&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public static&lt;/FONT&gt; OrderCancelledState Instance&lt;BR&gt;&amp;nbsp;&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;&amp;nbsp; &lt;FONT color=#0000ff&gt;get &lt;/FONT&gt;{ &lt;FONT color=#0000ff&gt;return &lt;/FONT&gt;_instance; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; #endregion&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#region &lt;/FONT&gt;Public Properties&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public override bool&lt;/FONT&gt; IsCancelled&lt;BR&gt;&amp;nbsp;&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;&amp;nbsp; &lt;FONT color=#0000ff&gt;get &lt;/FONT&gt;{ &lt;FONT color=#0000ff&gt;return true&lt;/FONT&gt;; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; #endregion&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&lt;B&gt;Delegating to the State Machine from the Enclosing Class&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;The enclosing class with which the state machine is associated is defined as follows:&lt;BR&gt;
&lt;UL&gt;
&lt;LI&gt;A private field of the same type as the abstract base class must be defined;
&lt;LI&gt;An initialisation method (typically the constructor) must set the private field to the initial state; 
&lt;LI&gt;The state transition methods and querying properties previously defined for the abstract base class must be defined, which delegate to the private field. The implementation of the state transition methods must pass along a reference to the enclosing class (i.e. the Order); 
&lt;LI&gt;An internal property state setter must be defined so that the concrete state subclasses can reset the state of the enclosing class as appropriate.&lt;/LI&gt;&lt;/UL&gt;The Order class is as follows:&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public class&lt;/FONT&gt; Order&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; #region&lt;/FONT&gt; Private Fields&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;private &lt;/FONT&gt;OrderState _state;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#endregion&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; #region&lt;/FONT&gt; Constructors&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public &lt;/FONT&gt;Order()&lt;BR&gt;&amp;nbsp;&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;&amp;nbsp; _state = OrderNewState.Instance;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; #endregion&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#region &lt;/FONT&gt;Public Properties&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; public bool &lt;/FONT&gt;IsNew&lt;BR&gt;&amp;nbsp;&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;&amp;nbsp; &lt;FONT color=#0000ff&gt;get &lt;/FONT&gt;{ &lt;FONT color=#0000ff&gt;return &lt;/FONT&gt;_state.IsNew; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public bool&lt;/FONT&gt; IsProcessed&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; get &lt;/FONT&gt;{ &lt;FONT color=#0000ff&gt;return &lt;/FONT&gt;_state.IsProcessed; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public bool&lt;/FONT&gt; IsCancelled&lt;BR&gt;&amp;nbsp;&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;&amp;nbsp; &lt;FONT color=#0000ff&gt;get &lt;/FONT&gt;{ &lt;FONT color=#0000ff&gt;return &lt;/FONT&gt;_state.IsCancelled; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#endregion&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; #region &lt;/FONT&gt;Internal Properties&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;internal &lt;/FONT&gt;OrderState State&lt;BR&gt;&amp;nbsp;&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;&amp;nbsp; &lt;FONT color=#0000ff&gt;set &lt;/FONT&gt;{ _state = value; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#endregion&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#region&lt;/FONT&gt; Public Methods&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public void&lt;/FONT&gt; Process()&lt;BR&gt;&amp;nbsp;&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;&amp;nbsp; _state.Process(&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt; public void &lt;/FONT&gt;Cancel()&lt;BR&gt;&amp;nbsp;&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;&amp;nbsp; _state.Cancel(&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;#endregion&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&lt;B&gt;The Complete Order Class Model&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG id=Order_Class_Diagram alt="Order Example Class Diagram" src="/Images/Order_Example_Class_Diagram.JPG" border=0&gt;&lt;BR&gt;&lt;B&gt;&lt;BR&gt;When to Use the State Pattern&lt;BR&gt;&lt;BR&gt;&lt;/B&gt;The state pattern can be used when there is significant state-based behaviour associated with a class. &lt;BR&gt;&lt;BR&gt;In other cases, continue to use conditional expressions (typically, with the aid of enumerations). &lt;BR&gt;&lt;BR&gt;&lt;B&gt;Further Uses&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;The above techniques are also applicable to implementation of the Strategy pattern. Implementation of&amp;nbsp;the State and Strategy patterns is exactly the same, however, the intent of each pattern is different. The State pattern is used to model finite state machines, whilst the Strategy pattern is used to implement pluggable algorithms. Note that implementation of the Strategy pattern may not require querying properties.&lt;BR&gt;&lt;BR&gt;&lt;B&gt;Source Code for Examples&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#000000&gt;A Visual Studio .NET 2003 solution containing the above example code can be downloaded &lt;a href="http://mattonsoftware.com/Samples/OrderStatePatternExample.zip"&gt;here&lt;/A&gt;.&lt;/FONT&gt;&lt;BR&gt;&lt;img src="http://mattonsoftware.com/aggbug.aspx?PostID=4" width="1" height="1"&gt;</content><author><name>matt</name><uri>http://mattonsoftware.com/members/matt.aspx</uri></author><category term="Patterns" scheme="http://mattonsoftware.com/archive/tags/Patterns/default.aspx" /></entry><entry><title>Greetings</title><link rel="alternate" type="text/html" href="http://mattonsoftware.com/archive/2005/07/25/3.aspx" /><id>http://mattonsoftware.com/archive/2005/07/25/3.aspx</id><published>2005-07-26T13:27:00Z</published><updated>2005-07-26T13:27:00Z</updated><content type="html">
                    I'm Matt Dunn, a twenty-something IT professional based in Canberra, Australia. &lt;br&gt;
&lt;br&gt;
My
intent is to illustrate solutions to software development issues,
focussing on Object-Oriented software development, with examples
primarily implemented in C#.&lt;br&gt;
&lt;br&gt;

Enjoy!&lt;img src="http://mattonsoftware.com/aggbug.aspx?PostID=3" width="1" height="1"&gt;</content><author><name>matt</name><uri>http://mattonsoftware.com/members/matt.aspx</uri></author><category term="General" scheme="http://mattonsoftware.com/archive/tags/General/default.aspx" /></entry></feed>