<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">
  <channel>
    <title>James Goodfellow</title>
    <description>Coding Bits and Pieces</description>
    <link>http://jamesgoodfellow.com/blog/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.Net Syndication Generator 1.0.0.0 (http://dotnetblogengine.net/)</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://jamesgoodfellow.com/blog/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>James Goodfellow's Technical Blog</dc:creator>
    <dc:title>James Goodfellow</dc:title>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/JamesGoodfellow" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="jamesgoodfellow" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>Accurately Detect Operating System Version In C#</title>
      <description>&lt;p&gt;
.Net&amp;#39;s &lt;a href="http://msdn.microsoft.com/en-us/library/system.environment.osversion.aspx" target="_blank" title="http://msdn.microsoft.com/en-us/library/system.environment.osversion.aspx"&gt;Environment.OsVersion&lt;/a&gt; object gives us the version information of the OS we are running under - its Platform property gives us the OS family and we can then use the Version property to narrow down the specific OS.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://support.microsoft.com/kb/304283" target="_blank" title="http://support.microsoft.com/kb/304283"&gt;This&lt;/a&gt; article from Microsoft outlines a function that detects the current OS version but &lt;a href="http://blogs.msdn.com/imtesty/archive/2008/07/02/test-automation-programmatic-platform-profiling.aspx" target="_blank" title="http://blogs.msdn.com/imtesty/archive/2008/07/02/test-automation-programmatic-platform-profiling.aspx"&gt;Bj Rollison&lt;/a&gt; has a more up to date implementation that includes detection of Windows 2003 Server and Vista.&lt;br /&gt;
&lt;br /&gt;
Below is my implementation that uses an Enum to identify the OS. You can access the Description attribute of the Enum to get a more readable string representation of the OS - I&amp;#39;ve included a helper method for this too :)&lt;br /&gt;
&lt;br /&gt;
Jimmy
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Reflection;&lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Utils&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;// custom enum of operating systems to allow for easy comparisons&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; OSVersion&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; [Description(&amp;quot;Unknown&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Unknown,&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; [Description(&amp;quot;Windows 95&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows95,&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; [Description(&amp;quot;Windows 95 Service Pack 1&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows95SP1,&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; [Description(&amp;quot;Windows 95 OSR 2.0&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows95OSR20,&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; [Description(&amp;quot;Windows 95 OSR 2.1&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows95OSR21,&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; [Description(&amp;quot;Windows 95 OSR 2.5&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows95OSR25,&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; [Description(&amp;quot;Windows 98&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows98,&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; [Description(&amp;quot;Windows 98 Second Edition&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows98SE,&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; [Description(&amp;quot;Windows ME&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WindowsMe,&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; [Description(&amp;quot;Windows NT 3.51&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WindowsNT351,&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; [Description(&amp;quot;Windows NT 4.0&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WindowsNT4,&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; [Description(&amp;quot;Windows 2000&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows2000,&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; [Description(&amp;quot;Windows XP&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WindowsXP,&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; [Description(&amp;quot;Windows 2003 Server&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WindowsXP2K3,&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; [Description(&amp;quot;Windows Vista&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WindowsVista,&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; [Description(&amp;quot;Windows Vista Service Pack 1&amp;quot;)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WindowsVistaSP1,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; OSHelper&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;span class="rem"&gt;// Major NT Kernel Versions&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; WINDOWS_NT6_KERNEL = 6;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; WINDOWS_NT4_KERNEL = 4;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; WINDOWS_NT5_KERNEL = 5;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;// Minor NT Kernel Versions&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; WINDOWS_2000 = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; WINDOWS_XP = 1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; WINDOWS_XP2003 = 2;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;// Service Packs&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; SP1 = &amp;quot;Service Pack 1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;// Minor Win9x Kernel Versions&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; WINDOWS_95 = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; WINDOWS_95_SP1 = &amp;quot;950A&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; WINDOWS_95_OSR = 3;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; WINDOWS_95_OSR2X = &amp;quot;950B&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; WINDOWS_95_OSR25 = &amp;quot;950C&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; WINDOWS_98 = 10;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; WINDOWS_98SE = &amp;quot;2222A&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; WINDOWS_ME = 90;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// Gets the version of the Operating System&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;see cref=&amp;quot;System.String&amp;quot;/&amp;gt; &amp;lt;/returns&amp;gt;&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; OSVersion GetOSVersion()&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; OperatingSystem osVersionInfo = Environment.OSVersion;&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; OSVersion ret = OSVersion.Unknown;&lt;br /&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 class="kwrd"&gt;switch&lt;/span&gt; (osVersionInfo.Platform)&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; &lt;span class="kwrd"&gt;case&lt;/span&gt; PlatformID.Win32NT:&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;&amp;nbsp; &lt;span class="kwrd"&gt;switch&lt;/span&gt; (osVersionInfo.Version.Major)&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;// Windows NT 4.0&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; &lt;span class="kwrd"&gt;case&lt;/span&gt; WINDOWS_NT4_KERNEL:&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = OSVersion.WindowsNT4;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;break&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;case&lt;/span&gt; WINDOWS_NT5_KERNEL:&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;switch&lt;/span&gt; (osVersionInfo.Version.Minor)&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;&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;&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 class="rem"&gt;// Windows 2000&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;case&lt;/span&gt; WINDOWS_2000:&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;&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; ret = OSVersion.Windows2000;&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;&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 class="kwrd"&gt;break&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;&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 class="rem"&gt;// Windows Xp&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;case&lt;/span&gt; WINDOWS_XP:&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;&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; ret = OSVersion.WindowsXP;&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;&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 class="kwrd"&gt;break&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;&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 class="rem"&gt;// Windows Xp 2003 Server&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;case&lt;/span&gt; WINDOWS_XP2003:&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;&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; ret = OSVersion.WindowsXP2K3;&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;&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 class="kwrd"&gt;break&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;&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;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;break&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;// Windows Vista and Server 2008&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; &lt;span class="kwrd"&gt;case&lt;/span&gt; WINDOWS_NT6_KERNEL:&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (osVersionInfo.ServicePack == SP1)&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;&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; ret = OSVersion.WindowsVistaSP1;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;else&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;&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; ret = OSVersion.WindowsVista;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;break&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;break&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;case&lt;/span&gt; PlatformID.Win32Windows:&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;&amp;nbsp; &lt;span class="kwrd"&gt;switch&lt;/span&gt; (osVersionInfo.Version.Minor)&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;// Windows 95, OSR 1.0, OSR 2.0&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; &lt;span class="kwrd"&gt;case&lt;/span&gt; WINDOWS_95:&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (osVersionInfo.Version.Revision.ToString() == WINDOWS_95_SP1)&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;&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; ret = OSVersion.Windows95SP1;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (osVersionInfo.Version.Revision.ToString() == WINDOWS_95_OSR2X)&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;&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; ret = OSVersion.Windows95OSR20;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;else&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;&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; ret = OSVersion.Windows95;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;break&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;// Windows 95 OSR 2.1, OSR 2.5&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; &lt;span class="kwrd"&gt;case&lt;/span&gt; WINDOWS_95_OSR:&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (osVersionInfo.Version.Revision.ToString() == WINDOWS_95_OSR2X)&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;&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; ret = OSVersion.Windows95OSR21;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (osVersionInfo.Version.Revision.ToString() == WINDOWS_95_OSR25)&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;&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; ret = OSVersion.Windows95OSR25;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;break&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;// Windows 98 and Windows 98 Second Edition&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; &lt;span class="kwrd"&gt;case&lt;/span&gt; WINDOWS_98:&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (osVersionInfo.Version.Revision.ToString() == WINDOWS_98SE)&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;&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; ret = OSVersion.Windows98SE;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;else&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;&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; ret = OSVersion.Windows98;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;break&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;// Windows ME&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; &lt;span class="kwrd"&gt;case&lt;/span&gt; WINDOWS_ME:&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = OSVersion.WindowsMe;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;break&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;break&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;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 class="kwrd"&gt;return&lt;/span&gt; ret;&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;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// Allows the discovery of an OSVersion enumeration text value based on the &amp;lt;c&amp;gt;DescriptionAttribute&amp;lt;/c&amp;gt;&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;e&amp;quot;&amp;gt;The enum to get the reader friendly text value for.&amp;lt;/param&amp;gt;&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;see cref=&amp;quot;System.String&amp;quot;/&amp;gt; &amp;lt;/returns&amp;gt;&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetOSVersionDescription(OSVersion version)&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;span class="kwrd"&gt;string&lt;/span&gt; ret = String.Empty;&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; Type t = version.GetType();&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; MemberInfo[] members = t.GetMember(version.ToString());&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; &lt;span class="kwrd"&gt;if&lt;/span&gt; (members != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; members.Length == 1)&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; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] attrs = members[0].GetCustomAttributes(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(DescriptionAttribute), &lt;span class="kwrd"&gt;false&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;&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; &lt;span class="kwrd"&gt;if&lt;/span&gt; (attrs.Length == 1)&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;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;&amp;nbsp; ret = ((DescriptionAttribute)attrs[0]).Description;&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;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;
&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 class="kwrd"&gt;return&lt;/span&gt; ret;&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;/p&gt;
&lt;/div&gt;&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
</description>
      <link>http://jamesgoodfellow.com/blog/post/Accurately-Detect-Operating-System-Version-In-C.aspx</link>
      <author>jamesgoody</author>
      <comments>http://jamesgoodfellow.com/blog/post/Accurately-Detect-Operating-System-Version-In-C.aspx#comment</comments>
      <guid>http://jamesgoodfellow.com/blog/post.aspx?id=3d34cc86-9eb2-4b81-a69a-ce23cd53d044</guid>
      <pubDate>Fri, 17 Oct 2008 10:33:00 -0800</pubDate>
      <category>Microsoft .Net</category>
      <dc:publisher>jamesgoody</dc:publisher>
      <pingback:server>http://jamesgoodfellow.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://jamesgoodfellow.com/blog/post.aspx?id=3d34cc86-9eb2-4b81-a69a-ce23cd53d044</pingback:target>
      <slash:comments>642</slash:comments>
      <trackback:ping>http://jamesgoodfellow.com/blog/trackback.axd?id=3d34cc86-9eb2-4b81-a69a-ce23cd53d044</trackback:ping>
      <wfw:comment>http://jamesgoodfellow.com/blog/post/Accurately-Detect-Operating-System-Version-In-C.aspx#comment</wfw:comment>
      <wfw:commentRss>http://jamesgoodfellow.com/blog/syndication.axd?post=3d34cc86-9eb2-4b81-a69a-ce23cd53d044</wfw:commentRss>
    </item>
    <item>
      <title>Ajax .Net TabControl In IE: 1 Pixel Gap Between Tab Header and Body</title>
      <description>Ok, so this was weird and took a while to track down. After setting some styles for a TabControl, a 1 pixel gap appeared between the tabs in the header of the control and the tab body:&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://jamesgoodfellow.com/blog/image.axd?picture=tabControlGap.gif" alt="" /&gt;&lt;br /&gt;
&lt;br /&gt;
Firefox had no issue as usual. After the traditional flurry of setting margins and padding to 0 on every block level element in existence, I was beginning to tear my hair out. Fortunately I had another site that had a similarly styled TabControl that didn&amp;#39;t have this issue and by process of elimination I found the offending tag. &lt;br /&gt;
&lt;br /&gt;
To my surprise it all came down to the particular font I had chosen! I changed the font-family style for my body tag from &amp;#39;Verdana&amp;#39; to &amp;#39;Arial&amp;#39; and everything was fine! After a bit more investigation I found that it only happened when using &amp;#39;Verdana&amp;#39; for certain units of the font-size style - If I was using &amp;#39;pt&amp;#39; units the issue appeared but it was fixed by changing to &amp;#39;px&amp;#39; units. This way I could continue using Verdana. Has anyone else seen something like this before?&lt;br /&gt;
&lt;br /&gt;
Jimmy&lt;br /&gt;
</description>
      <link>http://jamesgoodfellow.com/blog/post/Ajax-Net-TabControl-In-IE-1-Pixel-Gap-Between-Tab-Header-and-Body.aspx</link>
      <author>jamesgoody</author>
      <comments>http://jamesgoodfellow.com/blog/post/Ajax-Net-TabControl-In-IE-1-Pixel-Gap-Between-Tab-Header-and-Body.aspx#comment</comments>
      <guid>http://jamesgoodfellow.com/blog/post.aspx?id=c7d32924-7724-4546-82eb-74031c56bb7c</guid>
      <pubDate>Mon, 06 Oct 2008 12:54:00 -0800</pubDate>
      <category>Ajax</category>
      <category>ASP.Net</category>
      <category>CSS</category>
      <category>Internet Explorer</category>
      <dc:publisher>jamesgoody</dc:publisher>
      <pingback:server>http://jamesgoodfellow.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://jamesgoodfellow.com/blog/post.aspx?id=c7d32924-7724-4546-82eb-74031c56bb7c</pingback:target>
      <slash:comments>523</slash:comments>
      <trackback:ping>http://jamesgoodfellow.com/blog/trackback.axd?id=c7d32924-7724-4546-82eb-74031c56bb7c</trackback:ping>
      <wfw:comment>http://jamesgoodfellow.com/blog/post/Ajax-Net-TabControl-In-IE-1-Pixel-Gap-Between-Tab-Header-and-Body.aspx#comment</wfw:comment>
      <wfw:commentRss>http://jamesgoodfellow.com/blog/syndication.axd?post=c7d32924-7724-4546-82eb-74031c56bb7c</wfw:commentRss>
    </item>
    <item>
      <title>Open .dtsx For Debug - Why The Debug Buttons Are Disabled</title>
      <description>&lt;p&gt;
Thanks to &lt;a href="http://blogs.msdn.com/michen/archive/2007/03/15/ssis-debug-disabled.aspx" target="_blank" title="http://blogs.msdn.com/michen/archive/2007/03/15/ssis-debug-disabled.aspx"&gt;Michael Entin&amp;#39;s helpful article&lt;/a&gt; this was one of those head slapping moments. He explains that if you load a .dtsx file standalone into Visual Studio the debug buttons are disabled because it is the project configuration that facilitates these. So the solution is to create a new SSIS Project and add your existing package to it. Duh!
&lt;/p&gt;
&lt;p&gt;
Jimmy 
&lt;/p&gt;
</description>
      <link>http://jamesgoodfellow.com/blog/post/Open-dtsx-For-Debug---Why-The-Debug-Buttons-Are-Disabled.aspx</link>
      <author>jamesgoody</author>
      <comments>http://jamesgoodfellow.com/blog/post/Open-dtsx-For-Debug---Why-The-Debug-Buttons-Are-Disabled.aspx#comment</comments>
      <guid>http://jamesgoodfellow.com/blog/post.aspx?id=c10c4b2a-19b8-4d0a-8a98-e322b65a4d30</guid>
      <pubDate>Thu, 25 Sep 2008 14:18:00 -0800</pubDate>
      <category>SQL Server Integration Services</category>
      <dc:publisher>jamesgoody</dc:publisher>
      <pingback:server>http://jamesgoodfellow.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://jamesgoodfellow.com/blog/post.aspx?id=c10c4b2a-19b8-4d0a-8a98-e322b65a4d30</pingback:target>
      <slash:comments>179</slash:comments>
      <trackback:ping>http://jamesgoodfellow.com/blog/trackback.axd?id=c10c4b2a-19b8-4d0a-8a98-e322b65a4d30</trackback:ping>
      <wfw:comment>http://jamesgoodfellow.com/blog/post/Open-dtsx-For-Debug---Why-The-Debug-Buttons-Are-Disabled.aspx#comment</wfw:comment>
      <wfw:commentRss>http://jamesgoodfellow.com/blog/syndication.axd?post=c10c4b2a-19b8-4d0a-8a98-e322b65a4d30</wfw:commentRss>
    </item>
    <item>
      <title>Nunit Doesn't Refresh References</title>
      <description>&lt;p&gt;
&lt;em&gt;Update: I found today that if you load the options dialog of Nunit and tick &amp;#39;Disable Shadow Copy (default: Enabled)&amp;#39; Nunit correctly loads the latest references. You need to unload the test project from Nunit when building the dll in Visual Studio to release Nunit&amp;#39;s lock on the file. Mystery solved!&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
We came across a strange problem with Nunit today after innocently removing a property from a class. The dll that contained this class was referenced by our Nunit test dll. After reloading the Nunit test dll in the Nunit GUI our tests kept failing, complaining about the property that had been removed.&lt;br /&gt;
&lt;br /&gt;
Obviously an old version of the referenced dll was being loaded, but where from? We loaded every instance of the dll from every &amp;#39;bin&amp;#39; folder we could find in our development environment into Reflector, and the property we had removed was correctly missing.&lt;br /&gt;
&lt;br /&gt;
After briefly discussing how spooky and mysterious computers are (this was way better than iRobot :P) we downloaded &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx" target="_blank" title="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx"&gt;process explorer&lt;/a&gt;. We did a search for our dll (under the &amp;#39;Find&amp;#39; menu) and sure enough it had been loaded by the Nunit GUI, but it was retrieving the file from:&lt;br /&gt;
&lt;br /&gt;
&amp;#39;c:\documents and settings\[user]\local settings\application data\assembly\dl2\a0y61pov.hde\43h4p05e.rd6\cf3437ea\7bb966b2_bb1ec901\myDLL.dll&amp;#39;&lt;br /&gt;
&lt;br /&gt;
A bit of a mouthful to say the least. After deleting this file and reloading the Nunit test, everything worked perfectly.&lt;br /&gt;
&lt;br /&gt;
Interestingly, Nunit updated the dll in the directory above when the file was missing, but not when the file had been modified. I&amp;#39;m guessing it&amp;#39;s some inherent behaviour of Winforms apps to cache a version of referenced dlls but why wouldn&amp;#39;t it do the essential house-keeping and refresh modified dll&amp;#39;s? If anyone could provide some clarification that would be fantastic. For now we&amp;#39;re putting it down to the &amp;#39;ghosts in the machine&amp;#39;...ooooooo spooky!&lt;br /&gt;
&lt;br /&gt;
I found this &lt;a href="http://devlicio.us/blogs/ziemowit_skowronski/archive/2007/06/28/debugging-assembly-loading-errors.aspx" target="_blank" title="http://devlicio.us/blogs/ziemowit_skowronski/archive/2007/06/28/debugging-assembly-loading-errors.aspx"&gt;post from Jimmy Skowronski&lt;/a&gt; after fixing the issue - he had the same problem and describes a good way of viewing what dlls are being loaded by projects in Visual Studio. Why Nunit doesn&amp;#39;t update the dll itself is still a mystery.&lt;br /&gt;
&lt;br /&gt;
Jimmy
&lt;/p&gt;
</description>
      <link>http://jamesgoodfellow.com/blog/post/Nunit-Doesnt-Refresh-References.aspx</link>
      <author>jamesgoody</author>
      <comments>http://jamesgoodfellow.com/blog/post/Nunit-Doesnt-Refresh-References.aspx#comment</comments>
      <guid>http://jamesgoodfellow.com/blog/post.aspx?id=24b79d12-afbd-4faf-ba70-30a355459a3e</guid>
      <pubDate>Wed, 24 Sep 2008 16:16:00 -0800</pubDate>
      <category>Microsoft .Net</category>
      <category>Nunit</category>
      <dc:publisher>jamesgoody</dc:publisher>
      <pingback:server>http://jamesgoodfellow.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://jamesgoodfellow.com/blog/post.aspx?id=24b79d12-afbd-4faf-ba70-30a355459a3e</pingback:target>
      <slash:comments>597</slash:comments>
      <trackback:ping>http://jamesgoodfellow.com/blog/trackback.axd?id=24b79d12-afbd-4faf-ba70-30a355459a3e</trackback:ping>
      <wfw:comment>http://jamesgoodfellow.com/blog/post/Nunit-Doesnt-Refresh-References.aspx#comment</wfw:comment>
      <wfw:commentRss>http://jamesgoodfellow.com/blog/syndication.axd?post=24b79d12-afbd-4faf-ba70-30a355459a3e</wfw:commentRss>
    </item>
    <item>
      <title>Renaming A Column in SQLCE</title>
      <description>&lt;div&gt;
&lt;font face="Arial" size="2"&gt;&lt;span style="font-size: 10pt; font-family: Arial"&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Arial" size="2"&gt;&lt;span style="font-size: 10pt; font-family: Arial"&gt;Because of Compact Edition&amp;#39;s limited features, to rename a
column you need to create a new column with the desired name, copy any data
from the old column to the new, and finally delete the old column. The example
below renames an integer column in SQLCE.&lt;/span&gt;&lt;/font&gt;
&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;
&lt;font face="Arial" size="2"&gt;&lt;span style="font-size: 10pt; font-family: Arial"&gt;Jimmy&lt;/span&gt;&lt;/font&gt;
&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;
&lt;font face="Arial" size="2"&gt;&lt;span style="font-size: 10pt; font-family: Arial"&gt;&lt;div class="code"&gt;
[code:vb]&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE MyTable ADD NewColumnName &lt;span class="kwrd"&gt;INTEGER&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
UPDATE MyTable &lt;span class="kwrd"&gt;SET&lt;/span&gt; NewColumnName = OldColumnName&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE MyTable DROP COLUMN OldColumnName[/code]&lt;/div&gt;&lt;/span&gt;&lt;/font&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;/div&gt;
</description>
      <link>http://jamesgoodfellow.com/blog/post/Renaming-A-Column-in-SQLCE.aspx</link>
      <author>jamesgoody</author>
      <comments>http://jamesgoodfellow.com/blog/post/Renaming-A-Column-in-SQLCE.aspx#comment</comments>
      <guid>http://jamesgoodfellow.com/blog/post.aspx?id=d49618ff-831e-41dc-a7fd-e14094ff1c82</guid>
      <pubDate>Tue, 23 Sep 2008 19:14:00 -0800</pubDate>
      <category>SqlCe</category>
      <dc:publisher>jamesgoody</dc:publisher>
      <pingback:server>http://jamesgoodfellow.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://jamesgoodfellow.com/blog/post.aspx?id=d49618ff-831e-41dc-a7fd-e14094ff1c82</pingback:target>
      <slash:comments>234</slash:comments>
      <trackback:ping>http://jamesgoodfellow.com/blog/trackback.axd?id=d49618ff-831e-41dc-a7fd-e14094ff1c82</trackback:ping>
      <wfw:comment>http://jamesgoodfellow.com/blog/post/Renaming-A-Column-in-SQLCE.aspx#comment</wfw:comment>
      <wfw:commentRss>http://jamesgoodfellow.com/blog/syndication.axd?post=d49618ff-831e-41dc-a7fd-e14094ff1c82</wfw:commentRss>
    </item>
    <item>
      <title>IIS 6.0 - HTTP 404 - File not found Internet Information Services</title>
      <description>&lt;p&gt;
I&amp;#39;ve come across this problem a few times and the solution is frustratingly simple and not so obvious given the error message, so I&amp;#39;ll note it here. After checking the obvious (making sure the file exists in the location mapped to the virtual directory) I found &lt;a href="http://support.microsoft.com/kb/248033" target="_blank" title="http://support.microsoft.com/kb/248033"&gt;this&lt;/a&gt; support article from Microsoft. In my case, the ASP.NET Web Extension was not allowed in IIS 6. To Fix this open the MMC snap in for IIS 6.0, click on the &amp;#39;Web Service Extensions&amp;#39; folder and ensure the &amp;#39;ASP.NET vXXXX&amp;#39; has a status of &amp;#39;Allowed&amp;#39;, if not allow it! 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://jamesgoodfellow.com/blog/image.axd?picture=IIS6.JPG" alt="" /&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
For security reasons the .Net extensions are prohibited by default which is all well and good, but you&amp;#39;d think we could get a more helpful error message! 
&lt;/p&gt;
&lt;p&gt;
Jimmy 
&lt;/p&gt;
</description>
      <link>http://jamesgoodfellow.com/blog/post/IIS-60---HTTP-404---File-not-found-Internet-Information-Services.aspx</link>
      <author>jamesgoody</author>
      <comments>http://jamesgoodfellow.com/blog/post/IIS-60---HTTP-404---File-not-found-Internet-Information-Services.aspx#comment</comments>
      <guid>http://jamesgoodfellow.com/blog/post.aspx?id=050c0aaf-8ba8-46a9-bbb0-7dafd2a9a87c</guid>
      <pubDate>Mon, 22 Sep 2008 12:37:00 -0800</pubDate>
      <category>ASP.Net</category>
      <category>IIS</category>
      <dc:publisher>jamesgoody</dc:publisher>
      <pingback:server>http://jamesgoodfellow.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://jamesgoodfellow.com/blog/post.aspx?id=050c0aaf-8ba8-46a9-bbb0-7dafd2a9a87c</pingback:target>
      <slash:comments>199</slash:comments>
      <trackback:ping>http://jamesgoodfellow.com/blog/trackback.axd?id=050c0aaf-8ba8-46a9-bbb0-7dafd2a9a87c</trackback:ping>
      <wfw:comment>http://jamesgoodfellow.com/blog/post/IIS-60---HTTP-404---File-not-found-Internet-Information-Services.aspx#comment</wfw:comment>
      <wfw:commentRss>http://jamesgoodfellow.com/blog/syndication.axd?post=050c0aaf-8ba8-46a9-bbb0-7dafd2a9a87c</wfw:commentRss>
    </item>
    <item>
      <title>Quickly and Easily Take Your ASP.Net 2.0 Web Site Offline For Maintenance</title>
      <description>I found this handy feature of the ASP.Net 2.0 Framework today: If you want to disable all access to your ASP.Net 2.0 web site you can just place a file called App_Offline.htm in you root directory. All requests to any folder of the site are directed to this page, so you can write a friendly &amp;#39;Down for Maintenance&amp;#39; message there and be comfortable knowing that no one will access the site while you&amp;#39;re updating files or the database. The web application is completely unloaded from the web server so it can also help when you want to instantly unlock an Access or SQL Express database that resides in the app&amp;#39;s App_Data directory.&lt;br /&gt;
&lt;br /&gt;
Jimmy
</description>
      <link>http://jamesgoodfellow.com/blog/post/Quickly-and-Easily-Take-Your-ASPNet-20-Web-Site-Offline-For-Maintenance.aspx</link>
      <author>jamesgoody</author>
      <comments>http://jamesgoodfellow.com/blog/post/Quickly-and-Easily-Take-Your-ASPNet-20-Web-Site-Offline-For-Maintenance.aspx#comment</comments>
      <guid>http://jamesgoodfellow.com/blog/post.aspx?id=78df0a08-3101-435b-8697-7e3449d2641d</guid>
      <pubDate>Fri, 20 Jun 2008 12:20:00 -0800</pubDate>
      <category>ASP.Net</category>
      <dc:publisher>jamesgoody</dc:publisher>
      <pingback:server>http://jamesgoodfellow.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://jamesgoodfellow.com/blog/post.aspx?id=78df0a08-3101-435b-8697-7e3449d2641d</pingback:target>
      <slash:comments>131</slash:comments>
      <trackback:ping>http://jamesgoodfellow.com/blog/trackback.axd?id=78df0a08-3101-435b-8697-7e3449d2641d</trackback:ping>
      <wfw:comment>http://jamesgoodfellow.com/blog/post/Quickly-and-Easily-Take-Your-ASPNet-20-Web-Site-Offline-For-Maintenance.aspx#comment</wfw:comment>
      <wfw:commentRss>http://jamesgoodfellow.com/blog/syndication.axd?post=78df0a08-3101-435b-8697-7e3449d2641d</wfw:commentRss>
    </item>
    <item>
      <title>Dotnetnuke Object Reference Not Set to an Instance of an Object: FreeTextBoxControl</title>
      <description>I came across a strange problem with the article module in Dotnetnuke. When a user clicked on the edit button of an article, a &amp;#39;Critical Error&amp;#39; would occur. If they clicked the edit button again, the edit page would load with no issues. The Site Log gave the full error message:&lt;br /&gt;
&lt;br /&gt;
DotNetNuke.Services.Exceptions.PageLoadException: Object reference not set to an instance of an object. ---&amp;gt; System.NullReferenceException: Object reference not set to an instance of an object. at FreeTextBoxControls.Support.ResourceManager.LoadResource(Hashtable target, String language, String cacheKey) at FreeTextBoxControls.Support.ResourceManager.GetResources() at FreeTextBoxControls.Support.ResourceManager.GetString(String name) at FreeTextBoxControls.Support.Helper.PopulateDefaultDropDownList(ToolbarDropDownList toolbarDropDownList, FreeTextBox freeTextBox, ResourceManager resourceManager) at FreeTextBoxControls.FreeTextBox.OnPreRender(EventArgs e) at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.PreRenderRecursiveInternal() at ...&lt;br /&gt;
&lt;br /&gt;
This was caused by the language settings of the site being set to English New Zealand - the Free Text Box Control didn&amp;#39;t have a corresponding xml language file hence the null reference exception when trying to load the resource. To fix this all I did was browse to [my site]\Providers\HtmlEditorProviders\Ftb3HtmlEditorProvider\ftb3\Languages, copy the en-US.xml file and rename it to en-NZ.xml.&lt;br /&gt;
&lt;br /&gt;
Sweet!&lt;br /&gt;
&lt;br /&gt;
Jimmy
</description>
      <link>http://jamesgoodfellow.com/blog/post/Dotnetnuke-Object-Reference-Not-Set-to-an-Instance-of-an-Object-FreeTextBoxControl.aspx</link>
      <author>jamesgoody</author>
      <comments>http://jamesgoodfellow.com/blog/post/Dotnetnuke-Object-Reference-Not-Set-to-an-Instance-of-an-Object-FreeTextBoxControl.aspx#comment</comments>
      <guid>http://jamesgoodfellow.com/blog/post.aspx?id=4ea38619-5f9a-4677-b1fb-e6aa4045c651</guid>
      <pubDate>Fri, 20 Jun 2008 12:01:00 -0800</pubDate>
      <category>Dotnetnuke</category>
      <dc:publisher>jamesgoody</dc:publisher>
      <pingback:server>http://jamesgoodfellow.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://jamesgoodfellow.com/blog/post.aspx?id=4ea38619-5f9a-4677-b1fb-e6aa4045c651</pingback:target>
      <slash:comments>245</slash:comments>
      <trackback:ping>http://jamesgoodfellow.com/blog/trackback.axd?id=4ea38619-5f9a-4677-b1fb-e6aa4045c651</trackback:ping>
      <wfw:comment>http://jamesgoodfellow.com/blog/post/Dotnetnuke-Object-Reference-Not-Set-to-an-Instance-of-an-Object-FreeTextBoxControl.aspx#comment</wfw:comment>
      <wfw:commentRss>http://jamesgoodfellow.com/blog/syndication.axd?post=4ea38619-5f9a-4677-b1fb-e6aa4045c651</wfw:commentRss>
    </item>
    <item>
      <title>Dotnetnuke Critical Error: Cannot resolve the collation conflict between SQL_Latin1_General_CP1_CI_AS and Latin1_General_CI_AS</title>
      <description>&lt;p&gt;
One of our Dotnetnuke sites couldn&amp;#39;t access the Site Log in the administrator section. The site displayed something along the lines of &amp;#39;Critical error has occurred&amp;#39; but after logging in as host I found the full description to be:&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;
Cannot resolve the collation conflict between SQL_Latin1_General_CP1_CI_AS and Latin1_General_CI_AS&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/118/threadid/44206/scope/posts/threadpage/1/Default.aspx" title="http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/118/threadid/44206/scope/posts/threadpage/1/Default.aspx"&gt;This&lt;/a&gt; helpful post on the community forums led to the solution. To sum it up, the Dotnetnuke database had a different collation to that of the tempdb and server. So for Dotnetnuke to function properly all three collation settings need to be the same. In my case, the server default and tempdb collation was set as Latin1_General_CI_AS while the Dotnetnuke database had a collation of SQL_Latin1_General_CP1_CI_AS. You can use the following SQL to determine the existing collation settings of the three:
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
SELECT&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; DATABASEPROPERTYEX( &amp;#39;[Name of DNN database]&amp;#39; , &amp;#39;Collation&amp;#39; ) AS DotNetNukeDB_Collation,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; DATABASEPROPERTYEX( &amp;#39;tempdb&amp;#39; , &amp;#39;Collation&amp;#39; ) AS TempDB_Collation,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SERVERPROPERTY( &amp;#39;Collation&amp;#39; ) AS Server_Default_Collation
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
So I needed to change the collation of my Dotnetnuke database. It is possible to use the ALTER DATABASE SQL command to do this but certain objects will retain the old collation (see the remarks on &lt;a href="http://msdn.microsoft.com/en-us/library/aa275464(SQL.80).aspx" title="http://msdn.microsoft.com/en-us/library/aa275464(SQL.80).aspx"&gt;this MSDN article&lt;/a&gt;). The only way to completely change the collation of all objects is to create a new database with the desired collation and copy all the data across. I used the &amp;#39;Import Data&amp;#39; functionality in SQL 2005 Management Studio, making the task relatively painless. I had to remember to transfer logins, stored procedures and functions also (I did this using the &amp;#39;Generate Scripts&amp;#39; wizard).&lt;br /&gt;
&lt;br /&gt;
Jimmy
&lt;/p&gt;
</description>
      <link>http://jamesgoodfellow.com/blog/post/Dotnetnuke-Critical-Error-Cannot-resolve-the-collation-conflict-between-SQL_Latin1_General_CP1_CI_AS-and-Latin1_General_CI_AS.aspx</link>
      <author>jamesgoody</author>
      <comments>http://jamesgoodfellow.com/blog/post/Dotnetnuke-Critical-Error-Cannot-resolve-the-collation-conflict-between-SQL_Latin1_General_CP1_CI_AS-and-Latin1_General_CI_AS.aspx#comment</comments>
      <guid>http://jamesgoodfellow.com/blog/post.aspx?id=2f647578-9eef-4e54-9568-cf882bfd4448</guid>
      <pubDate>Fri, 20 Jun 2008 11:28:00 -0800</pubDate>
      <category>Dotnetnuke</category>
      <category>SQL</category>
      <dc:publisher>jamesgoody</dc:publisher>
      <pingback:server>http://jamesgoodfellow.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://jamesgoodfellow.com/blog/post.aspx?id=2f647578-9eef-4e54-9568-cf882bfd4448</pingback:target>
      <slash:comments>119</slash:comments>
      <trackback:ping>http://jamesgoodfellow.com/blog/trackback.axd?id=2f647578-9eef-4e54-9568-cf882bfd4448</trackback:ping>
      <wfw:comment>http://jamesgoodfellow.com/blog/post/Dotnetnuke-Critical-Error-Cannot-resolve-the-collation-conflict-between-SQL_Latin1_General_CP1_CI_AS-and-Latin1_General_CI_AS.aspx#comment</wfw:comment>
      <wfw:commentRss>http://jamesgoodfellow.com/blog/syndication.axd?post=2f647578-9eef-4e54-9568-cf882bfd4448</wfw:commentRss>
    </item>
    <item>
      <title>ASP.Net AJAX ModalPopupExtender: Performing an Asynchronous Postback</title>
      <description>&lt;p&gt;
The ModalPopupExtender in the AjaxControlToolkit is great for showing a modal dialog in ASP.Net web sites. Recently I needed to have my dialog perform some server-side code when the user hit the &amp;#39;Ok&amp;#39; button. This would require a postback which I wanted to be asynchronous so it would be seamless for the user. &lt;br /&gt;
&lt;br /&gt;
I did this in two notable steps. Firstly, in order to have my button perform a postback, I didn&amp;#39;t specify it in the OkControlID attribute on the ModalPopupExtender - if it is not specified as the OkControlID, the button behaves as normal. So I could then hook up a click handler in my server-side code and a postback is performed. &lt;br /&gt;
&lt;br /&gt;
Secondly I put all the controls involved into an UpdatePanel - the target control, the popup panel and the ModalPopupExtender. This means that any postbacks performed by the popup will be asynchronous...mmm asynchronous. &lt;br /&gt;
&lt;br /&gt;
And that&amp;#39;s all there is to it! Example code below. &lt;br /&gt;
&lt;br /&gt;
Jimmy
&lt;/p&gt;
&lt;div class="code"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:UpdatePanel&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="updMessage"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ContentTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:LinkButton&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="lnkContactUser"&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="Contact"&lt;/span&gt; &lt;span class="attr"&gt;OnClick&lt;/span&gt;&lt;span class="kwrd"&gt;="lnkContactUser_Click"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:LinkButton&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Panel&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="pnlContactUser"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TextBox&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="txtSubject"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:TextBox&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TextBox&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="txtMessage"&lt;/span&gt; &lt;span class="attr"&gt;TextMode&lt;/span&gt;&lt;span class="kwrd"&gt;="multiline"&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="200px"&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="150px"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:TextBox&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="btnSend"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="send"&lt;/span&gt; &lt;span class="attr"&gt;OnClick&lt;/span&gt;&lt;span class="kwrd"&gt;="btnSend_Click"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="btnCancel"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="cancel"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Panel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ajax:ModalPopupExtender&lt;/span&gt; &lt;br /&gt;        &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="ModalPopupExtender"&lt;/span&gt;&lt;br /&gt;        &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;br /&gt;        &lt;span class="attr"&gt;TargetControlID&lt;/span&gt;&lt;span class="kwrd"&gt;="lnkContactUser"&lt;/span&gt;&lt;br /&gt;        &lt;span class="attr"&gt;PopupControlID&lt;/span&gt;&lt;span class="kwrd"&gt;="pnlContactUser"&lt;/span&gt; &lt;br /&gt;        &lt;span class="attr"&gt;BackgroundCssClass&lt;/span&gt;&lt;span class="kwrd"&gt;="modalBackground"&lt;/span&gt;&lt;br /&gt;        &lt;span class="attr"&gt;CancelControlID&lt;/span&gt;&lt;span class="kwrd"&gt;="btnCancel"&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ContentTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:UpdatePanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
</description>
      <link>http://jamesgoodfellow.com/blog/post/ASPNet-AJAX-ModalPopupExtender-Performing-an-Asynchronous-Postback.aspx</link>
      <author>jamesgoody</author>
      <comments>http://jamesgoodfellow.com/blog/post/ASPNet-AJAX-ModalPopupExtender-Performing-an-Asynchronous-Postback.aspx#comment</comments>
      <guid>http://jamesgoodfellow.com/blog/post.aspx?id=7c7cbd65-c7c8-4229-ba2f-a148af526f66</guid>
      <pubDate>Fri, 13 Jun 2008 15:30:00 -0800</pubDate>
      <category>Ajax</category>
      <category>ASP.Net</category>
      <dc:publisher>jamesgoody</dc:publisher>
      <pingback:server>http://jamesgoodfellow.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://jamesgoodfellow.com/blog/post.aspx?id=7c7cbd65-c7c8-4229-ba2f-a148af526f66</pingback:target>
      <slash:comments>591</slash:comments>
      <trackback:ping>http://jamesgoodfellow.com/blog/trackback.axd?id=7c7cbd65-c7c8-4229-ba2f-a148af526f66</trackback:ping>
      <wfw:comment>http://jamesgoodfellow.com/blog/post/ASPNet-AJAX-ModalPopupExtender-Performing-an-Asynchronous-Postback.aspx#comment</wfw:comment>
      <wfw:commentRss>http://jamesgoodfellow.com/blog/syndication.axd?post=7c7cbd65-c7c8-4229-ba2f-a148af526f66</wfw:commentRss>
    </item>
    <item>
      <title>Exposing Child Control Events In A User Control</title>
      <description>&lt;p&gt;
Sometimes we want to add handlers to events raised by children of a User Control. As far as I could google these are your options.&lt;br /&gt;
&lt;br /&gt;
1. The&amp;nbsp; simplest way is to provide an accessor method that returns the control. Chances are if you only expose certain properties of your child control, developers will want access to some other property so just put it all out there:
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; Button ChildButton&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;get { &lt;span class="kwrd"&gt;return&lt;/span&gt; btnChild; }&lt;br /&gt;
}
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
Now you can add handlers to the click event like so:
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
myUserControl.ChildButton.OnClick += MyClickHandler;
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
2. If you really want to restrict the developer to using a particular event, you can create a new public event which is fired by the event handler of the child control:
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler ChildButtonClicked;
&lt;/p&gt;
&lt;p&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnChild_OnClick(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="kwrd"&gt;if&lt;/span&gt;(ChildButtonClicked != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ChildButtonClicked(&lt;span class="kwrd"&gt;this&lt;/span&gt;, e);&lt;br /&gt;
}
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
Happy exposing! &lt;br /&gt;
&lt;br /&gt;
Jimmy
&lt;/p&gt;
</description>
      <link>http://jamesgoodfellow.com/blog/post/Exposing-Child-Control-Events-In-A-User-Control.aspx</link>
      <author>jamesgoody</author>
      <comments>http://jamesgoodfellow.com/blog/post/Exposing-Child-Control-Events-In-A-User-Control.aspx#comment</comments>
      <guid>http://jamesgoodfellow.com/blog/post.aspx?id=9089da1a-641f-4d61-9154-c63f90cd3475</guid>
      <pubDate>Sun, 08 Jun 2008 20:52:00 -0800</pubDate>
      <category>Microsoft .Net</category>
      <dc:publisher>jamesgoody</dc:publisher>
      <pingback:server>http://jamesgoodfellow.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://jamesgoodfellow.com/blog/post.aspx?id=9089da1a-641f-4d61-9154-c63f90cd3475</pingback:target>
      <slash:comments>249</slash:comments>
      <trackback:ping>http://jamesgoodfellow.com/blog/trackback.axd?id=9089da1a-641f-4d61-9154-c63f90cd3475</trackback:ping>
      <wfw:comment>http://jamesgoodfellow.com/blog/post/Exposing-Child-Control-Events-In-A-User-Control.aspx#comment</wfw:comment>
      <wfw:commentRss>http://jamesgoodfellow.com/blog/syndication.axd?post=9089da1a-641f-4d61-9154-c63f90cd3475</wfw:commentRss>
    </item>
    <item>
      <title>Reference Custom Controls Located In App_Code Folder</title>
      <description>&lt;p&gt;
You can add references to assembly namespaces in your web.config to avoid having to register controls on every .aspx in your web site:
&lt;/p&gt;
&lt;div class="code"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.web&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;pages&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;controls&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;tagPrefix&lt;/span&gt;&lt;span class="kwrd"&gt;="ajax"&lt;/span&gt; &lt;span class="attr"&gt;namespace&lt;/span&gt;&lt;span class="kwrd"&gt;="AjaxControlToolkit"&lt;/span&gt; &lt;span class="attr"&gt;assembly&lt;/span&gt;&lt;span class="kwrd"&gt;="AjaxControlToolkit"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;... &lt;/div&gt;&lt;p&gt;
If you have a custom control located in your site&amp;#39;s App_Code folder however, the assembly name is generated at compile-time. If you want to reference controls in the App_Code folder, just use &amp;quot;App_Code&amp;quot; as the assembly name:
&lt;/p&gt;
&lt;div class="code"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.web&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;pages&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;controls&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;tagPrefix&lt;/span&gt;&lt;span class="kwrd"&gt;="jg"&lt;/span&gt; &lt;span class="attr"&gt;namespace&lt;/span&gt;&lt;span class="kwrd"&gt;="JamesGoodfellow.Web"&lt;/span&gt; &lt;span class="attr"&gt;assembly&lt;/span&gt;&lt;span class="kwrd"&gt;="App_Code"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;... &lt;/div&gt;&lt;p&gt;
You can also choose to leave out the assembly attribute entirely - the compiler will try find the namespace in the App_Code assembly by default. I prefer to specify &amp;quot;App_Code&amp;quot; to eliminate potential confusion as to where&amp;nbsp; the control is located.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Jimmy 
&lt;/p&gt;
</description>
      <link>http://jamesgoodfellow.com/blog/post/Reference-Custom-Controls-Located-In-App_Code-Folder.aspx</link>
      <author>jamesgoody</author>
      <comments>http://jamesgoodfellow.com/blog/post/Reference-Custom-Controls-Located-In-App_Code-Folder.aspx#comment</comments>
      <guid>http://jamesgoodfellow.com/blog/post.aspx?id=163f3ff5-5f95-48d0-ab28-2098bb48c289</guid>
      <pubDate>Sat, 07 Jun 2008 16:41:00 -0800</pubDate>
      <category>ASP.Net</category>
      <dc:publisher>jamesgoody</dc:publisher>
      <pingback:server>http://jamesgoodfellow.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://jamesgoodfellow.com/blog/post.aspx?id=163f3ff5-5f95-48d0-ab28-2098bb48c289</pingback:target>
      <slash:comments>184</slash:comments>
      <trackback:ping>http://jamesgoodfellow.com/blog/trackback.axd?id=163f3ff5-5f95-48d0-ab28-2098bb48c289</trackback:ping>
      <wfw:comment>http://jamesgoodfellow.com/blog/post/Reference-Custom-Controls-Located-In-App_Code-Folder.aspx#comment</wfw:comment>
      <wfw:commentRss>http://jamesgoodfellow.com/blog/syndication.axd?post=163f3ff5-5f95-48d0-ab28-2098bb48c289</wfw:commentRss>
    </item>
    <item>
      <title>Ping In C# .Net</title>
      <description>&lt;p&gt;
This is probably old news to most people but I ended up googling for it so I&amp;#39;ll record it here. Since .Net 2.0 there is a handy Ping class in the System.Net.NetworkInformation namespace that encapsulates - you guessed it - ping functionality. Here&amp;#39;s some example code for performing a synchronous ping, check out &lt;a href="http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping(VS.80).aspx" target="_blank" title="http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping(VS.80).aspx"&gt;this&lt;/a&gt; MSDN article for more detail and an asynchronous example. 
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Net.NetworkInformation; 
&lt;/p&gt;
&lt;p&gt;
... 
&lt;/p&gt;
&lt;p&gt;
Ping pingSender = &lt;span class="kwrd"&gt;new&lt;/span&gt; Ping ();&lt;br /&gt;
PingOptions options = &lt;span class="kwrd"&gt;new&lt;/span&gt; PingOptions (); 
&lt;/p&gt;
&lt;p&gt;
&lt;span class="rem"&gt;// Use the default Ttl value which is 128,&lt;br /&gt;&lt;/span&gt;
&lt;span class="rem"&gt;// but change the fragmentation behavior.&lt;br /&gt;&lt;/span&gt;
options.DontFragment = &lt;span class="kwrd"&gt;true&lt;/span&gt;; 
&lt;/p&gt;
&lt;p&gt;
&lt;span class="rem"&gt;// Create a buffer of 32 bytes of data to be transmitted.&lt;br /&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;string&lt;/span&gt; data = &amp;quot;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&amp;quot;;&lt;br /&gt;
&lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer = Encoding.ASCII.GetBytes (data);&lt;br /&gt;
&lt;span class="kwrd"&gt;int&lt;/span&gt; timeout = 120;&lt;br /&gt;
PingReply reply = pingSender.Send (args[0], timeout, buffer, options); 
&lt;/p&gt;
&lt;p&gt;
&lt;span class="kwrd"&gt;if&lt;/span&gt; (reply.Status == IPStatus.Success)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;Console.WriteLine (&amp;quot;Address: {0}&amp;quot;, reply.Address.ToString ());&lt;br /&gt;
&amp;nbsp;Console.WriteLine (&amp;quot;RoundTrip time: {0}&amp;quot;, reply.RoundtripTime);&lt;br /&gt;
&amp;nbsp;Console.WriteLine (&amp;quot;Time to live: {0}&amp;quot;, reply.Options.Ttl);&lt;br /&gt;
&amp;nbsp;Console.WriteLine (&amp;quot;Don&amp;#39;t fragment: {0}&amp;quot;, reply.Options.DontFragment);&lt;br /&gt;
&amp;nbsp;Console.WriteLine (&amp;quot;Buffer size: {0}&amp;quot;, reply.Buffer.Length);&lt;br /&gt;
} 
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
Jimmy 
&lt;/p&gt;
</description>
      <link>http://jamesgoodfellow.com/blog/post/Ping-In-C-Net.aspx</link>
      <author>jamesgoody</author>
      <comments>http://jamesgoodfellow.com/blog/post/Ping-In-C-Net.aspx#comment</comments>
      <guid>http://jamesgoodfellow.com/blog/post.aspx?id=54b41561-7061-4a80-a296-a8c52b205efd</guid>
      <pubDate>Fri, 06 Jun 2008 15:38:00 -0800</pubDate>
      <category>Microsoft .Net</category>
      <dc:publisher>jamesgoody</dc:publisher>
      <pingback:server>http://jamesgoodfellow.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://jamesgoodfellow.com/blog/post.aspx?id=54b41561-7061-4a80-a296-a8c52b205efd</pingback:target>
      <slash:comments>308</slash:comments>
      <trackback:ping>http://jamesgoodfellow.com/blog/trackback.axd?id=54b41561-7061-4a80-a296-a8c52b205efd</trackback:ping>
      <wfw:comment>http://jamesgoodfellow.com/blog/post/Ping-In-C-Net.aspx#comment</wfw:comment>
      <wfw:commentRss>http://jamesgoodfellow.com/blog/syndication.axd?post=54b41561-7061-4a80-a296-a8c52b205efd</wfw:commentRss>
    </item>
    <item>
      <title>Running ASP.Net AJAX And The Ajax Control Toolkit From Javascript Source In .Net 2.0</title>
      <description>&lt;p&gt;
I&amp;#39;ve found myself in need of debugging the javascript for the Ajax toolkit controls (AjaxCotnrolToolkit.dll) and in some cases the ASP.Net AJAX libraries. Here&amp;#39;s how to set up an existing ajax-enabled web site to run from source code.&lt;br /&gt;
&lt;br /&gt;
This is intended for people using the Ajax framework with ASP.Net 2.0. I haven&amp;#39;t tried the same thing with .Net 3.5 but I&amp;#39;d imagine the steps are very similar, I&amp;#39;m just not sure where the .js source files are located in 3.5. &lt;br /&gt;
&lt;br /&gt;
1. Create a new folder under your web site for the javascript source - I created a &amp;#39;js&amp;#39; sub-directory.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Retrieving The Source For ASP.Net AJAX&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
2. The source for the core ASP.Net AJAX libraries are installed with the .Net 2.0 extensions available from the &lt;a href="http://www.asp.net/ajax" target="_blank" title="http://www.asp.net/ajax"&gt;MS AJAX home page&lt;/a&gt;, so no additional download is required. Copy the folder named &amp;#39;System.Web.Extensions&amp;#39; from the ASP.Net AJAX install directory to our js folder created in step 1. On my computer this was located in &amp;#39;C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\v1.0.61025\MicrosoftAjaxLibrary&amp;#39;.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Retrieving The Source For The AjaxControlToolkit&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
3. If you haven&amp;#39;t already got it, download the latest source for the toolkit from the project&amp;#39;s home page &lt;a href="http://www.codeplex.com/AtlasControlToolkit/Release/ProjectReleases.aspx?ReleaseId=11121" target="_blank" title="http://www.codeplex.com/AtlasControlToolkit/Release/ProjectReleases.aspx?ReleaseId=11121"&gt;here&lt;/a&gt; and extract it to a location on your hard drive.&lt;br /&gt;
&lt;br /&gt;
4. We need to put the source files in our &amp;#39;js&amp;#39; folder under a path named &amp;#39;/AjaxControlToolkit/[assembly version]&amp;#39;. I get the assembly version by right clicking on AjaxControlToolkit.dll (included in the package downloaded in step 3) clicking on the &amp;#39;Version&amp;#39; tab and viewing the assembly version attribute under &amp;#39;Other version information&amp;#39;. So now I have a sub-directory under my site with the path &amp;#39;/js/AjaxCotnrolToolkit/1.0.20229.20821&amp;#39;.&lt;br /&gt;
&lt;br /&gt;
5. Next we need to copy the .js files for each of the controls to this new directory. The easiest way I&amp;#39;ve found to do this is browse to the folder you extracted in step 3, open the &amp;#39;AjaxControlToolkit&amp;#39; sub folder (this is where all the control source is located) hit &amp;#39;ctrl-f&amp;#39; to bring up explorer&amp;#39;s search window, find all files with &amp;#39;.js&amp;#39; in the name and you can copy-paste the results into the directory created in step 4.&lt;br /&gt;
&lt;br /&gt;
6. This is the tedious bit and if anyone has found a way around it then I&amp;#39;d love to hear from you! When the script references are added to the page, the .js file names are prefixed with AjaxControlToolkit.[ControlName] so we need to rename the files to what the framework is expecting. The control name is the name of the folder that the .js file was originally located in, for example Common.js should be renamed to AjaxControlToolkit.Common.Common.js. &lt;br /&gt;
&lt;br /&gt;
It&amp;#39;s a bit of a pain but you can get away with only renaming the control files you&amp;#39;re dealing with if you don&amp;#39;t want to do all 46 files straight off. You will definitely have to change Common.js as it is used by all controls. To find out what files are required you can complete step 7, load the page and view the source - you&amp;#39;ll see the linked script files in the header of the HTML.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;The Final Step&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
7. Now we just need to tell our site to use our &amp;#39;js&amp;#39; folder to find the client side script. This is done using the ScriptPath attribute on the ScriptManager control. Below is the declaration for my ScriptManager:
&lt;/p&gt;
&lt;div class="code"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ScriptManager&lt;/span&gt; &lt;span class="attr"&gt;ScriptPath&lt;/span&gt;&lt;span class="kwrd"&gt;="~/js"&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="ScriptManager1"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:ScriptManager&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;
Jimmy
&lt;/p&gt;
</description>
      <link>http://jamesgoodfellow.com/blog/post/Running-ASPNet-AJAX-And-The-Ajax-Control-Toolkit-From-Javascript-Source-In-Net-20.aspx</link>
      <author>jamesgoody</author>
      <comments>http://jamesgoodfellow.com/blog/post/Running-ASPNet-AJAX-And-The-Ajax-Control-Toolkit-From-Javascript-Source-In-Net-20.aspx#comment</comments>
      <guid>http://jamesgoodfellow.com/blog/post.aspx?id=0e33c11c-b585-4e34-923b-b81486d5eacf</guid>
      <pubDate>Thu, 29 May 2008 19:37:00 -0800</pubDate>
      <category>Ajax</category>
      <category>ASP.Net</category>
      <category>Javascript</category>
      <dc:publisher>jamesgoody</dc:publisher>
      <pingback:server>http://jamesgoodfellow.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://jamesgoodfellow.com/blog/post.aspx?id=0e33c11c-b585-4e34-923b-b81486d5eacf</pingback:target>
      <slash:comments>2832</slash:comments>
      <trackback:ping>http://jamesgoodfellow.com/blog/trackback.axd?id=0e33c11c-b585-4e34-923b-b81486d5eacf</trackback:ping>
      <wfw:comment>http://jamesgoodfellow.com/blog/post/Running-ASPNet-AJAX-And-The-Ajax-Control-Toolkit-From-Javascript-Source-In-Net-20.aspx#comment</wfw:comment>
      <wfw:commentRss>http://jamesgoodfellow.com/blog/syndication.axd?post=0e33c11c-b585-4e34-923b-b81486d5eacf</wfw:commentRss>
    </item>
    <item>
      <title>Hashed or Encrypted Passwords Are Not Supported With Auto-generated Keys - Custom Membership Provider</title>
      <description>&lt;p&gt;
I got this error when implementing a custom membership provider for which I grabbed the code from &lt;a href="http://msdn.microsoft.com/en-us/library/6tc47t75.aspx" target="_blank" title="http://msdn.microsoft.com/en-us/library/6tc47t75.aspx"&gt;this&lt;/a&gt; MSDN article.&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
When I tried to login through ASP.Net&amp;#39;s Login control I got the following error:&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;strong&gt;&amp;quot;Hashed or Encrypted passwords are not supported with auto-generated keys&amp;quot;&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
Microsoft has said that they intentionally disable the use of auto-generated keys when encrypting passwords. This is to prevent passwords being irretrievable after moving membership databases to different machines:&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;quot;Back in the alpha we kept running across developers that worked a little bit on one machine and then picked up their MDB and copied it to another machine. At which point&amp;mdash;surprise!&amp;mdash;none of the passwords could be decrypted any more. So we decided to disallow autogenerated keys when using encrypted passwords. The reality is that autogenerated keys are really fragile. It&amp;#39;s just way too easy to get yourself in a situation where these keys change. And once that happens, you are left with a useless membership database.&amp;quot;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
So, we need to generate the keys ourselves. To do this we use the RNGCryptoServiceProvider class. Below is a simple console application that will generate a key of a specified length (default is 128):
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Security;&lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Security.Cryptography;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kwrd"&gt;class&lt;/span&gt; App&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] argv) &lt;br /&gt;
&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;int&lt;/span&gt; len = 128;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (argv.Length &amp;gt; 0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; len = &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(argv[0]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buff = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[len/2];&lt;br /&gt;
&amp;nbsp;&amp;nbsp; RNGCryptoServiceProvider rng = &lt;span class="kwrd"&gt;new&lt;/span&gt; RNGCryptoServiceProvider();&lt;br /&gt;
&amp;nbsp;&amp;nbsp; rng.GetBytes(buff);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; StringBuilder sb = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(len);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i=0; i&amp;lt;buff.Length; i++)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&amp;quot;{0:X2}&amp;quot;, buff[i]));&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Console.WriteLine(sb);&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
}
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
Because I am using the SHA1 algorithm Microsoft advises (http://msdn.microsoft.com/en-us/library/ms998288.aspx) to use a key of 128 characters. SHA1 is asymmetric so I haven&amp;#39;t specified a decryptionKey value and I&amp;#39;ve set decryption attribute to &amp;quot;Auto&amp;quot;. Now my web.config looks something like this:
&lt;/p&gt;
&lt;div class="code"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;machineKey&lt;/span&gt;&lt;br /&gt;    &lt;span class="attr"&gt;validationKey&lt;/span&gt;&lt;span class="kwrd"&gt;="B1D60ECC31789D1266F7452C81EB1DBE8C05F8A0C3826175EE35B2F1981DC94AE3EC36476B603715CB1DA0EA0F06503C90F338E38817DE5D9EAD9B41F61ADEAD"&lt;/span&gt;&lt;br /&gt;    &lt;span class="attr"&gt;validation&lt;/span&gt;&lt;span class="kwrd"&gt;="SHA1"&lt;/span&gt;&lt;br /&gt;    &lt;span class="attr"&gt;decryption&lt;/span&gt;&lt;span class="kwrd"&gt;="Auto"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
</description>
      <link>http://jamesgoodfellow.com/blog/post/Hashed-or-Encrypted-Passwords-Are-Not-Supported-With-Auto-generated-Keys---Custom-Membership-Provider.aspx</link>
      <author>jamesgoody</author>
      <comments>http://jamesgoodfellow.com/blog/post/Hashed-or-Encrypted-Passwords-Are-Not-Supported-With-Auto-generated-Keys---Custom-Membership-Provider.aspx#comment</comments>
      <guid>http://jamesgoodfellow.com/blog/post.aspx?id=606601ef-b9a2-476f-ab07-002100725e46</guid>
      <pubDate>Sun, 04 May 2008 18:43:00 -0800</pubDate>
      <category>ASP.Net</category>
      <category>Security</category>
      <dc:publisher>jamesgoody</dc:publisher>
      <pingback:server>http://jamesgoodfellow.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://jamesgoodfellow.com/blog/post.aspx?id=606601ef-b9a2-476f-ab07-002100725e46</pingback:target>
      <slash:comments>2068</slash:comments>
      <trackback:ping>http://jamesgoodfellow.com/blog/trackback.axd?id=606601ef-b9a2-476f-ab07-002100725e46</trackback:ping>
      <wfw:comment>http://jamesgoodfellow.com/blog/post/Hashed-or-Encrypted-Passwords-Are-Not-Supported-With-Auto-generated-Keys---Custom-Membership-Provider.aspx#comment</wfw:comment>
      <wfw:commentRss>http://jamesgoodfellow.com/blog/syndication.axd?post=606601ef-b9a2-476f-ab07-002100725e46</wfw:commentRss>
    </item>
  </channel>
</rss>

