<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Todd's Blog : General .Net Framework</title><link>http://blogs.msdn.com/toddca/archive/tags/General+.Net+Framework/default.aspx</link><description>Tags: General .Net Framework</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>.Net Framework Version Overview</title><link>http://blogs.msdn.com/toddca/archive/2007/08/08/net-framework-version-overview.aspx</link><pubDate>Wed, 08 Aug 2007 14:03:57 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4291873</guid><dc:creator>Toddca</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/toddca/comments/4291873.aspx</comments><wfw:commentRss>http://blogs.msdn.com/toddca/commentrss.aspx?PostID=4291873</wfw:commentRss><description>&lt;p&gt;I am frequently asked about the various .Net framework versions floating around. As the .Net framework continues to go through its various revs the waters will only become muddier. Here is a quick overview of each version we have to date…
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;.Net 1.0&lt;/strong&gt; – This was the initial release of the framework which as of today only .Net 1.0 SP3 is currently supported by PSS. This only shipped as x86.
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;.Net 1.1&lt;/strong&gt; – This is a side-by-side release of the framework in which no dependencies on 1.0 exist. Hotfixes and Service packs for this version do not affect other framework versions. This only shipped as x86 and the latest Service Pack is SP1. This version also shipped inside the OS on Windows 2003 RTM but only in the x86 SKU. For x64 and IA64 versions of Windows 2003 there is no .Net framework installed by default. The x86 SP1 for Windows 2003 updates the 1.1 framework however it is SP1+ in that it does not have the same binaries as let's say a Windows 2000 machine with .Net 1.1 SP1 installed.
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;.Net 2.0&lt;/strong&gt; – This is a side-by-side release just as .Net 1.1. This version ships as x86, x64, and IA64. Windows 2003 R2 ships this version but does not install it by default. Using add/remove programs on any SKU will allow for installation. There currently is no service pack for this version. The x86 and x64 redist packages can each be installed side-by-side on a single x64 system. 
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;.Net 3.0&lt;/strong&gt; – This is the first add-on framework. It adds functionality in the form of WPF, WCF, and WF, plus upgrades the 2.0 binaries by adding a few necessary fixes to make the new components function properly. This version shipped with all SKUs of Vista and has a redistributable package as well. The 3.0 redist package will install the 2.0 framework should it not be present or will upgrade an existing 2.0 installation. The x86 and x64 redist packages can each be installed side-by-side on a single x64 system. Currently there is no Service pack available. 
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;.Net 3.5&lt;/strong&gt; – This is another side-by-side for 2.0 and 3.0 which adds functionality and updates the binaries of the previous two frameworks. This version has not been released and not much about it is public at this point but you can assume an x86, x64 and an IA64 version will continue to be available. You can probably also assume this will debut with Windows 2008.
&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4291873" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/toddca/archive/tags/General+.Net+Framework/default.aspx">General .Net Framework</category></item><item><title>Download your Hotfixes!</title><link>http://blogs.msdn.com/toddca/archive/2007/07/27/download-your-hotfixes.aspx</link><pubDate>Fri, 27 Jul 2007 15:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4080011</guid><dc:creator>Toddca</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/toddca/comments/4080011.aspx</comments><wfw:commentRss>http://blogs.msdn.com/toddca/commentrss.aspx?PostID=4080011</wfw:commentRss><description>&lt;P&gt;Up to this point Microsoft has always required customers to make a phone call into Microsoft Product Support to receive a hotfix. Today we have made available a &lt;A href="https://support.microsoft.com/contactus2/emailcontact.aspx?scid=sw;en;1410&amp;amp;WS=hotfix" mce_href="https://support.microsoft.com/contactus2/emailcontact.aspx?scid=sw;en;1410&amp;amp;WS=hotfix"&gt;web application&lt;/A&gt; that allows customers to fill out a simple web form and receive the hotfix by email. &lt;/P&gt;
&lt;P&gt;Here is how it works: T&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;he form on the site has field entries for the following information:&lt;/SPAN&gt; &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;Country/Region &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Pulldown menu)&lt;/SPAN&gt; &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;KB article number &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Text entry)&lt;/SPAN&gt; &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;Platform &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Pulldown menu)&lt;/SPAN&gt; &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;Product Language&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Pulldown menu)&lt;/SPAN&gt; &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;E-mail address&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Text entry)&lt;/SPAN&gt; &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;You enter the data listed above and select the "Submit" button .&amp;nbsp; You are then taken to a submission confirmation webpage.&amp;nbsp; This webpage lets you know that you should receive a response from a Microsoft Professional within 8 business hours.&amp;nbsp; The e-mail response that you receive looks like the automated hotfix e-mail that you may have seen should you have ever used the previous call in method. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;Happy Hotfixin'. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;Todd&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4080011" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/toddca/archive/tags/ASP.NET+General+Information/default.aspx">ASP.NET General Information</category><category domain="http://blogs.msdn.com/toddca/archive/tags/General+.Net+Framework/default.aspx">General .Net Framework</category><category domain="http://blogs.msdn.com/toddca/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>Bytes In All Heaps &gt; Private Bytes?</title><link>http://blogs.msdn.com/toddca/archive/2006/09/18/bytes-in-all-heaps-private-bytes.aspx</link><pubDate>Mon, 18 Sep 2006 14:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:760588</guid><dc:creator>Toddca</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/toddca/comments/760588.aspx</comments><wfw:commentRss>http://blogs.msdn.com/toddca/commentrss.aspx?PostID=760588</wfw:commentRss><description>&lt;FONT face=Verdana size=2&gt;The other day I had a friend of mine approach me about a possible&amp;nbsp;bug he had found&amp;nbsp;in the CLR memory perfomance counters. He pointed me to a performance log where his customer had captured a log that showed that the &lt;EM&gt;Bytes in All Heaps&lt;/EM&gt;&amp;nbsp;&amp;nbsp;exceeded that of &lt;EM&gt;Private Bytes&lt;/EM&gt;. Since he knew that Bytes in All Heaps represented the memory in the managed heap and the managed heap is part of Private Bytes how could this be possible? Well the answer is quite simple, its not, and what he was looking at was not a performance bug either but a side effect of how the GC performance counters operatate. The GC only updates it performance counters &lt;STRONG&gt;after&lt;/STRONG&gt; a garbage collection as that is the time at which the values that feed into the counters are the most stable and available to publish to the performance block. It just so happens in this performance log that&amp;nbsp;all GC activity had stopped for a while just before the end of&amp;nbsp;the&amp;nbsp;log (probably at the end of a test run) so the counters where not being updated. The private bytes counter will continue to be updated as it is managed by the OS.&lt;/FONT&gt;&lt;A href="http://blogs.msdn.com/photos/toddca/images/760570/original.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/toddca/images/760570/original.aspx"&gt;&lt;IMG title="Click to open larger image" src="http://blogs.msdn.com/photos/toddca/images/760570/491x375.aspx" border=0 mce_src="http://blogs.msdn.com/photos/toddca/images/760570/491x375.aspx"&gt;&lt;/A&gt; &lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=760588" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/toddca/archive/tags/General+.Net+Framework/default.aspx">General .Net Framework</category></item><item><title>Event Handlers Gone Wild</title><link>http://blogs.msdn.com/toddca/archive/2006/09/05/event-handlers-gone-wild.aspx</link><pubDate>Wed, 06 Sep 2006 00:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:741667</guid><dc:creator>Toddca</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/toddca/comments/741667.aspx</comments><wfw:commentRss>http://blogs.msdn.com/toddca/commentrss.aspx?PostID=741667</wfw:commentRss><description>Today I ran across an issue that my good buddy &lt;A href="http://blogs.msdn.com/tess/" mce_href="http://blogs.msdn.com/tess/"&gt;Tess&lt;/A&gt; hit with one of her &lt;A href="http://blogs.msdn.com/tess/archive/2006/01/23/516139.aspx" mce_href="http://blogs.msdn.com/tess/archive/2006/01/23/516139.aspx"&gt;customers&lt;/A&gt;&amp;nbsp;a while back.&lt;BR&gt;&lt;BR&gt;The application in question here is an ASP.NET web application that is exhibiting fairly high memory usage after almost a day of usage (approx 400-500 MB). Just as in Tess's case the number of event handlers was really high as you can see from this snip of the !dumpheap -stat command:&lt;BR&gt;&lt;BR&gt;
&lt;TABLE class="" style="WIDTH: 448px; HEIGHT: 92px; BACKGROUND-COLOR: silver"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=""&gt;&lt;FONT size=2&gt;MD,Count,Size,Name&lt;BR&gt;=====================================&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;0x024cd82c &lt;FONT color=#ff0000&gt;876,697 24,547,516 System.ResolveEventHandler&lt;/FONT&gt;&lt;BR&gt;0x019e4300 156,448 29,216,964 System.String&lt;BR&gt;0x000cf740 238 66,842,468 Free&lt;BR&gt;Total 1,464,956 objects, Total size: 182,475,044&lt;/FONT&gt; &lt;BR&gt;&lt;BR&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;EM&gt;Note that when working managed high memory issues I always start with !dumpheap -stat to get the landscape.&lt;/EM&gt;&lt;BR&gt;&lt;BR&gt;The customer stated that they were registering for the AppDomain's &lt;A href="http://msdn2.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx"&gt;AssemblyResolve&lt;/A&gt; event in the global.asax and provided the code that showed what they were doing. Now the code below is incorrect and we will get back to that in a bit however&amp;nbsp;even being&amp;nbsp;wrong&amp;nbsp;it still could not account for over 867,000 event handlers being added to AppDomain's event.&lt;BR&gt;&lt;BR&gt;
&lt;TABLE class="" style="WIDTH: 500px; HEIGHT: 100px; BACKGROUND-COLOR: silver"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=""&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; HttpApplication() : &lt;FONT color=#0000ff&gt;base&lt;/FONT&gt;() {&lt;BR&gt;&amp;nbsp; AppDomain.CurrentDomain.AssemblyResolve += &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; ResolveEventHandler(MyAssemblyResolver.ResolveAssembly);&lt;BR&gt;}&lt;/FONT&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;So given the time the application had been up (approx 21hrs) there must be some common code that is getting called to register for these events elsewhere. I found the code in a class they use to derive all of their WebForm classes from; a custom BasePage class. Of course we are having them remove that code and that should get them back in much better shape.&lt;BR&gt;&lt;BR&gt;Now how do we fix the global.asax code. Well the problem here is that a new HttpApplication is created each time one is needed by a web application and this means you could have more than one handler registered.&amp;nbsp;Now if you have a really low volume site you will only ever see one of these in most cases, however as your traffic gets heavier additional HttpApplications will be spun up to handle the concurrent requests. Think of the number of HttpApplication objects as your high watermark for the number of concurrent requests your site has seen.&lt;BR&gt;&lt;BR&gt;So the fix is to only register for this event handler once and doing this through a static constructor of the HttpApplication would probably be the best approach (though not the only). Since the CLR ensures that static constructors are only called once per AppDomain this will ensure we do not register for the handler multiple times.&lt;BR&gt;&lt;BR&gt;
&lt;TABLE class="" style="WIDTH: 500px; HEIGHT: 111px; BACKGROUND-COLOR: silver"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=""&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;static&lt;/FONT&gt; HttpApplication()&amp;nbsp;{ &amp;nbsp; &lt;BR&gt;&amp;nbsp; AppDomain.CurrentDomain.AssemblyResolve += &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; ResolveEventHandler(MyAssemblyResolver.ResolveAssembly); &lt;BR&gt;}&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=741667" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/toddca/archive/tags/ASP.NET+Debugging/default.aspx">ASP.NET Debugging</category><category domain="http://blogs.msdn.com/toddca/archive/tags/General+.Net+Framework/default.aspx">General .Net Framework</category></item><item><title>The Wait Class</title><link>http://blogs.msdn.com/toddca/archive/2006/01/04/the-wait-class.aspx</link><pubDate>Wed, 04 Jan 2006 17:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:509181</guid><dc:creator>Toddca</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/toddca/comments/509181.aspx</comments><wfw:commentRss>http://blogs.msdn.com/toddca/commentrss.aspx?PostID=509181</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Back when I did most of my coding with C++ I really liked the simplicity and compactness of using class constructors and destructors to do simple tasks such as setting a wait or busy cursor. For example, consider the code in Figure 1. It is a compact and simple API that is very easy to use and hard to use incorrectly.&lt;/FONT&gt;&lt;/P&gt;
&lt;TABLE class="" id=table3 height=174 cellPadding=0 width="40%" bgColor=#c0c0c0 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top align=left&gt;&lt;FONT face=Courier color=#0000ff size=2&gt;void &lt;/FONT&gt;&lt;FONT face=Courier size=2&gt;SomeClass::SomeMethod()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; &lt;FONT color=#008000&gt;//at this point the constructor would run and set our&lt;BR&gt;&amp;nbsp; //cursor to busy.&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp; CWaitCursor cur;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp; &lt;FONT color=#008000&gt;//do some work here&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp; &lt;BR&gt;}&lt;FONT color=#008000&gt;//at this point the destructor would run setting our&lt;BR&gt;//cursor back to its original state. &lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;B&gt;&lt;FONT face=Verdana size=2&gt;Figure 1&lt;/FONT&gt;&lt;/B&gt;&lt;BR&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Today however I use C# as my primary development language and wanted to keep with what I knew worked in the C++ world so well. Since the CLR does not run the destructors (or finalizers) on its objects at predictable times there needed to be some modification to how I would implement and use the C# version of CWaitCursor (Figure 2).&lt;/FONT&gt;&lt;BR&gt;&lt;/P&gt;
&lt;TABLE class="" id=table1 height=288 cellPadding=0 width="40%" bgColor=#c0c0c0 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top align=left&gt;&lt;FONT face=Courier size=2&gt;&lt;FONT color=#0000ff&gt;internal class&lt;/FONT&gt; Wait : IDisposable&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; Cursor _savedCursor;&lt;BR&gt;&amp;nbsp; Form _form;&lt;BR&gt;&lt;BR&gt;&amp;nbsp; &lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; Wait(Form form)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;if&lt;/FONT&gt;(form == &lt;FONT color=#0000ff&gt;null&lt;/FONT&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;throw new&lt;/FONT&gt; ArgumentException("form");&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _form = form;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _savedCursor = _form.Cursor;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _form.Cursor = Cursors.WaitCursor;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp; &lt;FONT color=#0000ff&gt;public void&lt;/FONT&gt; Dispose()&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _form.Cursor = _savedCursor;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;B&gt;&lt;FONT face=Verdana size=2&gt;Figure 2&lt;/FONT&gt;&lt;/B&gt;&lt;BR&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Now to use my Wait class all I need to do is instantiate a new instance within one of my Forms, pass a reference to that form and use the "using" construct offered by the C# language.&lt;/FONT&gt;&lt;BR&gt;&lt;/P&gt;
&lt;TABLE class="" id=table2 height=139 cellPadding=0 width="40%" bgColor=#c0c0c0 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top align=left&gt;&lt;FONT face=Courier color=#0000ff size=2&gt;public void &lt;/FONT&gt;&lt;FONT face=Courier size=2&gt;SomeMethodOfAForm()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; &lt;FONT color=#0000ff&gt;using&lt;/FONT&gt;(&lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; Wait(&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;))&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;//do some work here&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;B&gt;&lt;FONT face=Verdana size=2&gt;Figure 3&lt;/FONT&gt;&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Ok at this point I should say I don't want to get into any debate with anyone over which language is better, which method is more preferred, etc... I will also point out before I am sure someone else will that this cannot be used with ASP.NET, ok you got me!&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#a52a2a&gt;Correction: &lt;/FONT&gt;&lt;A href="http://blogs.msdn.com/ricom" mce_href="http://blogs.msdn.com/ricom"&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#a52a2a&gt;Rico&lt;/FONT&gt;&lt;/A&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#a52a2a&gt;&amp;nbsp;was kind enough to point out that my Wait class was not finalizable so I did not need to SuppressFinalize on it.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=509181" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/toddca/archive/tags/General+.Net+Framework/default.aspx">General .Net Framework</category></item><item><title>Normal Users On Terminal Server Fail To Run .Net Framework Applications</title><link>http://blogs.msdn.com/toddca/archive/2005/06/08/normal-users-on-terminal-server-fail-to-run-net-framework-applications.aspx</link><pubDate>Wed, 08 Jun 2005 16:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:426714</guid><dc:creator>Toddca</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/toddca/comments/426714.aspx</comments><wfw:commentRss>http://blogs.msdn.com/toddca/commentrss.aspx?PostID=426714</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;Yesterday I spent a couple of hours running through a live debug via &lt;A href="http://www.microsoft.com/office/livemeeting/prodinfo" mce_href="http://www.microsoft.com/office/livemeeting/prodinfo"&gt;Office Live Meeting (OLM) &lt;/A&gt;to narrow down a customer’s issue. The customer was attempting to run a .Net control from his web pages. These work fine if the user is an admin or a normal user logged in directly to a Windows 2000 SP4 machine however if the account is a normal user and if they are using Remote Desktop (Terminal Server Client) to connect to the server the control will not load. Other CLR/.Net applications fail to load as well.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;The problem is that we get an Access Denied error when we call into CreateFileMapping when creating a block of memory for IPC. The call returns a NULL with a GetLastError of 5. This failure bubbles back up and causes the CLR to fail to load. A global is set so that the operation is not retired until the browser is restarted.&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;This problem occurs if all the following are true:&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;1. You log on to the Terminal server as a limited user (a user without administrator rights).&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;&lt;BR&gt;2. The Terminal server is running Microsoft Windows 2000 Service Pack 4 (SP4) and has the .NET Framework 1.0 installed with or without any Framework SP (in my case we had SP3 installed).&lt;BR&gt;&lt;BR&gt;3&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;. The .NET Framework 1.1 or later has not been installed on the machine.&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;To work around this problem without installing the 1.1 framework:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;1. On the Windows 2000 SP4-based Terminal server, locate the following registry subkey:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;Manager\Kernel&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;2. Add the following registry values:&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;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;Value name: "ObUnsecureGlobalNames"&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;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;Value type: "REG_MULTI_SZ"&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;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;Value data: "Cor_Private_IPCBlock"&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;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;Value data: "netfxcustomerfcounters.1.0"&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;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;Value data: "SharedPerfIPCBlock"&lt;/FONT&gt;&lt;/FONT&gt;&lt;o:p&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;3. Restart the server.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana size=2&gt;Issues similar to this one are documented in the following KBs:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;&lt;A href="http://support.microsoft.com/?id=823485" mce_href="http://support.microsoft.com/?id=823485"&gt;823485 Errors occur when you use a .NET Framework 1.0-based program on a...&lt;BR&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;&lt;A href="http://support.microsoft.com/?id=823502" mce_href="http://support.microsoft.com/?id=823502"&gt;823502 Cannot Create a New Visual Studio .NET Project on a Windows 2000&lt;BR&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana size=2&gt;&lt;BR&gt;The 1.1 Framework creates these registry entries when it is installed so installing the 1.1 or 2.0 framework as the KBs suggests will resolve the issue however may create a new one. The CLR shim mscoree.dll will attempt to always load the latest version of the CLR installed on the machine when loading an assembly through a COM interop such as what we are doing here when IE is loading our control. If the control is not compatible with the latest version it may fail to load or work properly. For more information on how to configure the loading of a specific version of the CLR go &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconconfiguringcomapplicationforside-by-sideexecution.asp" mce_href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconconfiguringcomapplicationforside-by-sideexecution.asp"&gt;here&lt;/A&gt;. &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana size=2&gt;&lt;BR&gt;The registry key “ObUnsecureGlobalNames” holds a list of object names. If an object is listed in the key, calls to ObpIsUnsecureName against that object will return TRUE. This is a way around for normal users who do not have the SeCreateGlobalPrivilege right which is typically required to create global objects. If the name is unsecured (i.e. listed in this registry value), access to and the creation of such objects in terminal server sessions is permitted.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=426714" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/toddca/archive/tags/General+.Net+Framework/default.aspx">General .Net Framework</category></item></channel></rss>