<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Ted Graham on .NET</title><subtitle type="html">Interesting issues and tidbits about software development, generally using .NET</subtitle><id>http://weblogs.asp.net/tgraham/atom.aspx</id><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/default.aspx" /><link rel="self" type="application/atom+xml" href="http://weblogs.asp.net/tgraham/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20510.895">Community Server</generator><updated>2004-06-07T11:22:00Z</updated><entry><title>Loading the assembly for a custom log4net appender</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2007/05/02/loading-the-assembly-for-a-custom-log4net-appender.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2007/05/02/loading-the-assembly-for-a-custom-log4net-appender.aspx</id><published>2007-05-02T19:45:00Z</published><updated>2007-05-02T19:45:00Z</updated><content type="html">As I described recently, I have built a custom appender that inherits from SmtpAppender but supports SSL sending using .NET 2.0. However, when I configure my web application to use it, I get an error that: log4net:ERROR XmlHierarchyConfigurator: Could not create Appender [EmailAppender] of type [log4netExtensions.SmtpClientAsyncSmtpAppender]. Reported error follows. System.TypeLoadException: Could not load type [log4netExtensions.SmtpClientAsyncSmtpAppender]. Tried assembly [log4net, Version=1.2...(&lt;a href="http://weblogs.asp.net/tgraham/archive/2007/05/02/loading-the-assembly-for-a-custom-log4net-appender.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2481740" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET/default.aspx" /><category term="log4net" scheme="http://weblogs.asp.net/tgraham/archive/tags/log4net/default.aspx" /></entry><entry><title>A log4net appender that uses SmtpClient</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2007/04/20/a-log4net-appender-that-uses-smtpclient.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2007/04/20/a-log4net-appender-that-uses-smtpclient.aspx</id><published>2007-04-20T21:36:00Z</published><updated>2007-04-20T21:36:00Z</updated><content type="html">Google Apps provides free email hosting for small businesses. However, their SMTP server requires SSL authentication for sending outbound emails, so you can&amp;#39;t use use log4net to send emails based on the content of logged messages. Ron Grabowski suggested writing a log4net appender that uses SmtpClient (only available in 2.0) to send SSL secured messages. The below class works for me against smtp.google.com using port 587: using System; using System.Collections.Generic; using System.Text; using...(&lt;a href="http://weblogs.asp.net/tgraham/archive/2007/04/20/a-log4net-appender-that-uses-smtpclient.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2304984" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET/default.aspx" /><category term="log4net" scheme="http://weblogs.asp.net/tgraham/archive/tags/log4net/default.aspx" /></entry><entry><title>A realistic log4net config</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx</id><published>2007-03-15T16:34:00Z</published><updated>2007-03-15T16:34:00Z</updated><content type="html">Most log4net config file examples show the simplest case. Here is a more realistic example of a production log4net config that uses multiple appenders. This comes from an ASP.NET application, but the same technique will work in a server or client application. This config sets up two appenders: The first one writes all messages at DEBUG or higher to a log file. Depending on your needs, a RollingFileAppender that creates a new file every day or week might be more appropriate. The second appender sends...(&lt;a href="http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2034161" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term=".NET best practices" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET+best+practices/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET/default.aspx" /><category term="ASP.NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/ASP.NET/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/tgraham/archive/tags/General+Software+Development/default.aspx" /><category term="C#" scheme="http://weblogs.asp.net/tgraham/archive/tags/C_2300_/default.aspx" /><category term=".NET FAQ" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET+FAQ/default.aspx" /><category term="log4net" scheme="http://weblogs.asp.net/tgraham/archive/tags/log4net/default.aspx" /></entry><entry><title>Software Startup Series</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2007/03/09/software-startup-series.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2007/03/09/software-startup-series.aspx</id><published>2007-03-09T16:30:00Z</published><updated>2007-03-09T16:30:00Z</updated><content type="html">My series highlighting helpful information for software startups is now in the 8th week. I started this as a way to communicate helpful information with my partners, but it is starting to get some traffic and take on a life of its own. The micro-ISV movement is gaining momentum, Channel 9 has even started a show about it....(&lt;a href="http://weblogs.asp.net/tgraham/archive/2007/03/09/software-startup-series.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1978101" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term="General Software Development" scheme="http://weblogs.asp.net/tgraham/archive/tags/General+Software+Development/default.aspx" /></entry><entry><title>Installing VS 2003 AFTER VS 2005</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2007/01/14/installing-vs-2003-after-vs-2005.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2007/01/14/installing-vs-2003-after-vs-2005.aspx</id><published>2007-01-14T17:33:00Z</published><updated>2007-01-14T17:33:00Z</updated><content type="html">Like most developers, I&amp;#39;ve already upgraded to VS 2005. However, a product which I am releasing soon uses .NET 1.1 for the client side to ease installation. So I had to install VS 2003 after having VS 2005 installed. Luckily, and thanks to MS, it worked great. Porting the client code back to 1.1 wasn&amp;#39;t too bad. Recreating the project files was a pain, and realizing that the DataGrid is 2.0 only was a bummer. However, SourceGrid looks like it is going to work nicely....(&lt;a href="http://weblogs.asp.net/tgraham/archive/2007/01/14/installing-vs-2003-after-vs-2005.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1406099" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET/default.aspx" /><category term="Visual Studio" scheme="http://weblogs.asp.net/tgraham/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>Razr survives the washing machine</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2007/01/11/razr-survives-the-washing-machine.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2007/01/11/razr-survives-the-washing-machine.aspx</id><published>2007-01-12T03:31:00Z</published><updated>2007-01-12T03:31:00Z</updated><content type="html">Following a long night of poker on Saturday, I started a load of laundry. After transferring it to the dryer, I heard a suspicious thumping and found my Razr had gone through the full cycle. I figured it was dead, but I took out the battery and the sim card and let it dry for 2 days. After reassembly and 12 hours of charging, it turned on and displayed a lovely background of clouds. After an hour, the background reverted back to normal, and I could place calls. The speaker and mic were dead, but...(&lt;a href="http://weblogs.asp.net/tgraham/archive/2007/01/11/razr-survives-the-washing-machine.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1393433" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term="Community News" scheme="http://weblogs.asp.net/tgraham/archive/tags/Community+News/default.aspx" /></entry><entry><title>Subversion Hosting</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2007/01/02/subversion-hosting.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2007/01/02/subversion-hosting.aspx</id><published>2007-01-02T23:19:00Z</published><updated>2007-01-02T23:19:00Z</updated><content type="html">I&amp;#39;m always shocked when I encounter people and projects that aren&amp;#39;t using version control. After years of knowing that I can rollback to a previous version, working on files that aren&amp;#39;t versioned scares me. I keep everything possible checked in, including tax files, my diaries, etc. I switched to Subversion 18 months ago and have been very happy with both my free and my paid hosting....(&lt;a href="http://weblogs.asp.net/tgraham/archive/2007/01/02/subversion-hosting.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1352326" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term="General Software Development" scheme="http://weblogs.asp.net/tgraham/archive/tags/General+Software+Development/default.aspx" /></entry><entry><title>Copyright for Software Companies</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2006/12/27/copyright-for-software-companies.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2006/12/27/copyright-for-software-companies.aspx</id><published>2006-12-27T15:09:00Z</published><updated>2006-12-27T15:09:00Z</updated><content type="html">&lt;p&gt;Most programmers only think about copyright when management decrees that every file needs a copyright notice at the top or bottom.&amp;nbsp; Next month, I&amp;rsquo;m sure a junior developer somewhere will be assigned to update the copyright date on a source tree to show 2007, while the features that would make that product a success languish unimplemented.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Read more about &lt;a href="http://www.moneyandsoftware.com/2006/12/18/copyright-for-software-companies/"&gt;copyright for software companies&lt;/a&gt; on my business blog, &lt;a href="http://weblogs.asp.net/controlpanel/blogs/www.MoneyAndSoftware.com"&gt;Money and Software&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1321985" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term="General Software Development" scheme="http://weblogs.asp.net/tgraham/archive/tags/General+Software+Development/default.aspx" /></entry><entry><title>Google Search API fails sporadically with "502 Bad Gateway"</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2006/11/22/google-search-api-fails-sporadically-with-502-bad-gateway.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2006/11/22/google-search-api-fails-sporadically-with-502-bad-gateway.aspx</id><published>2006-11-22T19:37:00Z</published><updated>2006-11-22T19:37:00Z</updated><content type="html">&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;I heard about Google&amp;#39;s &lt;/font&gt;&lt;a href="http://code.google.com/apis/soapsearch/"&gt;&lt;font face="Courier New"&gt;web service interface&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New"&gt; to the search database back when it was released, but today was my first attempt to use it.&lt;span&gt;&amp;nbsp; &lt;/span&gt;I&amp;#39;m trying to learn python, but the SOAP toolkits for python seem to be in a state of flux so I switched back to C# rather than figure out which python libraries to download.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;I experienced two problems, one minor and one major.&lt;span&gt;&amp;nbsp; &lt;/span&gt;The &lt;/font&gt;&lt;a href="http://code.google.com/apis/soapsearch/reference.html#searchrequest"&gt;&lt;font face="Courier New"&gt;doSearch method &lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;takes a bunch of strings, and if you pass null in, you get back weird errors talking about no signature match and java.lang.String.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Passing String.Empty fixes that.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;The second problem is that, requests to search sporadically fail with &amp;quot;502: Bad Gateway&amp;quot;.&lt;span&gt;&amp;nbsp; &lt;/span&gt;From my googling (ah, the irony) for a solution, this has been a problem since January 2006, and is still unsolved.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;The solution on the forums seems to be catch the exception and try again; I didn&amp;#39;t expect that to work, but it did.&lt;span&gt;&amp;nbsp; &lt;/span&gt;I wrote a console app that sent the same string to the gateway 30 times, and it seemed to randomly error out.&lt;span&gt;&amp;nbsp; &lt;/span&gt;A snippet of the output is below:&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;12:27:14.593 - The request failed with HTTP status 502: Bad Gateway.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;12:27:19.046 - Success, found 782000 items.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;12:27:32.625 - Success, found 782000 items.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;12:27:35.000 - Success, found 782000 items.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;12:27:35.984 - The request failed with HTTP status 502: Bad Gateway.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;12:27:39.843 - Success, found 782000 items.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;12:27:42.593 - Success, found 782000 items.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;This makes this obviously unsuitable for anything more than playful experimentation, but since the API doesn&amp;#39;t return ads, I guess Google doesn&amp;#39;t care. &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=999752" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term=".NET best practices" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET+best+practices/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/tgraham/archive/tags/General+Software+Development/default.aspx" /><category term="C#" scheme="http://weblogs.asp.net/tgraham/archive/tags/C_2300_/default.aspx" /><category term="Web Services" scheme="http://weblogs.asp.net/tgraham/archive/tags/Web+Services/default.aspx" /></entry><entry><title>Web Service performance numbers--plenty fast for UI work</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2006/11/15/Web-Service-performance-numbers_2D002D00_plenty-fast-for-UI-work.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2006/11/15/Web-Service-performance-numbers_2D002D00_plenty-fast-for-UI-work.aspx</id><published>2006-11-15T23:12:00Z</published><updated>2006-11-15T23:12:00Z</updated><content type="html">&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;While designing Web Services, the question of &amp;quot;interface granularity&amp;quot; often comes up.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Conventional wisdom is that Web Service calls are slow, so the interface must be quite coarse to prevent performance problems.&lt;/font&gt;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;Four years ago, a partner and I built a 2-tier system, a rich client app that talked directly to a database.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Towards the end of the development cycle, the users said, &amp;quot;We know we said this was for internal use, but we want to use this application over the Internet.&amp;quot; &lt;/font&gt;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;Bam! That is the kind of major requirements change that can kill projects.&lt;span&gt;&amp;nbsp; &lt;/span&gt;After some research, we factored the database calls into an IDataAccess interface that had two implementors: the original database layer and a web service layer that then called the original database layer.&lt;span&gt;&amp;nbsp; &lt;/span&gt;On startup, the app figures out which interface to use.&lt;span&gt;&amp;nbsp; &lt;/span&gt;As our research and prototyping showed, web services are plenty fast for this scenario.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;My current project is also a rich client backed by web services, and we are discussing how quickly the UI needs to respond to the user.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Microsoft&amp;#39;s &lt;a href="http://msdn2.microsoft.com/en-us/library/ms740089.aspx"&gt;performance guidelines&lt;/a&gt;&amp;nbsp;&lt;/font&gt;&lt;font face="Courier New"&gt;suggest one threshold, &amp;quot;A good guideline for interactive response is 500 milliseconds.&amp;quot;&lt;/font&gt;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;Jim Webber&amp;nbsp;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;a href="http://webservices.org/weblog/jim_webber/even_if_you_think_you_can_beat_waldo_you_can_t_beat_einstein"&gt;estimates&lt;/a&gt; that SOAP adds 14 milliseconds round trip.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Network latency is usually less than 50 milliseconds round trip in the US, increasing roughly linearly to a rough maximum of 300 milliseconds worldwide.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;In my experience, a hit to an optimized database costs roughly 20 ms, plus latency to the database machine of another 5-10 ms.&lt;span&gt;&amp;nbsp; &lt;/span&gt;So we are looking at 14 + 50 + 20 + 10 = 94ms.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Add in another 50 ms for authentication, authorization and business logic on the server, which leaves the UI well under the 500 ms limit.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Anyone have numbers for how much SSL increases latency? &lt;/font&gt;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;I just did some performance testing that supports these numbers as reasonable.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Using a unit test that connects to the web service and uses it to insert a row in a database (everything on the same machine), I was seeing average call times of 15 ms.&lt;span&gt;&amp;nbsp; &lt;/span&gt;That leaves room for a lot of latency before the application slows down.&lt;/font&gt;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;On my project four years ago, we were forced into a finer grained (more talkative) interface by previous decisions.&lt;span&gt;&amp;nbsp; &lt;/span&gt;These days, I&amp;#39;m choosing this architecture with my eyes open, and I like the view.&lt;/font&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=934884" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term=".NET best practices" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET+best+practices/default.aspx" /><category term="Software Process" scheme="http://weblogs.asp.net/tgraham/archive/tags/Software+Process/default.aspx" /><category term="Advanced .NET Techniques" scheme="http://weblogs.asp.net/tgraham/archive/tags/Advanced+.NET+Techniques/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET/default.aspx" /><category term="ASP.NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/ASP.NET/default.aspx" /><category term="Windows Forms" scheme="http://weblogs.asp.net/tgraham/archive/tags/Windows+Forms/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/tgraham/archive/tags/General+Software+Development/default.aspx" /></entry><entry><title>Debug vs Release mode differences when storing a delegate in a hashtable</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2005/04/14/400431.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2005/04/14/400431.aspx</id><published>2005-04-14T23:11:00Z</published><updated>2005-04-14T23:11:00Z</updated><content type="html">&lt;p&gt;The following code demonstrates a difference in the behavior of the .NET runtime between debug and release mode.&amp;nbsp; I'm running .NET 1.1 with SP1 on Server 2003, but this also happens on Win2k and XP.&amp;nbsp; We've been seeing it for months, but it was finally isolated by a team in Samara.&lt;/p&gt; &lt;p&gt;The code demonstrates three ways to test if a delegate is stored in the hashtable.&amp;nbsp; All work in debug mode, but the first fails in Release mode unless the Release mode code is running under a debugger.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Does anyone have experience with this problem?&amp;nbsp; Or know if a fix is available already or coming in 2.0?&lt;/p&gt;&lt;font size="2"&gt; &lt;p class="MsoNormal" style="MARGIN: 0in -1.25in 0pt 0in; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;using&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; System;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;using&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; System.Collections;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;namespace&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; DelegatesBug&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Illustrates a difference in the Release and Debug mode behavior of delegates that are&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; contained in a hashtable.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Creates a delegate around a method and adds the delegate to a hashtable.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; At that point, asking the hashtable if it contains a new delegate around the same&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; method returns true in debug mode and false in release mode.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Running the release&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; mode in the debugger returns true (the same result as in debug mode)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;class&lt;/span&gt; DelegatesBug&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 2"&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;[STAThread]&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; &lt;/span&gt;&lt;?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /&gt;&lt;st1:place&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;Main&lt;/span&gt;&lt;/st1:place&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;[] args)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 3"&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; &lt;/span&gt;Test test = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; Test();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 3"&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; &lt;/span&gt;Hashtable hashtable = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; Hashtable();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 3"&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; &lt;/span&gt;TestDelegate td = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; TestDelegate(test.Method);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 3"&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; &lt;/span&gt;hashtable.Add(td, &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 3"&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; &lt;/span&gt;td(); &lt;span style="COLOR: green"&gt;// if this call is commented out, release and debug modes work the same&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 3"&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; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// the&amp;nbsp;Contains&amp;nbsp;call returns false in release mode with no debugger (Ctrl + F5). With &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="COLOR: green"&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;// debug mode or the debugger&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="COLOR: green"&gt;enabled, it returns true. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 3"&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; &lt;/span&gt;Console.WriteLine(&lt;span style="COLOR: red"&gt;"New delegate is contained in hashtable: "&lt;/span&gt; + hashtable.Contains(&lt;span style="COLOR: blue"&gt;new&lt;/span&gt; TestDelegate(test.Method))); &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 3"&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; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// comparing the two delegates returns true&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 3"&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; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;foreach&lt;/span&gt; (MulticastDelegate del &lt;span style="COLOR: blue"&gt;in&lt;/span&gt; hashtable.Keys)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 4"&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&gt;Console.WriteLine(&lt;span style="COLOR: red"&gt;"The delegate from hashtable.Keys equals td: "&lt;/span&gt; + del.Equals(td));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 3"&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; &lt;/span&gt;&lt;span style="COLOR: green"&gt;// asking the hashtable if it contains the original delegate returns true&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 3"&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; &lt;/span&gt;Console.WriteLine(&lt;span style="COLOR: red"&gt;"td is contained in the hashtable: "&lt;/span&gt; + hashtable.Contains(td));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 3"&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; &lt;/span&gt;Console.ReadLine();&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;delegate&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; TestDelegate();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; Test&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Method()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=400431" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term="Advanced .NET Techniques" scheme="http://weblogs.asp.net/tgraham/archive/tags/Advanced+.NET+Techniques/default.aspx" /></entry><entry><title>Executing custom code on attributed classes at compile time</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2004/12/02/273919.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2004/12/02/273919.aspx</id><published>2004-12-02T20:26:00Z</published><updated>2004-12-02T20:26:00Z</updated><content type="html">&lt;div&gt;&lt;span class="760151320"&gt;&lt;font face="Arial" color="#0000ff" size="2"&gt;Eoghan Murray read my&amp;nbsp;&lt;A href="http://weblogs.asp.net/tgraham/archive/2003/08/06/22707.aspx"&gt;blog&lt;/a&gt;&amp;nbsp;on custom attributes and sent the following question:&lt;/font&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="760151320"&gt;&lt;font face="Arial" color="#0000ff" size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;span class="760151320"&gt;&lt;font face="Arial" color="#0000ff" size="2"&gt;&lt;font face="Times New Roman" color="#000000" size="3"&gt;I &lt;/font&gt;&lt;font face="Times New Roman" color="#000000" size="3"&gt;am interested in doing the following:&amp;nbsp; Adding an attribute to certain classes, so that, at Compile time, information about them gets written to an xml file. I see that the built in System.ObsoleteAttribute can raise warnings at compile time, so I want to do something similar, except execute a piece of my own code at compile time.&lt;br /&gt;&lt;br /&gt;Now that I've spelled it out, it seems impossible!&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="760151320"&gt;&lt;font face="Arial" color="#0000ff" size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;span class="760151320"&gt;&lt;font face="Arial" color="#0000ff" size="2"&gt;It is an interesting question.&amp;nbsp; I don't think it is possible to execute the code at compile time.&amp;nbsp; If anyone knows how, please explain.&lt;/font&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="760151320"&gt;&lt;font face="Arial" color="#0000ff" size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;span class="760151320"&gt;&lt;font face="Arial" color="#0000ff" size="2"&gt;What you can do is build a custom attribute and mark your classes with it.&amp;nbsp; Then, have a post-build step that executes a program against the compiled assemblies that uses reflection to find the classes marked with your attribute and execute whatever code you want.&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="760151320"&gt;&lt;font face="Arial" color="#0000ff" size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;span class="760151320"&gt;&lt;font face="Arial" color="#0000ff" size="2"&gt;For example, you create a custom attribute called DocumentThis.&amp;nbsp; You mark all of your classes with that attribute, then create a small Documentor program that reflects over a .NET assembly and writes the name of each class that has the DocumentThis attribute to a text file.&amp;nbsp; Then your post-build step for the project can call Documentor with the project's output as the target.&lt;/font&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="760151320"&gt;&lt;font face="Arial" color="#0000ff" size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;span class="760151320"&gt;&lt;font face="Arial" color="#0000ff" size="2"&gt;That's the best I can think of, let me know how it works.&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=273919" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term="Advanced .NET Techniques" scheme="http://weblogs.asp.net/tgraham/archive/tags/Advanced+.NET+Techniques/default.aspx" /></entry><entry><title>Could not establish trust relationship with remote server.</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2004/08/12/213469.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2004/08/12/213469.aspx</id><published>2004-08-12T14:03:00Z</published><updated>2004-08-12T14:03:00Z</updated><content type="html">&lt;font size="2"&gt; &lt;p&gt;When you use HTTPS for your web services, you may get a System.Net.WebException that, "The underlying connection was closed: Could not establish trust relationship with remote server." This indicates that the client is unable to negotiate a secure connection with the server. &lt;/p&gt; &lt;p&gt;Try visiting the URL of your web service with IE. You will likely get a Security Alert message box warning about one or more of the following:&lt;/p&gt; &lt;p&gt;1) The certificate is not from a trusted authority. This happens if the issuing authority is not trusted by the Certificate Manager. For testing, you can issue your own certificates and add yourself to the trusted authorities list. For production, you should probably buy a certificate.&lt;/p&gt; &lt;p&gt;2) The date on the certificate is invalid. The certificate's dates don't match those on the client computer. If this happens only on some computers, check that the clock on the offending computers is set to the right day.&lt;/p&gt; &lt;p&gt;3) The name on the certificate does not match the name of the site. Most certificates are issued with a www prefix; for example: &lt;/font&gt;&lt;A href="http://weblogs.asp.net/tgraham/admin/www.yahoo.com"&gt;&lt;u&gt;&lt;font color="#0000ff" size="2"&gt;www.yahoo.com&lt;/u&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt;. If your web service is hosted on a named server, (daffy.yahoo.com) you will get this warning. I understand you can buy wildcard certificates that accept any server name, but I've never used them.&lt;/p&gt; &lt;p&gt;Once you know the problem, you can decide to fix it, or ignore it when establishing the connection. The following class shows how to selectively ignore any CertificateProblems that you choose. Use this carefully, as establishing a secure connection to an attacker's server is worse than sending data in the clear.&lt;/p&gt; &lt;p&gt;using System;&lt;br /&gt;using System.Net;&lt;br /&gt;using System.Security.Cryptography.X509Certificates;&lt;br /&gt;&lt;br /&gt;namespace Graham.Utilities&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class AcceptServerNameMismatch : ICertificatePolicy&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; // HACK: This is a workaround.&amp;nbsp; The .NET Framwork should expose these, but they don't.&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; public enum CertificateProblem : long&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; {&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; CertEXPIRED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204801,&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; CertVALIDITYPERIODNESTING&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204802,&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; CertROLE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204803,&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; CertPATHLENCONST&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204804,&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; CertCRITICAL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204805,&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; CertPURPOSE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204806,&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; CertISSUERCHAINING&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204807,&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; CertMALFORMED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204808,&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; CertUNTRUSTEDROOT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204809,&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; CertCHAINING&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204810,&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; CertREVOKED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204812,&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; CertUNTRUSTEDTESTROOT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204813,&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; CertREVOCATION_FAILURE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204814,&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; CertCN_NO_MATCH&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204815,&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; CertWRONG_USAGE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204816,&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; CertUNTRUSTEDCA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2148204818&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; }&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Implement CheckValidationResult to ignore problems that we are willing to accept.&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;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool CheckValidationResult(ServicePoint sp, X509Certificate cert,&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; WebRequest request, int problem)&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;&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; int CertificateNameDoesntMatch = unchecked( (int) CertificateProblem.CertCN_NO_MATCH);&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; if ( problem == CertificateNameDoesntMatch ) // only accept server name failed match&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; return true;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The 1.1 framework calls this method with a problem of 0, even if nothing is wrong&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; return (problem == 0);&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;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=213469" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term="Advanced .NET Techniques" scheme="http://weblogs.asp.net/tgraham/archive/tags/Advanced+.NET+Techniques/default.aspx" /></entry><entry><title>Determine if a .NET Assembly is Release or Debug</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2004/06/16/157545.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2004/06/16/157545.aspx</id><published>2004-06-16T21:30:00Z</published><updated>2004-06-16T21:30:00Z</updated><content type="html">&lt;FONT size=2&gt;
&lt;P&gt;We recently got a bug report where a tester got a Debug.Assert failure in what I thought was a Release mode build. I went over to her machine, but found I couldn't tell from the binaries if it was a Release or a Debug build. ILDASM is no help, as Debug and Release are just build modes, and don't leave markers in the assemblies. &lt;/P&gt;
&lt;P&gt;To differentiate between Release and Debug builds, I added the following to my AssemblyInfo.cs&lt;/P&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;
&lt;P style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;// Compile a Debug or Release flag into the assembly.&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;#if&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; DEBUG &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;FONT color=#000000&gt;[assembly: AssemblyDescription(&lt;/FONT&gt;&lt;SPAN style="COLOR: red"&gt;"Debug"&lt;/SPAN&gt;&lt;FONT color=#000000&gt;)] &lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;#else&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: gray; FONT-FAMILY: 'Courier New'"&gt;[assembly: AssemblyDescription("Release")] &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;#endif&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;&lt;FONT color=#000000&gt;&lt;FONT face="Times New Roman"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;This places Debug or Release in the file's metadata, where it can be seen under Properties | Version | Comments.&lt;/P&gt;&lt;/FONT&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=157545" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term=".NET best practices" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET+best+practices/default.aspx" /><category term="Advanced .NET Techniques" scheme="http://weblogs.asp.net/tgraham/archive/tags/Advanced+.NET+Techniques/default.aspx" /></entry><entry><title>ExecutionEngineException explained</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2004/06/07/150225.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2004/06/07/150225.aspx</id><published>2004-06-07T17:22:00Z</published><updated>2004-06-07T17:22:00Z</updated><content type="html">&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=304350217-07062004&gt;&lt;FONT face=Arial size=2&gt;Last week several of our developers, myself included,&amp;nbsp;experienced repeatable crashes of our Windows Forms application with an ExecutionEngineException.&amp;nbsp; MSDN describes it as "The exception that is thrown when there is an internal error in the execution engine of the common language runtime.", which didn't help us to track it down.&amp;nbsp; The debugger was useless, as ExecutionEngineException cannot be caught and the callstack was pointing into a Application Block that hadn't changed.&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=304350217-07062004&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT size=2&gt;&lt;FONT face=Arial&gt;&lt;SPAN class=304350217-07062004&gt;Our problem turned out to be old versions of some of our assemblies in a folder that was in the DEVPATH environment variable.&amp;nbsp; Our nAnt build uses the resgen tool, which requires setting the DEVPATH variable.&amp;nbsp; Unfortunately, DEVPATH breaks the normal .NET loading rules.&amp;nbsp; DEVPATH assemblies are bound to at runtime, ignoring the assembly version, and overriding the GAC.&amp;nbsp; (&lt;/SPAN&gt;&lt;SPAN class=304350217-07062004&gt;&lt;A href="http://blogs.msdn.com/suzcook/archive/2003/08/15/57238.aspx"&gt;http://blogs.msdn.com/suzcook/archive/2003/08/15/57238.aspx&lt;/A&gt;)&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=304350217-07062004&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=304350217-07062004&gt;&lt;FONT face=Arial size=2&gt;Lessons learned:&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN class=304350217-07062004&gt;&lt;FONT face=Arial size=2&gt;Don't use DEVPATH - See Suzanne Cook's linked blog above for all the reasons why&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class=304350217-07062004&gt;&lt;FONT face=Arial size=2&gt;One cause of ExecutionEngineException is mixing assemblies at runtime that weren't compiled together on the last compile.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class=304350217-07062004&gt;&lt;FONT face=Arial size=2&gt;If only some developers or users are experiencing a problem, don't write it off as unreproducible.&amp;nbsp; Finding the difference that causes the problem will lead you to the solution.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;SPAN class=304350217-07062004&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=150225" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term=".NET best practices" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET+best+practices/default.aspx" /></entry></feed>