<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Adam Nathan's Blog : Quizzes</title><link>http://blogs.msdn.com/adam_nathan/archive/tags/Quizzes/default.aspx</link><description>Tags: Quizzes</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Quiz: Searching in a managed array</title><link>http://blogs.msdn.com/adam_nathan/archive/2003/08/22/56739.aspx</link><pubDate>Fri, 22 Aug 2003 21:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:56739</guid><dc:creator>Adam Nathan</dc:creator><slash:comments>15</slash:comments><comments>http://blogs.msdn.com/adam_nathan/comments/56739.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adam_nathan/commentrss.aspx?PostID=56739</wfw:commentRss><wfw:comment>http://blogs.msdn.com/adam_nathan/rsscomments.aspx?PostID=56739</wfw:comment><description>&lt;P&gt;Sorry for my recent lack of blogging.&amp;nbsp; There's been a lot going on these days! &lt;/P&gt;
&lt;P&gt;As the banner on my blog now indicates, you'll be able to catch me at two upcoming conferences.&amp;nbsp; As with TechEd in June, Sonja Keserovic and I will be giving an Interop presentation at this year's PDC in October.&amp;nbsp; This presentation will be brand new, though.&amp;nbsp; Feel free to make suggestions if you're dying to hear about certain topics!&amp;nbsp; One month before that, I'll be giving two presentations at WinSummit in Switzerland - one on PInvoke, and one on COM Interoperability.&amp;nbsp; Hopefully I'll see you there! &lt;/P&gt;
&lt;P&gt;Yesterday I learned about something that surprised me.&amp;nbsp; Maybe it won't surprise you, but I'm going to share it anyway.&amp;nbsp; If it prevents just one person from introducing a subtle bug in their code, then it was worth it! &lt;/P&gt;
&lt;P&gt;If you're writing managed code and you&amp;nbsp;need to efficiently find elements in an array, you'll be happy to know that you don't have to write your own binary search algorithm.&amp;nbsp; &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemArrayClassTopic.asp"&gt;System.Array&lt;/A&gt;&amp;nbsp;has a static &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemArrayClassBinarySearchTopic.asp"&gt;BinarySearch&lt;/A&gt; method!&amp;nbsp; (&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemcollectionsarraylistclasstopic.asp"&gt;System.Collections.ArrayList&lt;/A&gt; has an instance &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemcollectionsarraylistclassbinarysearchtopic.asp"&gt;BinarySearch&lt;/A&gt; method, too.) &lt;/P&gt;
&lt;P&gt;So what's wrong with the following C# code?&amp;nbsp; Why does it print "&lt;STRONG&gt;Not found!&lt;/STRONG&gt;"? &lt;/P&gt;
&lt;P&gt;&lt;FONT face=courier color=blue&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // WARNING: This code has a bug!&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int [] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int index = Array.BinarySearch(numbers, 3); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=courier color=blue&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (index &amp;lt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Not found!");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Found at index " + index);&lt;/FONT&gt; &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=56739" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/adam_nathan/archive/tags/Quizzes/default.aspx">Quizzes</category><category domain="http://blogs.msdn.com/adam_nathan/archive/tags/Managed+Code/default.aspx">Managed Code</category></item><item><title>Quiz: Gotcha with Exceptions and HRESULTs</title><link>http://blogs.msdn.com/adam_nathan/archive/2003/06/13/56713.aspx</link><pubDate>Sat, 14 Jun 2003 04:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:56713</guid><dc:creator>Adam Nathan</dc:creator><slash:comments>12</slash:comments><comments>http://blogs.msdn.com/adam_nathan/comments/56713.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adam_nathan/commentrss.aspx?PostID=56713</wfw:commentRss><wfw:comment>http://blogs.msdn.com/adam_nathan/rsscomments.aspx?PostID=56713</wfw:comment><description>&lt;P&gt;The C# code below, when executed, prints the following: &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;0x80004002&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;0x80004002&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Who can figure out why the second line printed isn't &lt;SPAN&gt;0x80004003&lt;/SPAN&gt;? &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;using System;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;using System.Runtime.InteropServices;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;public class Quiz&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;const int E_NOINTERFACE = unchecked((int)0x80004002);&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;const int E_POINTER = unchecked((int)0x80004003);&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public static void Main ()&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;try&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Marshal.ThrowExceptionForHR(E_NOINTERFACE);&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;catch (Exception ex)&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Console.WriteLine("0x{0:x}", Marshal.GetHRForException(ex));&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;try&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Marshal.ThrowExceptionForHR(E_POINTER);&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;catch (Exception ex)&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Console.WriteLine("0x{0:x}", Marshal.GetHRForException(ex));&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&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&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;}&lt;/SPAN&gt; &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=56713" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/adam_nathan/archive/tags/Quizzes/default.aspx">Quizzes</category><category domain="http://blogs.msdn.com/adam_nathan/archive/tags/Managed+Code/default.aspx">Managed Code</category></item><item><title>CLR SPY and Customer Debug Probes: The Object Not Kept Alive and Buffer Overrun Probes (A Quiz)</title><link>http://blogs.msdn.com/adam_nathan/archive/2003/06/05/56697.aspx</link><pubDate>Fri, 06 Jun 2003 01:11:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:56697</guid><dc:creator>Adam Nathan</dc:creator><slash:comments>15</slash:comments><comments>http://blogs.msdn.com/adam_nathan/comments/56697.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adam_nathan/commentrss.aspx?PostID=56697</wfw:commentRss><wfw:comment>http://blogs.msdn.com/adam_nathan/rsscomments.aspx?PostID=56697</wfw:comment><description>&lt;P&gt;The Object Not Kept Alive and Buffer Overrun probes are unlike any other CDPs, because they do not output any messages to report bugs in your code.&amp;nbsp; Instead, they change general CLR behavior with the goal of forcing non-deterministic bugs that can be almost impossible to reproduce into bugs that will happen every time you run your application.&amp;nbsp; As a developer or tester, that's obviously a good thing.&amp;nbsp; The lack of a specific probe message might make such bugs somewhat harder to diagnose, but once you understand the probes' behavior, you can learn to be successful with them. &lt;/P&gt;
&lt;P&gt;The Object Not Kept Alive probe forces a garbage collection (then waits at most a second for pending finalizers) immediately &lt;EM&gt;before&lt;/EM&gt; every transition from managed to unmanaged code.&amp;nbsp; This is done to surface problems that could occur if a managed object happens to be collected during the small time window when transitioning to unmanaged code.&amp;nbsp; I find this to be one of the most useful of all the CDPs. &lt;/P&gt;
&lt;P&gt;The Buffer Overrun probe forces a garbage collection (then waits at most a second for pending finalizers) immediately &lt;EM&gt;after &lt;/EM&gt;every transition from managed to unmanaged code.&amp;nbsp; The intent of this is to catch buffer overruns, which unmanaged code has the power to cause.&amp;nbsp; (Managed code does too -- even verifiable managed code if it uses methods of the Marshal class, which require unmanaged code permission.)&amp;nbsp; If unmanaged code writes into memory that it's not supposed to, it could potentially corrupt the GC heap.&amp;nbsp; The next time the garbage collector compresses the heap (as part of a collection), it's likely to run into an access violation.&amp;nbsp; So by forcing a collection after every call into unmanaged code, the corruption can hopefully be noticed at the source of the problem. &lt;/P&gt;
&lt;P&gt;Due to the large number of collections forced by these probes, they will significantly slow down most applications. &lt;/P&gt;
&lt;P&gt;Now consider the following harmless-looking C# code that uses the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfmicrosoftwin32registrykeyclasstopic.asp"&gt;Microsoft.Win32.RegistryKey&lt;/A&gt; class: &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;// This code has a bug!&lt;O:P&gt;&lt;/O:P&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public static void Main ()&lt;O:P&gt;&lt;/O:P&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;{&lt;O:P&gt;&lt;/O:P&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;// Open the key for read-only access&lt;O:P&gt;&lt;/O:P&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;RegistryKey key = Registry.LocalMachine.OpenSubKey(&lt;O:P&gt;&lt;/O:P&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;"Software\\Microsoft\\.NETFramework");&lt;O:P&gt;&lt;/O:P&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Console.WriteLine("Install root: " +&lt;/SPAN&gt; &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; key.GetValue("InstallRoot"));&lt;O:P&gt;&lt;/O:P&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt; &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Most likely, this code will run fine if you don't enable any probes.&amp;nbsp; If you enable the Object Not Kept Alive debug probe and compile this code with debugging information ("csc /debug ObjectNotKeptAlive.cs" from a command prompt, or the Debug solution configuration in Visual Studio .NET), you'll still get the output that you'd expect when running the program.&amp;nbsp; For example: &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Install root: c:\windows\microsoft.net\framework&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;But if you compile it without debugging information ("csc ObjectNotKeptAlive.cs" from a command prompt, or the Release solution configuration in Visual Studio .NET) with the Object Not Kept Alive probe still enabled, you get surprising output: &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Install root:&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Weird, huh? &lt;/P&gt;
&lt;P&gt;Do you see any bugs in the code?&amp;nbsp; Who can tell me why this happens with the probe enabled?&amp;nbsp; Why does it only happen in the debug configuration?&amp;nbsp; My last quiz was answered pretty quickly, so please contribute any of your thoughts! &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=56697" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/adam_nathan/archive/tags/Quizzes/default.aspx">Quizzes</category><category domain="http://blogs.msdn.com/adam_nathan/archive/tags/Managed+Code/default.aspx">Managed Code</category></item><item><title>Quiz: What's wrong with the following code?</title><link>http://blogs.msdn.com/adam_nathan/archive/2003/05/06/56650.aspx</link><pubDate>Wed, 07 May 2003 00:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:56650</guid><dc:creator>Adam Nathan</dc:creator><slash:comments>36</slash:comments><comments>http://blogs.msdn.com/adam_nathan/comments/56650.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adam_nathan/commentrss.aspx?PostID=56650</wfw:commentRss><wfw:comment>http://blogs.msdn.com/adam_nathan/rsscomments.aspx?PostID=56650</wfw:comment><description>&lt;P&gt;The following C# code has the goal of enabling managed code to call &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/devcons_5g83.asp"&gt;CreateDC&lt;/A&gt;, but it's incorrect.&amp;nbsp; Calling all Interop aficionados... Can you see what's wrong? &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;using System;&lt;/SPAN&gt; &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;using System.Runtime.InteropServices;&lt;/SPAN&gt; &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;internal class DeviceContext&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;[DllImport("gdi32.dll", CharSet=CharSet.Auto)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;SPAN&gt;internal &lt;/SPAN&gt;&lt;/SPAN&gt;static extern IntPtr CreateDC(&lt;/SPAN&gt; &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string lpszDriver, string lpszDevice,&lt;/SPAN&gt; &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string lpszOutput, ref DEVMODE lpInitData);&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;[StructLayout(LayoutKind.Sequential)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;internal &lt;/SPAN&gt;class DEVMODE&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;[MarshalAs(UnmanagedType.ByValArray, SizeConst=32)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public char [] dmDeviceName;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmSpecVersion;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmDriverVersion;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmSize;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmDriverExtra;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmFields;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public DEVMODE_UNION u;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmColor;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmDuplex;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmYResolution;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmTTOption;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmCollate;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;[MarshalAs(UnmanagedType.ByValArray, SizeConst=32)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public byte [] dmFormName;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmLogPixels;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmBitsPerPel;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmPelsWidth;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmPelsHeight;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmDisplayFlagsOrdmNup;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmDisplayFrequency;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmICMMethod;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmICMIntent;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmMediaType;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmDitherType;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmReserved1;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmReserved2;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmPanningWidth;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmPanningHeight;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;[StructLayout(LayoutKind.Explicit)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;internal &lt;/SPAN&gt;struct DEVMODE_UNION &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;[FieldOffset(0)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmOrientation;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;[FieldOffset(2)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmPaperSize;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;[FieldOffset(4)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmPaperLength;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;[FieldOffset(6)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmPaperWidth;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;[FieldOffset(8)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmScale;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;[FieldOffset(10)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmCopies;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;[FieldOffset(12)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmDefaultSource;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;[FieldOffset(14)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public short dmPrintQuality;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;[FieldOffset(0)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmPosition_x;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;[FieldOffset(4)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmPosition_y;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;[FieldOffset(8)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmDisplayOrientation;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;[FieldOffset(12)]&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;public int dmDisplayFixedOutput;&lt;o:p&gt;&lt;/o:p&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;}&lt;/SPAN&gt; &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=56650" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/adam_nathan/archive/tags/Quizzes/default.aspx">Quizzes</category><category domain="http://blogs.msdn.com/adam_nathan/archive/tags/Managed+Code/default.aspx">Managed Code</category></item></channel></rss>