<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>esmithy.net &#187; Bafflers</title>
	<atom:link href="http://esmithy.net/category/programming/bafflers/feed/" rel="self" type="application/rss+xml" />
	<link>http://esmithy.net</link>
	<description>Stuff Hammered Out by Eric Smith</description>
	<lastBuildDate>Fri, 02 Jul 2010 20:35:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>.NET Color Struct Equality</title>
		<link>http://esmithy.net/2009/12/16/net-color-struct-equality/</link>
		<comments>http://esmithy.net/2009/12/16/net-color-struct-equality/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 00:47:55 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Bafflers]]></category>

		<guid isPermaLink="false">http://esmithy.net/?p=322</guid>
		<description><![CDATA[When is white not white? When one is Color.White and the other is Color.FromArgb(0xff, 0xff, 0xff, 0xff). I was trying to data bind a list of colors to a ComboBox and have the SelectedValue property bound to a particular color. The frustrating thing was that even though there was a color matching the &#8220;selected&#8221; color [...]]]></description>
			<content:encoded><![CDATA[<p>When is white not white? When one is Color.White and the other is Color.FromArgb(0xff, 0xff, 0xff, 0xff).</p>
<p><span id="more-322"></span>I was trying to data bind a list of colors to a ComboBox and have the SelectedValue property bound to a particular color. The frustrating thing was that even though there was a color matching the &#8220;selected&#8221; color in the list, the ComboBox never had a selection when first displayed.</p>
<p>Eventually I discovered that my &#8220;selected&#8221; color was white (all color components at 255) while the list&#8217;s equivalent was Color.White. Careful reading of the <a href="http://msdn.microsoft.com/en-us/library/e03x8ct2.aspx">Color.Equals</a> documentation tells me that I was silly to think that white is white or black is black:</p>
<blockquote><p><span> <span><a id="ctl00_MTCS_main_ctl36_ctl00_ctl03" onclick="javascript:Track('ctl00_MTCS_main_ctl36_ctl00_contenthere|ctl00_MTCS_main_ctl36_ctl00_ctl03',this);" href="http://msdn.microsoft.com/en-us/library/system.drawing.color.black.aspx">Black</a></span> and <span class="code">FromArgb(0,0,0)</span> are not considered equal, since <span><a id="ctl00_MTCS_main_ctl36_ctl00_ctl04" onclick="javascript:Track('ctl00_MTCS_main_ctl36_ctl00_contenthere|ctl00_MTCS_main_ctl36_ctl00_ctl04',this);" href="http://msdn.microsoft.com/en-us/library/system.drawing.color.black.aspx">Black</a></span> is a named color and <span class="code">FromArgb(0,0,0)</span> is not.</span></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://esmithy.net/2009/12/16/net-color-struct-equality/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unicode Surprises</title>
		<link>http://esmithy.net/2007/10/11/unicode-surprises/</link>
		<comments>http://esmithy.net/2007/10/11/unicode-surprises/#comments</comments>
		<pubDate>Fri, 12 Oct 2007 03:15:33 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Bafflers]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://esmithy.net/2007/10/11/unicode-surprises/</guid>
		<description><![CDATA[I got a defect from QA today saying that our product was unable to track files in paths containing Unicode characters. I&#8217;ll admit that I was skeptical. I had just tried that myself the other day and it worked perfectly. Trying it again today also worked perfectly, but the QA engineer showed me otherwise. The path [...]]]></description>
			<content:encoded><![CDATA[<p>I got a defect from QA today saying that our product was unable to track files in paths containing Unicode characters. I&#8217;ll admit that I was skeptical. I had just tried that myself the other day and it worked perfectly. Trying it again today also worked perfectly, but the QA engineer showed me otherwise.</p>
<p><span id="more-117"></span></p>
<p>The path with the problem was something like this: <code>\\qa\tests\۩۩۩۩۩</code></p>
<p> The unusual character there is the Arabic symbol &#8220;Place of Sajdah&#8221; (U+06E9). For some reason, this path didn&#8217;t work correctly.</p>
<p>Ultimately, I tracked the problem down to a bit of code that was trying to test whether the path ended with a separator character, and if not, add one. It looked like this.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #008000;">!</span>path.<span style="color: #0000FF;">EndsWith</span><span style="color: #000000;">&#40;</span>Path.<span style="color: #0000FF;">DirectorySeparatorChar</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    path <span style="color: #008000;">+=</span> Path.<span style="color: #0000FF;">DirectorySeparatorChar</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>This code wasn&#8217;t working as expected, so when the path was combined (using string concatenation) with a file name, the path separator was missing, which lead to the final symptom described by the defect. There are a couple of problems with this code.</p>
<ol>
<li><code>System.IO.Path.Combine</code> is the right way to merge paths where possible &#8212; you shouldn&#8217;t have to worry about whether there is a trailing slash or not</li>
<li>The simplest form of <code>EndsWith</code> (and <code>StartsWith</code>) doesn&#8217;t work as expected with roughly 20% of Unicode characters</li>
</ol>
<p><a href="http://blogs.msdn.com/michkap/archive/2005/01/18/355210.aspx">Michael Kaplan explains</a> that this is because many Unicode characters don&#8217;t have entries in the Windows sorting weight tables, and are therefore effectively invisible for some comparisons.</p>
<p>Surprisingly, <code>@"\\qa\tests\۩۩۩۩۩".EndsWith(@"\")</code> evaluates to <code>true</code>. All of the Place of Sajdah characters are &#8220;invisible&#8221; in terms of weight, and once you realize that, then <em>obviously</em> the string ends with a backslash. Also surprising is that all strings start with &#8220;۩&#8221;. That is, <code>"Cheese".StartsWith("۩")</code> evaluates to <code>true</code>. The <code>string.Equals</code> method and operator don&#8217;t have this problem, though, because they compare lengths before ever getting to the part where the Place of Sajdah characters would be thrown out of &#8220;۩۩۩Monkey۩۩۩&#8221; and thus become equal to &#8220;Monkey&#8221;.</p>
<p>The way to fix the problem is to use either <code>StringComparison.Ordinal</code> or <code>StringComparison.OrdinalIgnoreCase</code> in the call to <code>StartsWith</code> or <code>EndsWith</code>. So the code snippet from above would work as expected when modified as follows:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #008000;">!</span>path.<span style="color: #0000FF;">EndsWith</span><span style="color: #000000;">&#40;</span>Path.<span style="color: #0000FF;">DirectorySeparatorChar</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, StringComparison.<span style="color: #0000FF;">OrdinalIgnoreCase</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    path <span style="color: #008000;">+=</span> Path.<span style="color: #0000FF;">DirectorySeparatorChar</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://esmithy.net/2007/10/11/unicode-surprises/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Finding Unmanaged Memory Leaks</title>
		<link>http://esmithy.net/2007/06/25/finding-unmanaged-memory-leaks/</link>
		<comments>http://esmithy.net/2007/06/25/finding-unmanaged-memory-leaks/#comments</comments>
		<pubDate>Tue, 26 Jun 2007 02:59:43 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Bafflers]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://esmithy.net/2007/06/25/finding-unmanaged-memory-leaks/</guid>
		<description><![CDATA[At work we had a long-running .NET process whose memory usage seemed to be going up, but not coming down. In investigating, I learned a few things about leak hunting, and ultimately tracked down perhaps the most insidious leak I&#8217;ve ever seen. My first approach was to try to profile the process&#8217; memory usage with [...]]]></description>
			<content:encoded><![CDATA[<p>At work we had a long-running .NET process whose memory usage seemed to be going up, but not coming down. In investigating, I learned a few things about leak hunting, and ultimately tracked down perhaps the most insidious leak I&#8217;ve ever seen.</p>
<p><span id="more-97"></span></p>
<p>My first approach was to try to profile the process&#8217; memory usage with the Visual Studio 2005 profiler, but after wading through the report for a while, I was stymied by a minor obstacle: I didn&#8217;t know what the heck I was doing. I didn&#8217;t have a good sense of what the memory in a .NET process ought to look like, or what was unusual. I found some useful information in an <a href="http://www.itwriting.com/dotnetmem.php">article by Tim Anderson</a>, but I still was lost.</p>
<p>I thought maybe a dedicated profiler might steer me along better, so I downloaded a trial of Red Gate&#8217;s ANTS profiler. After spending some time with it, I found a few little memory issues (did you know that the default Windows Forms icon is something like 10K compared to a blank icon at 1K?), and some potential bigger issues (we have a background thread that holds a large data structure in memory even when the thread is paused). The epiphany came when I realized that I was looking at a process with 100 MB in private bytes, but the entire managed heap was less than 1 MB. The leak wasn&#8217;t even in the managed heap.</p>
<p>I wondered if there might be some way to use the unmanaged debug heap, and <a href="http://msdn2.microsoft.com/en-us/library/d41t22sb(VS.80).aspx">_CrtDumpMemoryLeaks</a> from a C# application. I briefly considered pinvoke, but quickly ran into complications with loading the C runtime libraries, since they have to be in the side-by-side directory and only loaded from an application with a valid manifest, etc. etc.</p>
<p>Wayne Nelson, my boss, reminded me of a module that makes heavy use of unmanaged code that we&#8217;ve suspected of leaking for a while, and we came up with the idea of exercising that code in the presence of performance counters. It was pretty easy to write a little console application that referenced that module, invoking its main call path in a loop of 100,000 iterations.</p>
<p>Then I opened Performance Monitor and added a couple of counters: One for the process private bytes, and the other for the total bytes in all managed heaps in the process. I also scaled the private bytes to match the scaling of the managed heaps. Here is the resulting graph, where the blue line is private bytes, and the yellow line is managed bytes:</p>
<p><img class="photo" src="http://esmithy.net/content/leaks1.png" alt="Memory Leak" /></p>
<p>It&#8217;s obvious that the leak is, in fact, in unmanaged memory. The first jump is due to loading in some native DLLs, but the steady climb from there to the next plateu represents the 100,000 loop iterations.</p>
<p>Having the graph as a tool, it became a matter of doing a conceptual binary search through the code. I would comment out large chunks until the private bytes line ran flat. Then I knew that the leak was in the commented-out code. In this case it became <em>almost</em> reductio ad absurdum. All that was left was a pinvoke call:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">int</span> result <span style="color: #008000;">=</span> NativeMethods.<span style="color: #0000FF;">StgOpenStorageOnILockBytes</span><span style="color: #000000;">&#40;</span>lockBytes,
  IntPtr.<span style="color: #0000FF;">Zero</span>,
  <span style="color: #0600FF;">this</span>.<span style="color: #0600FF;">readOnly</span> <span style="color: #008000;">?</span> PropertyReadFlags <span style="color: #008000;">:</span> PropertyWriteFlags,
  IntPtr.<span style="color: #0000FF;">Zero</span>,
  <span style="color: #FF0000;">0</span>,
  <span style="color: #0600FF;">out</span> storage<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>The ILockBytes being passed in was my own C# implementation that wrapped a System.IO.Stream instance, so to get a little closer to absurdum, I made it a zero byte Stream and <em>still</em> had the leak. In other words, I was trying to open structured storage on a zero byte stream, which obviously failed, but still caused a memory leak. The only things left in play were my pinvoke signature, and my ILockBytes implementation, which didn&#8217;t allocate any unmanaged memory.</p>
<p>The call to StgOpenStorageOnILockBytes did call my ILockBytes Stat method:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Stat<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">ref</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Runtime</span>.<span style="color: #0000FF;">InteropServices</span></span>.<span style="color: #0000FF;">ComTypes</span>.<span style="color: #0000FF;">STATSTG</span> pstatstg, <span style="color: #FF0000;">int</span> grfStatFlag<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
  pstatstg.<span style="color: #0000FF;">cbSize</span> <span style="color: #008000;">=</span> stream.<span style="color: #0000FF;">Length</span><span style="color: #008000;">;</span>
  pstatstg.<span style="color: #0000FF;">type</span> <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span><span style="color: #000000;">&#41;</span>STGTY.<span style="color: #0000FF;">LOCKBYTES</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>It seemed pretty harmless.</p>
<p>A hint came from the <a href="http://msdn2.microsoft.com/en-us/library/aa379249.aspx">ILockBytes::Stat documentation</a>. If grfStatFlag is STATFLAG_NONAME, then the Stat implementation shouldn&#8217;t allocate the STATSTG::pwcsName member. Checking in the debugger, grfStatFlag was, in fact, STATFLAG_NONAME. But I wasn&#8217;t allocating any memory or setting pwcsName anyway.</p>
<p>Then I realized that the STATSTG structure was coming from unmanaged code, and as such code is wont, it was completely uninitialized. The pwcsName member was coming through pointing to garbage. I changed my Stat implementation to set pwcsName to null, and my Performance Monitor graph went sublimely flat. My theory is that upon returning from the Stat method, the marshaler was taking the never initialized garbage string and allocating a copy with CoTaskMemAlloc. But since the caller had specified STATFLAG_NONAME, it was not expecting to need to free any memory. For good measure, I initialized all of the STATSTG members.</p>
<p>While this was a pretty strange leak, the strategy for finding it can be applied to other more mundane leaks as well.</p>
<ol>
<li>Write a small program that repeatedly calls any suspect code (anything that calls unmanaged code).</li>
<li>Set up a Performance Monitor session that graphs both private bytes and the managed heaps to see if you&#8217;ve found the general leaky area.</li>
<li>Start trimming the code and rerunning the test program until the leak disappears.</li>
<li>Figure out what could possibly leak in the located code.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://esmithy.net/2007/06/25/finding-unmanaged-memory-leaks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ArgumentException Creating an XmlSerializer</title>
		<link>http://esmithy.net/2007/05/26/argumentexception-creating-an-xmlserializer/</link>
		<comments>http://esmithy.net/2007/05/26/argumentexception-creating-an-xmlserializer/#comments</comments>
		<pubDate>Sat, 26 May 2007 20:00:02 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Bafflers]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://esmithy.net/2007/05/26/argumentexception-creating-an-xmlserializer/</guid>
		<description><![CDATA[I ran into a kind of baffling problem. I&#8217;ve got some .NET code that is also accessible to Java via JNI. There are unit tests for the .NET code that all pass. To test the Java to .NET connection, I wrote a few JUnit tests which worked fine when run from the IDE, but failed [...]]]></description>
			<content:encoded><![CDATA[<p>I ran into a kind of baffling problem. I&#8217;ve got some .NET code that is also accessible to Java via JNI. There are unit tests for the .NET code that all pass. To test the Java to .NET connection, I wrote a few JUnit tests which worked fine when run from the IDE, but failed when run from Ant. The failure was ultimately caused by an ArgumentException when creating an XmlSerializer.</p>
<p><span id="more-93"></span></p>
<p>The exception was thrown from line 5 in the code below.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> FileTypeHandlerCatalog Load<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> fileName<span style="color: #000000;">&#41;</span> 
<span style="color: #000000;">&#123;</span> 
<span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span>StreamReader reader <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StreamReader<span style="color: #000000;">&#40;</span>fileName<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> 
    <span style="color: #000000;">&#123;</span>         
        XmlSerializer serializer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> XmlSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>FileTypeHandlerCatalog<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        FileTypeHandlerCatalog catalog <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>FileTypeHandlerCatalog<span style="color: #000000;">&#41;</span>serializer.<span style="color: #0000FF;">Deserialize</span><span style="color: #000000;">&#40;</span>reader<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> 
        catalog.<span style="color: #0000FF;">Validate</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> 
        <span style="color: #0600FF;">return</span> catalog<span style="color: #008000;">;</span> 
    <span style="color: #000000;">&#125;</span> 
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>The exception message wasn&#8217;t terribly helpful either since it was obviously disgorging Â implementation details from somewhere deep in the XmlSerializer class:</p>
<p><code>System.ArgumentException: Item has already been added. Key in dictionary: 'path' Key being added: 'path'</code></p>
<p>The stack trace led me to the <code>System.CodeDom.Compiler.Executor.ExecWaitWithCaptureUnimpersonated</code> method, which contains the following bit of code:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">StringDictionary sd <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StringDictionary<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> 
<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>DictionaryEntry entry <span style="color: #0600FF;">in</span> Environment.<span style="color: #0000FF;">GetEnvironmentVariables</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> 
<span style="color: #000000;">&#123;</span> 
  sd.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#41;</span> entry.<span style="color: #0000FF;">Key</span>, <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#41;</span> entry.<span style="color: #0000FF;">Value</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> 
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>I guess it is copying the environment variables so that it can add a new one related to security. The problem is that when running under Ant, for some reason there were three different PATH environment variables with an assortment of cases: PATH, Path and path. Looking at the <code>StringDictionary.Add</code> implementation, the problem became clear. In line 7, it converts the key to lower case in order to add it to the hash table, resulting in duplicate keys.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">virtual</span> <span style="color: #0600FF;">void</span> Add<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> key, <span style="color: #FF0000;">string</span> value<span style="color: #000000;">&#41;</span> 
<span style="color: #000000;">&#123;</span> 
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>key <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> 
    <span style="color: #000000;">&#123;</span> 
        <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentNullException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;key&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> 
    <span style="color: #000000;">&#125;</span>     
    <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">contents</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>key.<span style="color: #0000FF;">ToLower</span><span style="color: #000000;">&#40;</span>CultureInfo.<span style="color: #0000FF;">InvariantCulture</span><span style="color: #000000;">&#41;</span>, value<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> 
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>So it appears to be a bug in the Executor class &#8212; it doesn&#8217;t expect to encounter multiple keys in the environment variable dictionary that differ only by case.</p>
<p>I solved the problem by pregenerating the serialization assembly using sgen, which is generally a good idea anyway.</p>
]]></content:encoded>
			<wfw:commentRss>http://esmithy.net/2007/05/26/argumentexception-creating-an-xmlserializer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
