<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" version="2.0">
  <channel>
    <title>Neil Cowburn - OpenNETCF - .NET Framework</title>
    <link>http://blog.opennetcf.com/ncowburn/</link>
    <description>Principal Partner of OpenNETCF Consulting &amp; Co-Founder of OpenNETCF.org</description>
    <language>en-us</language>
    <copyright>Neil Cowburn</copyright>
    <lastBuildDate>Tue, 24 Jun 2008 15:06:00 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>neilc@opennetcf.com</managingEditor>
    <webMaster>neilc@opennetcf.com</webMaster>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=9a2d5a26-1485-49db-8f67-7931b2088658</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,9a2d5a26-1485-49db-8f67-7931b2088658.aspx</pingback:target>
      <dc:creator>Neil Cowburn</dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,9a2d5a26-1485-49db-8f67-7931b2088658.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=9a2d5a26-1485-49db-8f67-7931b2088658</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I got an email last week asking about how to disable a particular network connection
under Vista. The specific scenario, how to disable an active 3G connection, is not
something I'm going to cover, but what I present below could be used as basis for
that scenario.
</p>
        <p>
With Vista, Microsoft introduced two new methods to the <a href="msdn.microsoft.com/en-us/library/aa394216(VS.85).aspx">Win32_NetworkAdapter</a> class
under <a href="msdn.microsoft.com/en-us/library/aa394582.aspx">WMI</a>: <b>Enable</b> and <b>Disable</b>.
Before can call either of those methods, we need to know how to enumerate the network
connections.
</p>
        <p>
The .NET Framework SDK provides a helpful utility called <b>mgmtclassgen.exe</b>,
which can be used to create .NET-friendly wrappers of the WMI classes. Open up a Visual
Studio command prompt and enter the following:
</p>
        <pre>mgmtclassgen Win32_NetworkAdapter -p NetworkAdapter.cs</pre>
        <p>
This will generate a file called NetworkAdapter.cs which will contain a C# representation
of the WMI Win32_NetworkAdapter class. You can add this source code file to your C#
project and then access all the properties without too much extra effort.
</p>
        <p>
To filter and disable the specific adapters, you do something like this:
</p>
        <pre name="code" class="csharp">SelectQuery query = new SelectQuery("Win32_NetworkAdapter", "NetConnectionStatus=2");
ManagementObjectSearcher search = new ManagementObjectSearcher(query);
foreach(ManagementObject result in search.Get())
{
    NetworkAdapter adapter = new NetworkAdapter(result);

    // Identify the adapter you wish to disable here. 
    // In particular, check the AdapterType and 
    // Description properties.

    // Here, we're selecting the LAN adapters.
    if (adapter.AdapterType.Equals("Ethernet 802.3")) 
    {
        adapter.Disable();
    }
}</pre>
        <p>
Don't forget to add a reference to <b>System.Management.dll</b>!
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=9a2d5a26-1485-49db-8f67-7931b2088658" />
      </body>
      <title>HOW-TO: Disable/Enable Network Connections Programmatically under Vista</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,9a2d5a26-1485-49db-8f67-7931b2088658.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2008/06/24/HOWTODisableEnableNetworkConnectionsProgrammaticallyUnderVista.aspx</link>
      <pubDate>Tue, 24 Jun 2008 15:06:00 GMT</pubDate>
      <description>&lt;p&gt;
I got an email last week asking about how to disable a particular network connection
under Vista. The specific scenario, how to disable an active 3G connection, is not
something I'm going to cover, but what I present below could be used as basis for
that scenario.
&lt;/p&gt;
&lt;p&gt;
With Vista, Microsoft introduced two new methods to the &lt;a href="msdn.microsoft.com/en-us/library/aa394216(VS.85).aspx"&gt;Win32_NetworkAdapter&lt;/a&gt; class
under &lt;a href="msdn.microsoft.com/en-us/library/aa394582.aspx"&gt;WMI&lt;/a&gt;: &lt;b&gt;Enable&lt;/b&gt; and &lt;b&gt;Disable&lt;/b&gt;.
Before can call either of those methods, we need to know how to enumerate the network
connections.
&lt;/p&gt;
&lt;p&gt;
The .NET Framework SDK provides a helpful utility called &lt;b&gt;mgmtclassgen.exe&lt;/b&gt;,
which can be used to create .NET-friendly wrappers of the WMI classes. Open up a Visual
Studio command prompt and enter the following:
&lt;/p&gt;
&lt;pre&gt;mgmtclassgen Win32_NetworkAdapter -p NetworkAdapter.cs&lt;/pre&gt;
&lt;p&gt;
This will generate a file called NetworkAdapter.cs which will contain a C# representation
of the WMI Win32_NetworkAdapter class. You can add this source code file to your C#
project and then access all the properties without too much extra effort.
&lt;/p&gt;
&lt;p&gt;
To filter and disable the specific adapters, you do something like this:
&lt;/p&gt;
&lt;pre name="code" class="csharp"&gt;SelectQuery query = new SelectQuery("Win32_NetworkAdapter", "NetConnectionStatus=2");
ManagementObjectSearcher search = new ManagementObjectSearcher(query);
foreach(ManagementObject result in search.Get())
{
    NetworkAdapter adapter = new NetworkAdapter(result);

    // Identify the adapter you wish to disable here. 
    // In particular, check the AdapterType and 
    // Description properties.

    // Here, we're selecting the LAN adapters.
    if (adapter.AdapterType.Equals("Ethernet 802.3")) 
    {
        adapter.Disable();
    }
}&lt;/pre&gt;
&lt;p&gt;
Don't forget to add a reference to &lt;b&gt;System.Management.dll&lt;/b&gt;!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=9a2d5a26-1485-49db-8f67-7931b2088658" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,9a2d5a26-1485-49db-8f67-7931b2088658.aspx</comments>
      <category>.NET Framework</category>
      <category>HOWTO</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=cbe6aa48-03ba-4d18-a1c1-f044ae323223</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,cbe6aa48-03ba-4d18-a1c1-f044ae323223.aspx</pingback:target>
      <dc:creator>Neil Cowburn</dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,cbe6aa48-03ba-4d18-a1c1-f044ae323223.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=cbe6aa48-03ba-4d18-a1c1-f044ae323223</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Are you swamped by the output from your MSBuild runs? Would you like to see exactly
the same minimal output on the command line as you get when compiling inside Visual
Studio? You can and it's easy! The trick here is to set the correct verbosity level
for the output from MSBuild. It's as simple as passing <b>/verbosity:minimal</b> (or <b>/v:m</b> for
the true minimalist). 
</p>
        <p>
You can also set this up as default behavior by adding it to <b>MSBuild.rsp</b> (you
can find this at <i>%WINDIR%\Microsoft.Net\Framework\v2.0.50727\MSBuild.rsp</i>).
Command-line options added to MSBuild.rsp will be processed before any options you
manually specify, so you can override your own defaults if need be. 
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=cbe6aa48-03ba-4d18-a1c1-f044ae323223" />
      </body>
      <title>HOWTO: Force MSBuild into "Visual Studio" output mode</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,cbe6aa48-03ba-4d18-a1c1-f044ae323223.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2007/10/25/HOWTOForceMSBuildIntoVisualStudioOutputMode.aspx</link>
      <pubDate>Thu, 25 Oct 2007 16:04:55 GMT</pubDate>
      <description>&lt;p&gt;
Are you swamped by the output from your MSBuild runs? Would you like to see exactly
the same minimal output on the command line as you get when compiling inside Visual
Studio? You can and it's easy! The trick here is to set the correct verbosity level
for the output from MSBuild. It's as simple as passing &lt;b&gt;/verbosity:minimal&lt;/b&gt; (or &lt;b&gt;/v:m&lt;/b&gt; for
the true minimalist). 
&lt;/p&gt;
&lt;p&gt;
You can also set this up as default behavior by adding it to &lt;b&gt;MSBuild.rsp&lt;/b&gt; (you
can find this at &lt;i&gt;%WINDIR%\Microsoft.Net\Framework\v2.0.50727\MSBuild.rsp&lt;/i&gt;).
Command-line options added to MSBuild.rsp will be processed before any options you
manually specify, so you can override your own defaults if need be. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=cbe6aa48-03ba-4d18-a1c1-f044ae323223" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,cbe6aa48-03ba-4d18-a1c1-f044ae323223.aspx</comments>
      <category>.NET Framework</category>
      <category>HOWTO</category>
      <category>VS 2005</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=dea2f2f1-0503-40be-90b9-5d7b6c36efc4</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,dea2f2f1-0503-40be-90b9-5d7b6c36efc4.aspx</pingback:target>
      <dc:creator>Neil Cowburn</dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,dea2f2f1-0503-40be-90b9-5d7b6c36efc4.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=dea2f2f1-0503-40be-90b9-5d7b6c36efc4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The <a href="http://msdn.microsoft.com/msdnmag/issues/07/10/default.aspx">October
issue</a> of <a href="http://msdn.microsoft.com/msdnmag/default.aspx">MSDN Magazine</a> has
an interesting article on a new product from the CLR team at Microsoft: the <a href="http://msdn.microsoft.com/msdnmag/issues/07/10/Futures/default.aspx">Parallel
FX Library</a>. 
</p>
        <p>
When reading the sample syntax of <em>Parallel.For</em> method, I couldn't help
but feel that I'd read this somewhere before. It turns out my suspicions were
correct: Annex G of <a href="http://download.microsoft.com/download/D/C/1/DC1B219F-3B11-4A05-9DA3-2D0F98B20917/Partition%20VI%20-%20Annexes.doc">Partition
VI</a> of <a href="http://msdn2.microsoft.com/en-gb/netframework/Aa569283.aspx">Common
Language Infrastructure spec (ECMA-335)</a> has all the details. There's even a reference
implementation <a href="http://sourceforge.net/projects/cli-parallel/">here</a>.
</p>
        <div class="bjtags">Tags: <a rel="tag" href="http://technorati.com/tag/Parallel+FX">Parallel+FX</a>, <a rel="tag" href="http://technorati.com/tag/ECMA-335">ECMA-335</a></div>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=dea2f2f1-0503-40be-90b9-5d7b6c36efc4" />
      </body>
      <title>Parallel FX Library</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,dea2f2f1-0503-40be-90b9-5d7b6c36efc4.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2007/09/18/ParallelFXLibrary.aspx</link>
      <pubDate>Tue, 18 Sep 2007 14:23:52 GMT</pubDate>
      <description>&lt;p&gt;
The &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/10/default.aspx"&gt;October
issue&lt;/a&gt; of &lt;a href="http://msdn.microsoft.com/msdnmag/default.aspx"&gt;MSDN Magazine&lt;/a&gt; has
an interesting article on a new product from the CLR team at Microsoft: the &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/10/Futures/default.aspx"&gt;Parallel
FX Library&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
When reading the sample syntax&amp;nbsp;of &lt;em&gt;Parallel.For&lt;/em&gt; method, I couldn't help
but feel that&amp;nbsp;I'd read this somewhere before. It turns out my suspicions were
correct: Annex G of &lt;a href="http://download.microsoft.com/download/D/C/1/DC1B219F-3B11-4A05-9DA3-2D0F98B20917/Partition%20VI%20-%20Annexes.doc"&gt;Partition
VI&lt;/a&gt; of &lt;a href="http://msdn2.microsoft.com/en-gb/netframework/Aa569283.aspx"&gt;Common
Language Infrastructure spec (ECMA-335)&lt;/a&gt; has all the details. There's even a reference
implementation &lt;a href="http://sourceforge.net/projects/cli-parallel/"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;div class="bjtags"&gt;Tags: &lt;a rel="tag" href="http://technorati.com/tag/Parallel+FX"&gt;Parallel+FX&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/ECMA-335"&gt;ECMA-335&lt;/a&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=dea2f2f1-0503-40be-90b9-5d7b6c36efc4" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,dea2f2f1-0503-40be-90b9-5d7b6c36efc4.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=43d31eb0-d12f-456b-b4e7-114493d9b6a6</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,43d31eb0-d12f-456b-b4e7-114493d9b6a6.aspx</pingback:target>
      <dc:creator>Neil Cowburn</dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,43d31eb0-d12f-456b-b4e7-114493d9b6a6.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=43d31eb0-d12f-456b-b4e7-114493d9b6a6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This is one of those FAQ items that keeps cropping up in the <a href="http://www.opennetcf.org/forums/" target="_blank">forums</a>.
Below is a method that will not only return true if ActiveSync or Windows Mobile Device
Center is installed, but it will also return the version of ActiveSync or Windows
Mobile Device Center. 
</p>
        <p class="codeBlock">
/// &lt;summary&gt;<br />
/// Checks to see if ActiveSync/Windows Mobile Device Center is installed on the PC.<br />
/// &lt;/summary&gt;<br />
/// &lt;param name="syncVersion"&gt;The version of the synchronization tool installed.&lt;/param&gt;<br />
/// &lt;returns&gt;True: Either ActiveSync or Windows Mobile Device Center is installed.
False: &lt;/returns&gt;<br />
public static bool IsActiveSyncInstalled(out Version syncVersion)<br />
{<br />
    using(RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows
CE Services"))<br />
    {<br />
        if (reg == null)<br />
        {<br />
            syncVersion = null;<br />
            return false;<br />
        }<br /><br />
        int majorVersion = (int)reg.GetValue("MajorVersion",
0);<br />
        int minorVersion = (int)reg.GetValue("MinorVersion",
0);<br />
        int buildNumber = (int)reg.GetValue("BuildNumber",
0);<br /><br />
        syncVersion = new Version(majorVersion,
minorVersion, buildNumber);<br />
    }<br />
    return true;<br />
}
</p>
        <p>
 
</p>
        <div class="bjtags">Tags: <a rel="tag" href="http://technorati.com/tag/ActiveSync">ActiveSync</a>, <a rel="tag" href="http://technorati.com/tag/RAPI">RAPI</a>, <a rel="tag" href="http://technorati.com/tag/WMDC">WMDC</a></div>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=43d31eb0-d12f-456b-b4e7-114493d9b6a6" />
      </body>
      <title>HOWTO: Check if ActiveSync is installed</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,43d31eb0-d12f-456b-b4e7-114493d9b6a6.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2007/07/10/HOWTOCheckIfActiveSyncIsInstalled.aspx</link>
      <pubDate>Tue, 10 Jul 2007 10:54:51 GMT</pubDate>
      <description>&lt;p&gt;
This is one of those FAQ items that keeps cropping up in the &lt;a href="http://www.opennetcf.org/forums/" target="_blank"&gt;forums&lt;/a&gt;.
Below is a method that will not only return true if ActiveSync or Windows Mobile Device
Center is installed, but it will also return the version of ActiveSync or Windows
Mobile Device Center. 
&lt;/p&gt;
&lt;p class="codeBlock"&gt;
/// &amp;lt;summary&amp;gt;&lt;br /&gt;
/// Checks to see if ActiveSync/Windows Mobile Device Center is installed on the PC.&lt;br /&gt;
/// &amp;lt;/summary&amp;gt;&lt;br /&gt;
/// &amp;lt;param name="syncVersion"&amp;gt;The version of the synchronization tool installed.&amp;lt;/param&amp;gt;&lt;br /&gt;
/// &amp;lt;returns&amp;gt;True: Either ActiveSync or Windows Mobile Device Center is installed.
False: &amp;lt;/returns&amp;gt;&lt;br /&gt;
public static bool IsActiveSyncInstalled(out Version syncVersion)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; using(RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows
CE Services"))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (reg == null)&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; syncVersion = null;&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; return false;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int majorVersion = (int)reg.GetValue("MajorVersion",
0);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int minorVersion = (int)reg.GetValue("MinorVersion",
0);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int buildNumber = (int)reg.GetValue("BuildNumber",
0);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; syncVersion = new Version(majorVersion,
minorVersion, buildNumber);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;br /&gt;
}
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;div class="bjtags"&gt;Tags: &lt;a rel="tag" href="http://technorati.com/tag/ActiveSync"&gt;ActiveSync&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/RAPI"&gt;RAPI&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/WMDC"&gt;WMDC&lt;/a&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=43d31eb0-d12f-456b-b4e7-114493d9b6a6" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,43d31eb0-d12f-456b-b4e7-114493d9b6a6.aspx</comments>
      <category>.NET Framework</category>
      <category>HOWTO</category>
      <category>Mobility/Embedded</category>
      <category>OpenNETCF</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=01678b0b-af11-40df-9b18-2a563b9b63fa</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,01678b0b-af11-40df-9b18-2a563b9b63fa.aspx</pingback:target>
      <dc:creator>Neil Cowburn</dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,01678b0b-af11-40df-9b18-2a563b9b63fa.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=01678b0b-af11-40df-9b18-2a563b9b63fa</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
It's always useful to learn something new everyday. It keeps you fresh and on your
toes. Even after 6 or so years of using .NET, I'm still learning new, useful nuggets.
This one is a gem, though. 
</p>
        <p>
If you look at the constructor signatures for the <strong>System.Threading.Thread</strong> class,
you'll find something like this:
</p>
        <p>
          <img alt="" src="http://blog.opennetcf.org/ncowburn/content/binary/content/binary/ThreadCF.png" border="0" />
        </p>
        <p>
The <strong>Thread</strong> class constructor takes an instance of a <strong>ThreadStart</strong> delegate,
so naturally, you code this:
</p>
        <pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6">new Thread(new ThreadStart(MyThreadDelegate));</pre>
        <p>
where <strong>MyThreadDelegate</strong> is a method with the same signature as the <strong>ThreadStart</strong> delegate.
Easy, right? Of course, but there is another way... 
</p>
        <pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6">new Thread(MyThreadDelegate);</pre>
        <p>
This example is functionally the same as the previous example! This is called <strong>implicit
method group conversion</strong>. Excellent, I can save a time and space by letting
the compile infer the delegate type from the method signature. Nice! It turns out
this is not just restricted to threading either. Anywhere in your code where you reference
a delegate method, you can do this. For example, take a look at assigning an event
handler:
</p>
        <p>
The traditional way:
</p>
        <pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6">using System;

class Program
{
    public static event EventHandler MyEvent;

    static void Main(string[] args)
    {
        <strong style="COLOR: #f00">MyEvent
+= new EventHandler(MyEventHandler);</strong> } static void MyEventHandler(object
sender, EventArgs e) { } }</pre>
        <p>
Using implicit method group conversion:
</p>
        <pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6">using System;

class Program
{
    public static event EventHandler MyEvent;

    static void Main(string[] args)
    {
        <strong style="COLOR: #f00">MyEvent
+= MyEventHandler;</strong> } static void MyEventHandler(object sender, EventArgs
e) { } }</pre>
        <p>
Now that rocks! This is documented in Section 21.9 of <a href="http://www.amazon.com/C-Programming-Language-Anders-Hejlsberg/dp/0321154916">The
C# Programming Language</a> (pp. 534-535). 
</p>
        <p>
 
</p>
        <div class="bjtags">Tags: <a rel="tag" href="http://technorati.com/tag/.NET+Compact+Framework">.NET+Compact+Framework</a>, <a rel="tag" href="http://technorati.com/tag/.NET+Framework">.NET+Framework</a>, <a rel="tag" href="http://technorati.com/tag/C#">C#</a></div>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=01678b0b-af11-40df-9b18-2a563b9b63fa" />
      </body>
      <title>Implicit Method Group Conversion in C#</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,01678b0b-af11-40df-9b18-2a563b9b63fa.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2007/03/23/ImplicitMethodGroupConversionInC.aspx</link>
      <pubDate>Fri, 23 Mar 2007 11:16:38 GMT</pubDate>
      <description>&lt;p&gt;
It's always useful to learn something new everyday. It keeps you fresh and on your
toes. Even after 6 or so years of using .NET, I'm still learning new, useful nuggets.
This one is a gem, though. 
&lt;/p&gt;
&lt;p&gt;
If you look at the constructor signatures for the &lt;strong&gt;System.Threading.Thread&lt;/strong&gt; class,
you'll find something like this:
&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" src="http://blog.opennetcf.org/ncowburn/content/binary/content/binary/ThreadCF.png" border="0" /&gt;
&lt;/p&gt;
&lt;p&gt;
The&amp;nbsp;&lt;strong&gt;Thread&lt;/strong&gt; class constructor&amp;nbsp;takes an instance of a &lt;strong&gt;ThreadStart&lt;/strong&gt; delegate,
so naturally, you code this:
&lt;/p&gt;
&lt;pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6"&gt;new Thread(new ThreadStart(MyThreadDelegate));&lt;/pre&gt;
&lt;p&gt;
where &lt;strong&gt;MyThreadDelegate&lt;/strong&gt; is a method with the same signature as the &lt;strong&gt;ThreadStart&lt;/strong&gt; delegate.
Easy, right? Of course, but there is another way... 
&lt;/p&gt;
&lt;pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6"&gt;new Thread(MyThreadDelegate);&lt;/pre&gt;
&lt;p&gt;
This example is functionally the same as the previous example! This is called &lt;strong&gt;implicit
method group conversion&lt;/strong&gt;. Excellent, I can save a time and space by letting
the compile infer the delegate type from the method signature. Nice! It turns out
this is not just restricted to threading either. Anywhere in your code where you reference
a delegate method, you can do this. For example, take a look at assigning an event
handler:
&lt;/p&gt;
&lt;p&gt;
The traditional way:
&lt;/p&gt;
&lt;pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6"&gt;using System;

class Program
{
    public static event EventHandler MyEvent;

    static void Main(string[] args)
    {
        &lt;strong style="COLOR: #f00"&gt;MyEvent
+= new EventHandler(MyEventHandler);&lt;/strong&gt; } static void MyEventHandler(object
sender, EventArgs e) { } }&lt;/pre&gt;
&lt;p&gt;
Using implicit method group conversion:
&lt;/p&gt;
&lt;pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6"&gt;using System;

class Program
{
    public static event EventHandler MyEvent;

    static void Main(string[] args)
    {
        &lt;strong style="COLOR: #f00"&gt;MyEvent
+= MyEventHandler;&lt;/strong&gt; } static void MyEventHandler(object sender, EventArgs
e) { } }&lt;/pre&gt;
&lt;p&gt;
Now that rocks!&amp;nbsp;This is documented&amp;nbsp;in Section 21.9 of &lt;a href="http://www.amazon.com/C-Programming-Language-Anders-Hejlsberg/dp/0321154916"&gt;The
C# Programming Language&lt;/a&gt; (pp. 534-535). 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;div class="bjtags"&gt;Tags: &lt;a rel="tag" href="http://technorati.com/tag/.NET+Compact+Framework"&gt;.NET+Compact+Framework&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/.NET+Framework"&gt;.NET+Framework&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/C#"&gt;C#&lt;/a&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=01678b0b-af11-40df-9b18-2a563b9b63fa" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,01678b0b-af11-40df-9b18-2a563b9b63fa.aspx</comments>
      <category>.NET Compact Framework</category>
      <category>.NET Framework</category>
      <category>OpenNETCF</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=0e35d875-6ca0-4015-8b1b-9bdef7696797</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,0e35d875-6ca0-4015-8b1b-9bdef7696797.aspx</pingback:target>
      <dc:creator>Neil Cowburn</dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,0e35d875-6ca0-4015-8b1b-9bdef7696797.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=0e35d875-6ca0-4015-8b1b-9bdef7696797</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I frequently find myself using a command prompt for pretty much everything from launching
a new instance of a browser to search google and msdn (I have a batch of Python scripts
that I use as aliases). One of the banes has been how to launch Visual Studio
from the normal, medium trust command prompt. I tried using runas but I got the output
below:
</p>
        <pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6">$&gt; runas /user:neilco devenv
Enter the password for neilco:
Attempting to start devenv as user "CWMYGLO\neilco" ...
RUNAS ERROR: Unable to run - devenv
740: The requested operation requires elevation. </pre>
        <p>
What I need is a way of forcing the command prompt to launch Visual Studio as an elevated
process. UAC allows you to do this by passing the <strong>runas</strong> verb
to <strong>ShellExecute</strong> like this:
</p>
        <pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6">ShellExecute(NULL, L"runas", L"C:\\Windows\\Notepad.exe", NULL, NULL, SW_SHOWNORMAL);</pre>
        <p>
The C# equivalent of this is:
</p>
        <pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6">Process p = new Process();
p.UseShellExecute = true;
p.StartInfo.FileName = @"C:\Windows\Notepad.exe";
p.StartInfo.Verb = "runas";
p.Start();</pre>
        <p>
Using this, I wrote a simple console application that will launch devenv.exe from
the command-line and proxy any arguments through to Visual Studio. Note that the code
first checks that it is running under Vista before using the runas verb:
</p>
        <pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6">namespace OpenNETCF.Console.Utilities
{
    using System;
    using System.IO;
    using System.Diagnostics;
    using Microsoft.Win32;

    static class StartVS
    {
        static void Main(string[] args)
        {
            string devenvPath = Path.Combine(GetVsInstallationDir(Registry.LocalMachine), "devenv.exe");

            Process p = new Process();
            p.StartInfo.FileName = devenvPath;
            p.StartInfo.Arguments = GetArgsString(args);
            p.StartInfo.UseShellExecute = true;
            if (IsVista())
            {
                p.StartInfo.Verb = "runas";
            }

            try
            {
                p.Start();
                return;
            }
            catch (Win32Exception)
            {
                return;
            }
            finally
            {
                p.Dispose();
            }
        }

        static string GetVsInstallationDir(RegistryKey key)
        {
            return (string)key.OpenSubKey(@"Software\Microsoft\VisualStudio\8.0").GetValue("InstallDir");
        }

        static bool IsVista()
        {
            if (Environment.OSVersion.Version.Major &gt;= 6)
            {
                return (Environment.OSVersion.Version.Minor &gt;= 0);
            }
            return false;
        }

        static string GetArgsString(string[] args)
        {
            System.Text.StringBuilder argString = new System.Text.StringBuilder();
            foreach (string arg in args)
                argString.AppendFormat("\"{0}\" ", arg);

            return argString.ToString().Trim();
        }
    }
}</pre>
        <p>
Compile this to <strong>startvs.exe</strong> and then call it from a command prompt. You
will be prompted for authorization to launch Visual Studio just
as you would if you launched it from the start menu. 
</p>
        <p>
          <strong>Update:</strong> Fixed bug in <em>GetArgsString</em> to handle spaces in paths.
</p>
        <div class="bjtags">Tags: <a href="http://technorati.com/tag/Vista" rel="tag">Vista</a>, <a href="http://technorati.com/tag/Visual+Studio" rel="tag">Visual+Studio</a>, <a href="http://technorati.com/tag/UAC" rel="tag">UAC</a></div>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=0e35d875-6ca0-4015-8b1b-9bdef7696797" />
      </body>
      <title>Launching devenv from the command-line under Vista</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,0e35d875-6ca0-4015-8b1b-9bdef7696797.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2007/03/13/LaunchingDevenvFromTheCommandlineUnderVista.aspx</link>
      <pubDate>Tue, 13 Mar 2007 16:38:40 GMT</pubDate>
      <description>&lt;p&gt;
I frequently find myself using a command prompt for pretty much everything from launching
a new instance of a browser to search google and msdn (I have a batch of Python scripts
that I use as aliases). One of the banes&amp;nbsp;has been how to launch Visual Studio
from the&amp;nbsp;normal, medium trust command prompt. I tried using runas but I got the&amp;nbsp;output
below:
&lt;/p&gt;
&lt;pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6"&gt;$&amp;gt; runas /user:neilco devenv
Enter the password for neilco:
Attempting to start devenv as user "CWMYGLO\neilco" ...
RUNAS ERROR: Unable to run - devenv
740: The requested operation requires elevation.&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;
What I need is a way of forcing the command prompt to launch Visual Studio as an elevated
process.&amp;nbsp;UAC allows you to&amp;nbsp;do this by passing the &lt;strong&gt;runas&lt;/strong&gt; verb
to &lt;strong&gt;ShellExecute&lt;/strong&gt; like this:
&lt;/p&gt;
&lt;pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6"&gt;ShellExecute(NULL, L"runas", L"C:\\Windows\\Notepad.exe", NULL, NULL, SW_SHOWNORMAL);&lt;/pre&gt;
&lt;p&gt;
The C# equivalent of this is:
&lt;/p&gt;
&lt;pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6"&gt;Process p = new Process();
p.UseShellExecute = true;
p.StartInfo.FileName = @"C:\Windows\Notepad.exe";
p.StartInfo.Verb = "runas";
p.Start();&lt;/pre&gt;
&lt;p&gt;
Using this, I wrote a simple console application that will launch devenv.exe from
the command-line and proxy any arguments through to Visual Studio. Note that the code
first checks that it is running under Vista before using the runas verb:
&lt;/p&gt;
&lt;pre style="BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c2c2c2 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c2c2c2 1px solid; BACKGROUND-COLOR: #e6e6e6"&gt;namespace OpenNETCF.Console.Utilities
{
    using System;
    using System.IO;
    using System.Diagnostics;
    using Microsoft.Win32;

    static class StartVS
    {
        static void Main(string[] args)
        {
            string devenvPath = Path.Combine(GetVsInstallationDir(Registry.LocalMachine), "devenv.exe");

            Process p = new Process();
            p.StartInfo.FileName = devenvPath;
            p.StartInfo.Arguments = GetArgsString(args);
            p.StartInfo.UseShellExecute = true;
            if (IsVista())
            {
                p.StartInfo.Verb = "runas";
            }

            try
            {
                p.Start();
                return;
            }
            catch (Win32Exception)
            {
                return;
            }
            finally
            {
                p.Dispose();
            }
        }

        static string GetVsInstallationDir(RegistryKey key)
        {
            return (string)key.OpenSubKey(@"Software\Microsoft\VisualStudio\8.0").GetValue("InstallDir");
        }

        static bool IsVista()
        {
            if (Environment.OSVersion.Version.Major &amp;gt;= 6)
            {
                return (Environment.OSVersion.Version.Minor &amp;gt;= 0);
            }
            return false;
        }

        static string GetArgsString(string[] args)
        {
            System.Text.StringBuilder argString = new System.Text.StringBuilder();
            foreach (string arg in args)
                argString.AppendFormat("\"{0}\" ", arg);

            return argString.ToString().Trim();
        }
    }
}&lt;/pre&gt;
&lt;p&gt;
Compile this to &lt;strong&gt;startvs.exe&lt;/strong&gt; and then call it from a command prompt.&amp;nbsp;You
will&amp;nbsp;be prompted&amp;nbsp;for&amp;nbsp;authorization to launch&amp;nbsp;Visual Studio just
as you would if you launched it from the start menu. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; Fixed bug in &lt;em&gt;GetArgsString&lt;/em&gt; to handle spaces in paths.
&lt;/p&gt;
&lt;div class=bjtags&gt;Tags: &lt;a href="http://technorati.com/tag/Vista" rel=tag&gt;Vista&lt;/a&gt;, &lt;a href="http://technorati.com/tag/Visual+Studio" rel=tag&gt;Visual+Studio&lt;/a&gt;, &lt;a href="http://technorati.com/tag/UAC" rel=tag&gt;UAC&lt;/a&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=0e35d875-6ca0-4015-8b1b-9bdef7696797" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,0e35d875-6ca0-4015-8b1b-9bdef7696797.aspx</comments>
      <category>.NET Framework</category>
      <category>Native Code</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=100532fc-6b7a-457a-b209-8442730bfa73</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,100532fc-6b7a-457a-b209-8442730bfa73.aspx</pingback:target>
      <dc:creator>Neil Cowburn</dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,100532fc-6b7a-457a-b209-8442730bfa73.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=100532fc-6b7a-457a-b209-8442730bfa73</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
One of the tool combinations that we find invaluable at OpenNETCF is <a href="http://blogs.msdn.com/sandcastle/">Sandcastle</a> and
the <a href="http://www.codeplex.com/shfb/">Sandcastle Help File Builder</a>. We’ve
been using these tools to build our documentation for our products and I’ve come across
a few limitations and workarounds for the December CTP that I’ve not seen discussed
elsewhere so I’d like to share them here. 
</p>
        <p>
The biggest issue that I’ve found is the lack of support for setting the DocSet attributes
in the help topic metadata. The particular attribute allows you to associate a set
of help topics by assigning a name to the set. This is useful as you can use it to
filter the topics displayed in the Content, Index and Search sections of the Document
Explorer. 
</p>
        <p>
 The DocSet attribute looks something like this when added to a help topic:
</p>
        <p style="padding: 10px; background-color: rgb(230, 230, 230);">
&lt;MSHelp:Attr Name="DocSet" Value="NETCompactFramework" /&gt;
</p>
        <p>
This XML fragment will assoicate a help topic with a Document Set (DocSet) called
"NETCompactFramework". So if you filtered by documentation by the .NET Compact Framework
option in the Visual Studio Help (note: this option is available only if you have
the MSDN Library installed), then all the help topics with this DocSet attribute will
be listed. As an example, below is a screenshot of the Visual Studio Help filtered
to only show the Smart Device Framework documentation. 
</p>
        <p align="center">
          <img alt="SDF Help Content Filtering" src="http://blog.opennetcf.org/ncowburn/content/binary/SDFHelpContentFiltering.png" border="0" />
        </p>
        <p>
Sandcastle uses a series of XML transformations to turn your XML documentation generated
by Visual Studio into something that can be integrated with the Visual Studio
Help system. The XSL file responsible for setting the various metadata attributes
is called <strong>utilities_metadata.xsl</strong> and can be found in %ProgramFiles%\Sandcastle\Presentation\vs2005\Transforms. 
</p>
        <p>
To get Sandcastle to correctly add the DocSet attributes to each help topic, I had
to add the following lines just below the <strong>&lt;xml&gt;</strong> node in the <strong>insertMetadata</strong> template:
</p>
        <p style="padding: 10px; background-color: rgb(230, 230, 230);">
&lt;MSHelp:Attr Name="DocSet" Value="OpenNETCF.SDF2" /&gt;<br />
&lt;MSHelp:Attr Name="DocSet" Value="NETFramework" /&gt;<br />
&lt;MSHelp:Attr Name="DocSet" Value="NETCompactFramework" /&gt;
</p>
        <p>
If you are thinking that I'm hardcoding these attributes and that they will appear
in each help topic I ever generate with Sandcastle, you are correct. I will need to
modify the OpenNETCF.SDF2 DocSet attribute for each product that I generate help documentation
for. 
</p>
        <p>
In the <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e82ea71d-da89-42ee-a715-696e3a4873b2&amp;displaylang=en">Sandcastle
March CTP</a>, things don't get a lot better as there is still no support for custom
DocSet attributes.
</p>
        <p>
 
</p>
        <div class="bjtags">Tags: <a rel="tag" href="http://technorati.com/tag/Sandcastle">Sandcastle</a>, <a rel="tag" href="http://technorati.com/tag/Sandcastle+Help+File+Builder">Sandcastle+Help+File+Builder</a>, <a rel="tag" href="http://technorati.com/tag/Smart+Device+Framework">Smart+Device+Framework</a></div>
        <br />
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=100532fc-6b7a-457a-b209-8442730bfa73" />
      </body>
      <title>Sandcastle: DocSet Filtering</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,100532fc-6b7a-457a-b209-8442730bfa73.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2007/03/07/SandcastleDocSetFiltering.aspx</link>
      <pubDate>Wed, 07 Mar 2007 23:04:13 GMT</pubDate>
      <description>&lt;p&gt;
One of the tool combinations that we find invaluable at OpenNETCF is &lt;a href="http://blogs.msdn.com/sandcastle/"&gt;Sandcastle&lt;/a&gt; and
the &lt;a href="http://www.codeplex.com/shfb/"&gt;Sandcastle Help File Builder&lt;/a&gt;. We’ve
been using these tools to build our documentation for our products and I’ve come across
a few limitations and workarounds for the December CTP that I’ve not seen discussed
elsewhere so I’d like to share them here. 
&lt;/p&gt;
&lt;p&gt;
The biggest issue that I’ve found is the lack of support for setting the DocSet attributes
in the help topic metadata. The particular attribute allows you to associate a set
of help topics by assigning a name to the set. This is useful as you can use it to
filter the topics displayed in the Content, Index and Search sections of the Document
Explorer. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;The DocSet attribute looks something like this when added to a help topic:
&lt;/p&gt;
&lt;p style="padding: 10px; background-color: rgb(230, 230, 230);"&gt;
&amp;lt;MSHelp:Attr Name="DocSet" Value="NETCompactFramework" /&amp;gt;
&lt;/p&gt;
&lt;p&gt;
This XML fragment will assoicate a help topic with a Document Set (DocSet) called
"NETCompactFramework". So if you filtered by documentation by the .NET Compact Framework
option in the Visual Studio Help (note: this option is available only if you have
the MSDN Library installed), then all the help topics with this DocSet attribute will
be listed. As an example, below is a screenshot of the Visual Studio Help filtered
to only show the Smart Device Framework documentation. 
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img alt="SDF Help Content Filtering" src="http://blog.opennetcf.org/ncowburn/content/binary/SDFHelpContentFiltering.png" border="0"&gt;
&lt;/p&gt;
&lt;p&gt;
Sandcastle uses a series of XML transformations to&amp;nbsp;turn your&amp;nbsp;XML documentation&amp;nbsp;generated
by Visual Studio&amp;nbsp;into something that can be integrated with the Visual Studio
Help system. The XSL file responsible for setting the various metadata attributes
is called &lt;strong&gt;utilities_metadata.xsl&lt;/strong&gt; and can be found in %ProgramFiles%\Sandcastle\Presentation\vs2005\Transforms. 
&lt;/p&gt;
&lt;p&gt;
To get Sandcastle to correctly add the DocSet attributes to each help topic, I had
to add the following lines just below the &lt;strong&gt;&amp;lt;xml&amp;gt;&lt;/strong&gt; node in the &lt;strong&gt;insertMetadata&lt;/strong&gt; template:
&lt;/p&gt;
&lt;p style="padding: 10px; background-color: rgb(230, 230, 230);"&gt;
&amp;lt;MSHelp:Attr Name="DocSet" Value="OpenNETCF.SDF2" /&amp;gt;&lt;br&gt;
&amp;lt;MSHelp:Attr Name="DocSet" Value="NETFramework" /&amp;gt;&lt;br&gt;
&amp;lt;MSHelp:Attr Name="DocSet" Value="NETCompactFramework" /&amp;gt;
&lt;/p&gt;
&lt;p&gt;
If you are thinking that I'm hardcoding these attributes and that they will appear
in each help topic I ever generate with Sandcastle, you are correct. I will need to
modify the OpenNETCF.SDF2 DocSet attribute for each product that I generate help documentation
for. 
&lt;/p&gt;
&lt;p&gt;
In the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e82ea71d-da89-42ee-a715-696e3a4873b2&amp;amp;displaylang=en"&gt;Sandcastle
March CTP&lt;/a&gt;, things don't get a lot better as there is still no support for custom
DocSet attributes.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;div class="bjtags"&gt;Tags: &lt;a rel="tag" href="http://technorati.com/tag/Sandcastle"&gt;Sandcastle&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/Sandcastle+Help+File+Builder"&gt;Sandcastle+Help+File+Builder&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/Smart+Device+Framework"&gt;Smart+Device+Framework&lt;/a&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=100532fc-6b7a-457a-b209-8442730bfa73" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,100532fc-6b7a-457a-b209-8442730bfa73.aspx</comments>
      <category>.NET Compact Framework</category>
      <category>.NET Framework</category>
      <category>OpenNETCF</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=f7a63cad-a169-4836-8be6-fb4163723e56</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,f7a63cad-a169-4836-8be6-fb4163723e56.aspx</pingback:target>
      <dc:creator>Neil Cowburn</dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,f7a63cad-a169-4836-8be6-fb4163723e56.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=f7a63cad-a169-4836-8be6-fb4163723e56</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
If you're creating CCWs in your project, or even creating RCWs manually, then you'll
know the annoyance of having to create a new GUID, format it as a string without curly
braces and then add it to your Guid attribute. This little macro will cut out those
mouse pointer reaches to the Tools menu for "Create GUID". Simply assign a key stroke
combination to it in the Visual Studio projects and you too can have new GUID strings
in an instant.
</p>
        <pre class="code">    Sub CreateNewGuid()
        Dim newGuid As String = Guid.NewGuid().ToString()
        newGuid = newGuid.Replace("{", String.Empty)
        newGuid = newGuid.Replace("}", String.Empty).ToUpper()

        Dim sel As TextSelection = DTE.ActiveDocument.Selection
        sel.Text = """" + newGuid + """"
        DTE.ActiveDocument.Save()
    End Sub</pre>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=f7a63cad-a169-4836-8be6-fb4163723e56" />
      </body>
      <title>Useful Macro for COM Interop</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,f7a63cad-a169-4836-8be6-fb4163723e56.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2006/08/16/UsefulMacroForCOMInterop.aspx</link>
      <pubDate>Wed, 16 Aug 2006 23:47:31 GMT</pubDate>
      <description>&lt;p&gt;
If you're creating CCWs in your project, or even creating RCWs manually, then you'll
know the annoyance of having to create a new GUID, format it as a string without curly
braces and then add it to your Guid attribute. This little macro will cut out those
mouse pointer reaches to the Tools menu for "Create GUID". Simply assign a key stroke
combination to it in the Visual Studio projects and you too can have new GUID strings
in an instant.
&lt;/p&gt;
&lt;pre class="code"&gt;    Sub CreateNewGuid()
        Dim newGuid As String = Guid.NewGuid().ToString()
        newGuid = newGuid.Replace("{", String.Empty)
        newGuid = newGuid.Replace("}", String.Empty).ToUpper()

        Dim sel As TextSelection = DTE.ActiveDocument.Selection
        sel.Text = """" + newGuid + """"
        DTE.ActiveDocument.Save()
    End Sub&lt;/pre&gt;&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=f7a63cad-a169-4836-8be6-fb4163723e56" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,f7a63cad-a169-4836-8be6-fb4163723e56.aspx</comments>
      <category>.NET Framework</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=665251ee-28f3-4ee7-987c-e1deca642c7d</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,665251ee-28f3-4ee7-987c-e1deca642c7d.aspx</pingback:target>
      <dc:creator>Neil Cowburn</dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,665251ee-28f3-4ee7-987c-e1deca642c7d.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=665251ee-28f3-4ee7-987c-e1deca642c7d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
If you like games and game development, then check out what <a href="http://blogs.msdn.com/mikezintel/archive/2006/03/23/559511.aspx">Mike
is showing the world</a>. Wow!   <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=665251ee-28f3-4ee7-987c-e1deca642c7d" /></body>
      <title>C# Everywhere: XNA - a framework for game developers</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,665251ee-28f3-4ee7-987c-e1deca642c7d.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2006/03/24/CEverywhereXNAAFrameworkForGameDevelopers.aspx</link>
      <pubDate>Fri, 24 Mar 2006 09:17:06 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
If you like games and game development, then check out what &lt;a href="http://blogs.msdn.com/mikezintel/archive/2006/03/23/559511.aspx"&gt;Mike
is showing the world&lt;/a&gt;.&amp;nbsp;Wow!&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=665251ee-28f3-4ee7-987c-e1deca642c7d" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,665251ee-28f3-4ee7-987c-e1deca642c7d.aspx</comments>
      <category>.NET Compact Framework</category>
      <category>.NET Framework</category>
      <category>Mobility/Embedded</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=5a4a994b-b44d-4a2d-b202-4d07fa6ae6fb</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,5a4a994b-b44d-4a2d-b202-4d07fa6ae6fb.aspx</pingback:target>
      <dc:creator>Neil Cowburn</dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,5a4a994b-b44d-4a2d-b202-4d07fa6ae6fb.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=5a4a994b-b44d-4a2d-b202-4d07fa6ae6fb</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
At long last, <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=8C09FD61-3F26-4555-AE17-3121B4F51D4D&amp;displaylang=en">ROTOR
2.0</a> is out. Sweet! There goes my weekend... 
</p>
        <p>
[via <a href="http://blogs.msdn.com/brada/archive/2006/03/23/559603.aspx">Brad Abrams</a> and <a href="http://blogs.msdn.com/jasonz/archive/2006/03/23/559581.aspx">Jason
Zander</a>]
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=5a4a994b-b44d-4a2d-b202-4d07fa6ae6fb" />
      </body>
      <title>Shared Source CLI (ROTOR) v2.0 is out</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,5a4a994b-b44d-4a2d-b202-4d07fa6ae6fb.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2006/03/24/SharedSourceCLIROTORV20IsOut.aspx</link>
      <pubDate>Fri, 24 Mar 2006 09:10:08 GMT</pubDate>
      <description>&lt;p&gt;
At long last, &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=8C09FD61-3F26-4555-AE17-3121B4F51D4D&amp;amp;displaylang=en"&gt;ROTOR
2.0&lt;/a&gt; is out. Sweet! There goes my weekend... 
&lt;/p&gt;
&lt;p&gt;
[via &lt;a href="http://blogs.msdn.com/brada/archive/2006/03/23/559603.aspx"&gt;Brad Abrams&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/jasonz/archive/2006/03/23/559581.aspx"&gt;Jason
Zander&lt;/a&gt;]
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=5a4a994b-b44d-4a2d-b202-4d07fa6ae6fb" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,5a4a994b-b44d-4a2d-b202-4d07fa6ae6fb.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=8d380dd2-3ca1-4e9c-9973-c02ee0a1c112</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,8d380dd2-3ca1-4e9c-9973-c02ee0a1c112.aspx</pingback:target>
      <dc:creator>Neil Cowburn</dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,8d380dd2-3ca1-4e9c-9973-c02ee0a1c112.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=8d380dd2-3ca1-4e9c-9973-c02ee0a1c112</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">One of the things I love about coding is
that you're constantly learning something new. Today was no exception. 
<br /><br />
I'd been working on some code that required multiplying a couple of <i>m x n</i> matrices.
These matrices could potentially be quite large, so I looked into how I could optimize
the multiplication procedure. I knew you could pin one-dimensional arrays and retrieve
a pointer to the pinned array using unsafe code. However, I didn't think you could
do it with multi-dimensional arrays. To my surprise, it turns out you can and the
reason behind this is that multi-dimensional arrays are allocated as contiguous memory
blocks. The story is different with jagged arrays (i.e. int[][] arrays) as that are
non-contiguous in memory, that is, jagged arrays are arranged as an array of pointers
to arrays.  Below is some simple code that shows you how you can access multi-dimensional
array elements using pointers in C#.<br /><br />
// Create a rectangular array<br />
int[,] A = { { 1, 2 }, { 2, 1 }, { 1, 3 }, { 2, 2 } };<br /><br />
unsafe<br />
{<br />
    fixed(int* pA = A)<br />
    {<br />
        for(int i = 0; i &lt; A.Length; i++)<br />
        {<br />
            Console.WriteLine(pA[i]);<br />
        }<br />
    }<br />
}<br /><br /><p></p><img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=8d380dd2-3ca1-4e9c-9973-c02ee0a1c112" /></body>
      <title>Access rectangular array elements via pointers</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,8d380dd2-3ca1-4e9c-9973-c02ee0a1c112.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2006/02/16/AccessRectangularArrayElementsViaPointers.aspx</link>
      <pubDate>Thu, 16 Feb 2006 21:37:29 GMT</pubDate>
      <description>One of the things I love about coding is that you're constantly learning something new. Today was no exception. &lt;br&gt;
&lt;br&gt;
I'd been working on some code that required multiplying a couple of &lt;i&gt;m x n&lt;/i&gt; matrices.
These matrices could potentially be quite large, so I looked into how I could optimize
the multiplication procedure. I knew you could pin one-dimensional arrays and retrieve
a pointer to the pinned array using unsafe code. However, I didn't think you could
do it with multi-dimensional arrays. To my surprise, it turns out you can and the
reason behind this is that multi-dimensional arrays are allocated as contiguous memory
blocks. The story is different with jagged arrays (i.e. int[][] arrays) as that are
non-contiguous in memory, that is, jagged arrays are arranged as an array of pointers
to arrays.&amp;nbsp; Below is some simple code that shows you how you can access multi-dimensional
array elements using pointers in C#.&lt;br&gt;
&lt;br&gt;
// Create a rectangular array&lt;br&gt;
int[,] A = { { 1, 2 }, { 2, 1 }, { 1, 3 }, { 2, 2 } };&lt;br&gt;
&lt;br&gt;
unsafe&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; fixed(int* pA = A)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0; i &amp;lt; A.Length; i++)&lt;br&gt;
&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; Console.WriteLine(pA[i]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=8d380dd2-3ca1-4e9c-9973-c02ee0a1c112" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,8d380dd2-3ca1-4e9c-9973-c02ee0a1c112.aspx</comments>
      <category>.NET Compact Framework</category>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=7776ac81-24a0-447e-b1e0-4fff84d66f9e</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,7776ac81-24a0-447e-b1e0-4fff84d66f9e.aspx</pingback:target>
      <dc:creator>Neil Cowburn</dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,7776ac81-24a0-447e-b1e0-4fff84d66f9e.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=7776ac81-24a0-447e-b1e0-4fff84d66f9e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">News about the new certifications that
are to replace the MCAD and MCSD is circulating around the net. In summary, the MSCD
is being replaced with the Microsoft Certified Professional Developer, while the MCAD
is being replaced with the Microsoft Certified Technical Specialist.Further to this,
the MCTS is split into 3 technology specialisms for developers (there are 2 more specialisms
for IT Pros), including .NET Windows, .NET Web, and .NET Distributed apps. 
<br /><br />
This is all good stuff, but I'm won't be happy until mobile and embedded development
is fairly represented in the certification roadmaps. 
<br /><img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=7776ac81-24a0-447e-b1e0-4fff84d66f9e" /></body>
      <title>New MS Certifications but it's not all good</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,7776ac81-24a0-447e-b1e0-4fff84d66f9e.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2005/10/26/NewMSCertificationsButItsNotAllGood.aspx</link>
      <pubDate>Wed, 26 Oct 2005 14:58:47 GMT</pubDate>
      <description>News about the new certifications that are to replace the MCAD and MCSD
is circulating around the net. In summary, the MSCD is being replaced
with the Microsoft Certified Professional Developer, while the MCAD is
being replaced with the Microsoft Certified Technical
Specialist.Further to this, the MCTS is split into 3 technology
specialisms for developers (there are 2 more specialisms for IT Pros),
including .NET Windows, .NET Web, and .NET Distributed apps. &lt;br&gt;
&lt;br&gt;
This is all good stuff, but I'm won't be happy until mobile and embedded development
is fairly represented in the certification roadmaps. 
&lt;br&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=7776ac81-24a0-447e-b1e0-4fff84d66f9e" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,7776ac81-24a0-447e-b1e0-4fff84d66f9e.aspx</comments>
      <category>.NET Framework</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=317467e0-4d77-45c3-8517-bc4227e0f0af</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,317467e0-4d77-45c3-8517-bc4227e0f0af.aspx</pingback:target>
      <dc:creator>Neil Cowburn</dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,317467e0-4d77-45c3-8517-bc4227e0f0af.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=317467e0-4d77-45c3-8517-bc4227e0f0af</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.developerday.co.uk/ddd/default.asp">
            <img alt="" src="http://www.developerday.co.uk/ddd/images/dddflair2.gif" align="left" border="0" />
          </a>
          <br />
Apparently, the first <a href="http://www.developerday.co.uk/ddd/default.asp">DeveloperDeveloperDeveloper
Day</a> at MS UK was such a raging success that they are running a second event in
October. I missed out on the first one because I was in Orlando for Tech Ed 2005.
I'm already registered for DDDDay 2, so if you are going, I'll see you there!
</p>
        <p>
 
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=317467e0-4d77-45c3-8517-bc4227e0f0af" />
      </body>
      <title>DeveloperDeveloperDeveloper Day 2: October 22nd</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,317467e0-4d77-45c3-8517-bc4227e0f0af.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2005/08/19/DeveloperDeveloperDeveloperDay2October22nd.aspx</link>
      <pubDate>Fri, 19 Aug 2005 21:22:11 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.developerday.co.uk/ddd/default.asp"&gt;&lt;img alt="" src="http://www.developerday.co.uk/ddd/images/dddflair2.gif" align="left" border="0" /&gt;&lt;/a&gt; 
&lt;br /&gt;
Apparently, the first &lt;a href="http://www.developerday.co.uk/ddd/default.asp"&gt;DeveloperDeveloperDeveloper
Day&lt;/a&gt; at MS UK was such a raging success that they are running a second event in
October. I missed out on the first one because I was in Orlando for Tech Ed 2005.
I'm already registered for DDDDay 2, so if you are going, I'll see you there!
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=317467e0-4d77-45c3-8517-bc4227e0f0af" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,317467e0-4d77-45c3-8517-bc4227e0f0af.aspx</comments>
      <category>.NET Compact Framework</category>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=ba2e8bd0-1051-4c83-83ef-44cb6c1398d5</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,ba2e8bd0-1051-4c83-83ef-44cb6c1398d5.aspx</pingback:target>
      <dc:creator>Neil Cowburn</dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,ba2e8bd0-1051-4c83-83ef-44cb6c1398d5.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=ba2e8bd0-1051-4c83-83ef-44cb6c1398d5</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently I was playing around with some code and, by complete accident, I ended up
with something similar to this:
</p>
        <pre>private string someString;

public string SomeString
{
    get { return someString; }
    internal set { someString = value; }
} </pre>
        <p>
This is fully legitimate code and will compile, even with the internal access modifier
on the setter. The beauty of this is that you can still set the property value from
any class within the same assembly, but any code consuming the class from outside
the same assembly will get a read only property. It gets even more interesting if
you limit the scope just to the current class by changing "internal" to "private".
Imagine you have some class that will be used in a multi-threaded application and
you wish to notify consumers when the property's value changes, yet you do not
wish to allows any consumers to modify the value -- you could use something like this:
</p>
        <pre>public event EventHandler SomeStringChanged;
private string someString;

public string SomeString
{
    get { return someString; }
    private set
    {
        someString = value;
        if (SomeStringChanged != null)
        {
            SomeStringChanged(this, EventArgs.Empty);
        }
    }
}</pre>
        <p>
Very cool!
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=ba2e8bd0-1051-4c83-83ef-44cb6c1398d5" />
      </body>
      <title>Interesting C# property construct</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,ba2e8bd0-1051-4c83-83ef-44cb6c1398d5.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2005/07/08/InterestingCPropertyConstruct.aspx</link>
      <pubDate>Fri, 08 Jul 2005 07:23:35 GMT</pubDate>
      <description>&lt;p&gt;
Recently I was playing around with some code and, by complete accident, I ended up
with something similar to this:
&lt;/p&gt;
&lt;pre&gt;private string someString;

public string SomeString
{
    get { return someString; }
    internal set { someString = value; }
} &lt;/pre&gt;
&lt;p&gt;
This is fully legitimate code and will compile, even with the internal access modifier
on the setter. The beauty of this is that you can still set the property value from
any class within the same assembly, but any code consuming the class from outside
the same assembly will get a read only property. It gets even more interesting if
you limit the scope just to the current class by changing "internal" to "private".
Imagine you have some class that will be used in a multi-threaded application and
you wish to notify consumers&amp;nbsp;when the property's value changes, yet you do not
wish to allows any consumers to modify the value -- you could use something like this:
&lt;/p&gt;
&lt;pre&gt;public event EventHandler SomeStringChanged;
private string someString;

public string SomeString
{
    get { return someString; }
    private set
    {
        someString = value;
        if (SomeStringChanged != null)
        {
            SomeStringChanged(this, EventArgs.Empty);
        }
    }
}&lt;/pre&gt;
&lt;p&gt;
Very cool!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=ba2e8bd0-1051-4c83-83ef-44cb6c1398d5" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,ba2e8bd0-1051-4c83-83ef-44cb6c1398d5.aspx</comments>
      <category>.NET Compact Framework</category>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=ff8ed1c5-9aa7-489f-a9ad-450a37355954</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,ff8ed1c5-9aa7-489f-a9ad-450a37355954.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,ff8ed1c5-9aa7-489f-a9ad-450a37355954.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=ff8ed1c5-9aa7-489f-a9ad-450a37355954</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This is hot news right now, and rightly so. <a href="http://http://blogs.msdn.com/brada/">Brad</a> et
al in the BCL team have begun <a href="http://blogs.msdn.com/brada/archive/2005/01/14/353464.aspx">a
series of training sessions around class library design</a> and how to apply this
to designing a top notch framework. This series is <strong>essential</strong> viewing,
IMO. The first session is up an offers an overview of what is to come in the following
13 sessions. You can view the full session plan at <a href="http://msdn.microsoft.com/netframework/programming/classlibraries/">http://msdn.microsoft.com/netframework/programming/classlibraries/</a>. 
</p>
        <p>
Unfortunately, this is online viewing only. No download option. That is unless, like
me, you use something like WMRecorder to save the stream for offline viewing. 
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=ff8ed1c5-9aa7-489f-a9ad-450a37355954" />
      </body>
      <title>Training: Designing Great Frameworks</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,ff8ed1c5-9aa7-489f-a9ad-450a37355954.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2005/01/17/TrainingDesigningGreatFrameworks.aspx</link>
      <pubDate>Mon, 17 Jan 2005 00:55:59 GMT</pubDate>
      <description>&lt;p&gt;
This is hot news right now, and rightly so. &lt;a href="http://http://blogs.msdn.com/brada/"&gt;Brad&lt;/a&gt; et
al in the BCL team have begun &lt;a href="http://blogs.msdn.com/brada/archive/2005/01/14/353464.aspx"&gt;a
series of training sessions around class library design&lt;/a&gt; and how to apply this
to designing a top notch framework. This&amp;nbsp;series is&amp;nbsp;&lt;strong&gt;essential&lt;/strong&gt; viewing,
IMO. The first session is up an offers an overview of what is to come in the following
13 sessions. You can view the full session plan at &lt;a href="http://msdn.microsoft.com/netframework/programming/classlibraries/"&gt;http://msdn.microsoft.com/netframework/programming/classlibraries/&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Unfortunately, this is online viewing only. No download option. That is unless, like
me, you use something like WMRecorder to save the stream for offline viewing. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=ff8ed1c5-9aa7-489f-a9ad-450a37355954" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,ff8ed1c5-9aa7-489f-a9ad-450a37355954.aspx</comments>
      <category>.NET Compact Framework</category>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=c1993989-a197-4102-82d5-bbf42a901ef4</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,c1993989-a197-4102-82d5-bbf42a901ef4.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,c1993989-a197-4102-82d5-bbf42a901ef4.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=c1993989-a197-4102-82d5-bbf42a901ef4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A couple of weeks ago, I started looking into using managed custom actions with the
WiX toolkit to add functionality to my installers. During my research, I came across <a href="http://blogs.msdn.com/josealmeida/archive/2004/11/08/253831/aspx">a
blog entry by Jose Almeida</a> which described how to do what I wanted, but it lacks
a concrete example of a complete WiX script detailing how to include &amp; call the
custom actions in an installer. So that's what I'm going to do today. 
</p>
        <p>
Below is the code I used for my custom actions. It's nothing impressive, but it gets
the job done. I wrote this in notepad, but you can create the same in Visual Studio
by starting a new Class Library project and adding an Installer Class project item.
Then it's just a matter over overriding the Install/Uninstall/Commit/Rollback methods
to provide your own action implementation.
</p>
        <pre class="code">using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using System.Windows.Forms;
[RunInstaller(true)]
public class CustomActions : Installer
{
    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);
        MessageBox.Show("Installing");
    }
    public override void Uninstall(IDictionary savedState)
    {
        base.Uninstall(savedState);
    }
    public override void Commit(IDictionary savedState)
    {
        base.Commit(savedState);
        MessageBox.Show("Committing");
    }
    public override void Rollback(IDictionary savedState)
    {
        base.Rollback(savedState);
        MessageBox.Show("Rolling back");
    }
}</pre>
        <p>
Once I had the installer class all coded up, I compiled it to a DLL and then set about
creating the WiX script. This is the part that I had the most problems with since
Jose's post was a little vague in places, but after an hour or so of playing around
with it I got something working that I was happy with. The main points to note when
you look at the WiX script are the CustomAction sections and the Custom sections in
the InstallExecuteSequence section. In the CustomAction section, you can pass custom
parameters to the installer method by using the "/MyParameter=MyValue" pattern, as
below (note: the WiX script included in the download does not make use of custom parameters,
nor does the installer class demonstrate how to use them):
</p>
        <pre class="code">&lt;CustomAction Id=Install Execute="deferred" DllEntry="ManagedInstall" BinaryKey="InstallUtil" /&gt;
&lt;CustomAction Id=InstallSetProp Value='/MyParameter=MyValue /installtype=notransaction /action=install 
/LogFile= &amp;quot;[#InstFile]&amp;quot; &amp;quot;[#InstCfgFile]&amp;quot;' Property="Install" /&gt;
</pre>
        <p>
Included in the Zip file is a makefile to compile the Installer assembly and to run
the WiX script through Candle and Light. 
</p>
        <p>
          <a href="/ncowburn/content/binary/ManagedCustomActions.zip">ManagedCustomActions.zip
(18.16 KB)</a>. 
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=c1993989-a197-4102-82d5-bbf42a901ef4" />
      </body>
      <title>Using Custom Actions with WiX</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,c1993989-a197-4102-82d5-bbf42a901ef4.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2005/01/04/UsingCustomActionsWithWiX.aspx</link>
      <pubDate>Tue, 04 Jan 2005 14:10:17 GMT</pubDate>
      <description>&lt;p&gt;
A couple of weeks ago, I started looking into using managed custom actions with the
WiX toolkit to add functionality to my installers. During my research, I came across &lt;a href="http://blogs.msdn.com/josealmeida/archive/2004/11/08/253831/aspx"&gt;a
blog entry by Jose Almeida&lt;/a&gt; which described how to do what I wanted, but it lacks
a concrete example of a complete WiX script detailing how to include &amp;amp; call the
custom actions in an installer. So that's what I'm going to do today. 
&lt;/p&gt;
&lt;p&gt;
Below is the code I used for my custom actions. It's nothing impressive, but it gets
the job done. I wrote this in notepad, but you can create the same in Visual Studio
by starting a new Class Library project and adding an Installer Class project item.
Then it's just a matter over overriding the Install/Uninstall/Commit/Rollback methods
to provide your own action implementation.
&lt;/p&gt;
&lt;pre class=code&gt;using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using System.Windows.Forms;
[RunInstaller(true)]
public class CustomActions : Installer
{
    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);
        MessageBox.Show("Installing");
    }
    public override void Uninstall(IDictionary savedState)
    {
        base.Uninstall(savedState);
    }
    public override void Commit(IDictionary savedState)
    {
        base.Commit(savedState);
        MessageBox.Show("Committing");
    }
    public override void Rollback(IDictionary savedState)
    {
        base.Rollback(savedState);
        MessageBox.Show("Rolling back");
    }
}&lt;/pre&gt;
&lt;p&gt;
Once I had the installer class all coded up, I compiled it to a DLL and then set about
creating the WiX script. This is the part that I had the most problems with since
Jose's post was a little vague in places, but after an hour or so of playing around
with it I got something working that I was happy with. The main points to note when
you look at the WiX script are the CustomAction sections and the Custom sections in
the InstallExecuteSequence section. In the CustomAction section, you can pass custom
parameters to the installer method by using the "/MyParameter=MyValue" pattern, as
below (note: the WiX script included in the download does not make use of custom parameters,
nor does the installer class demonstrate how to use them):
&lt;/p&gt;
&lt;pre class=code&gt;&amp;lt;CustomAction Id=Install Execute="deferred" DllEntry="ManagedInstall" BinaryKey="InstallUtil" /&gt;
&amp;lt;CustomAction Id=InstallSetProp Value='/MyParameter=MyValue /installtype=notransaction /action=install &amp;#13;&amp;#10;/LogFile= &amp;amp;quot;[#InstFile]&amp;amp;quot; &amp;amp;quot;[#InstCfgFile]&amp;amp;quot;' Property="Install" /&gt;
&lt;/pre&gt;
&lt;p&gt;
Included in the Zip file is a makefile to compile the Installer assembly and to run
the WiX script through Candle and Light. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="/ncowburn/content/binary/ManagedCustomActions.zip"&gt;ManagedCustomActions.zip
(18.16 KB)&lt;/a&gt;. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=c1993989-a197-4102-82d5-bbf42a901ef4" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,c1993989-a197-4102-82d5-bbf42a901ef4.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=451f6d46-b6ff-46e6-999d-5f7e29ae7b61</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,451f6d46-b6ff-46e6-999d-5f7e29ae7b61.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,451f6d46-b6ff-46e6-999d-5f7e29ae7b61.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=451f6d46-b6ff-46e6-999d-5f7e29ae7b61</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Over the weekend, Gert sent a message to the NAnt-Dev mailing list announcing the
release of NAnt 0.85-RC1. <a href="http://nant.sourceforge.net/release/0.85-rc1/releasenotes.html">Release
notes are available here.</a></p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=451f6d46-b6ff-46e6-999d-5f7e29ae7b61" />
      </body>
      <title>NAnt 0.85 RC 1 is available</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,451f6d46-b6ff-46e6-999d-5f7e29ae7b61.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2004/11/29/NAnt085RC1IsAvailable.aspx</link>
      <pubDate>Mon, 29 Nov 2004 12:09:00 GMT</pubDate>
      <description>&lt;p&gt;
Over the weekend, Gert sent a message to the NAnt-Dev mailing list announcing the
release of NAnt 0.85-RC1. &lt;a href="http://nant.sourceforge.net/release/0.85-rc1/releasenotes.html"&gt;Release
notes are available here.&lt;/a&gt; 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=451f6d46-b6ff-46e6-999d-5f7e29ae7b61" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,451f6d46-b6ff-46e6-999d-5f7e29ae7b61.aspx</comments>
      <category>.NET Compact Framework</category>
      <category>.NET Framework</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=852639a9-88a9-430e-b8f4-823738f54586</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,852639a9-88a9-430e-b8f4-823738f54586.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,852639a9-88a9-430e-b8f4-823738f54586.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=852639a9-88a9-430e-b8f4-823738f54586</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://blogs.msdn.com/ncarora/">Nathan</a> has a cracking post on <a href="http://blogs.msdn.com/ncarora/archive/2004/11/11/256098.aspx">the
use of the ConditionalAttribute</a>. This has just opened my eyes to something quite
cool:
</p>
        <p>
        </p>
        <pre>
          <font color="blue">#define</font> DESKTOP <font color="blue">void</font> foo()
{ DoCommonStuff(); DoDeviceStuff(); DoDesktopStuff(); } <font color="blue">void</font> DoCommonStuff()
{ <font color="green">// code that's common to both device and desktop fx's</font> }
[Conditional("DESKTOP")] <font color="blue">void</font> DoDesktopStuff() { <font color="green">//
desktop specific code only</font> } [Conditional("DEVICE")] <font color="blue">void</font> DoDeviceStuff()
{ <font color="green">// device specific code only</font> } </pre>
        <p>
Cross-platform coding anyone?
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=852639a9-88a9-430e-b8f4-823738f54586" />
      </body>
      <title>Fun with the ConditionalAttribute</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,852639a9-88a9-430e-b8f4-823738f54586.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2004/11/12/FunWithTheConditionalAttribute.aspx</link>
      <pubDate>Fri, 12 Nov 2004 01:32:51 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://blogs.msdn.com/ncarora/"&gt;Nathan&lt;/a&gt; has a cracking post on &lt;a href="http://blogs.msdn.com/ncarora/archive/2004/11/11/256098.aspx"&gt;the
use of the ConditionalAttribute&lt;/a&gt;. This has just opened my eyes to something quite
cool:
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;&lt;font color=blue&gt;#define&lt;/font&gt; DESKTOP &lt;font color=blue&gt;void&lt;/font&gt; foo() {
DoCommonStuff(); DoDeviceStuff(); DoDesktopStuff(); } &lt;font color=blue&gt;void&lt;/font&gt; DoCommonStuff()
{ &lt;font color=green&gt;// code that's common to both device and desktop fx's&lt;/font&gt; }
[Conditional("DESKTOP")] &lt;font color=blue&gt;void&lt;/font&gt; DoDesktopStuff() { &lt;font color=green&gt;//
desktop specific code only&lt;/font&gt; } [Conditional("DEVICE")] &lt;font color=blue&gt;void&lt;/font&gt; DoDeviceStuff()
{ &lt;font color=green&gt;// device specific code only&lt;/font&gt; } &lt;/pre&gt;
&lt;p&gt;
Cross-platform coding anyone?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=852639a9-88a9-430e-b8f4-823738f54586" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,852639a9-88a9-430e-b8f4-823738f54586.aspx</comments>
      <category>.NET Compact Framework</category>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=daae016b-ff5e-4e09-8782-d436492b83c7</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,daae016b-ff5e-4e09-8782-d436492b83c7.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,daae016b-ff5e-4e09-8782-d436492b83c7.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=daae016b-ff5e-4e09-8782-d436492b83c7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Hot on the trial of <a href="http://msdn.microsoft.com/library/en-us/dnnetcomp/html/HostingANativeWindowsControl.asp">Peter's
latest MSDN article</a>, and in the spirit of showing that we embedded can fair well
in the desktop world too, here's how you can play those groovy AVI movie native resources
(like the File Copy dialog 
<RANT>
with the worst guestimates for 'Time remaining' ever known to mankind
</RANT>
): Host the SysAnimate32 native control in your .NET app! And the code below shows
you how to does this:
</p>
        <p>
          <style type="text/css">
.csharpcode
{
 font-size: 10pt;
 color: black;
 font-family: Courier New , Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}
.csharpcode pre { margin: 0px; }
.rem { color: #008000; }
.kwrd { color: #0000ff; }
.str { color: #006080; }
.op { color: #0000c0; }
.preproc { color: #cc6633; }
.asp { background-color: #ffff00; }
.html { color: #800000; }
.attr { color: #ff0000; }
.alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0px;
}
.lnum { color: #606060; }
</style>
        </p>
        <div class="csharpcode">
          <pre>
            <span class="lnum"> 1: </span>
            <span class="kwrd">using</span> System;</pre>
          <pre>
            <span class="lnum"> 2: </span>
            <span class="kwrd">using</span> System.Drawing;</pre>
          <pre>
            <span class="lnum"> 3: </span>
            <span class="kwrd">using</span> System.Runtime.InteropServices;</pre>
          <pre>
            <span class="lnum"> 4: </span> </pre>
          <pre>
            <span class="lnum"> 5: </span>
            <span class="kwrd">namespace</span> OpenNETCF.Desktop.Windows.Forms</pre>
          <pre>
            <span class="lnum"> 6: </span>{</pre>
          <pre>
            <span class="lnum"> 7: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">class</span> SysAnimate32
: IDisposable</pre>
          <pre>
            <span class="lnum"> 8: </span> {</pre>
          <pre>
            <span class="lnum"> 9: </span>
            <span class="preproc">#region</span> Interop</pre>
          <pre>
            <span class="lnum"> 10: </span> </pre>
          <pre>
            <span class="lnum"> 11: </span> IntPtr hAnimCtrl, avi;</pre>
          <pre>
            <span class="lnum"> 12: </span> </pre>
          <pre>
            <span class="lnum"> 13: </span>
            <span class="kwrd">readonly</span>
            <span class="kwrd">string</span> ANIMATE_CLASS
= <span class="str">"SysAnimate32"</span>;</pre>
          <pre>
            <span class="lnum"> 14: </span>
          </pre>
          <pre>
            <span class="lnum"> 15: </span>
            <span class="kwrd">readonly</span>
            <span class="kwrd">uint</span> WS_CHILD
= 0x40000000;</pre>
          <pre>
            <span class="lnum"> 16: </span>
            <span class="kwrd">readonly</span>
            <span class="kwrd">uint</span> WS_VISIBLE
= 0x10000000;</pre>
          <pre>
            <span class="lnum"> 17: </span>
            <span class="kwrd">readonly</span>
            <span class="kwrd">uint</span> ACS_TRANSPARENT
= 0x0002;</pre>
          <pre>
            <span class="lnum"> 18: </span>
            <span class="kwrd">readonly</span>
            <span class="kwrd">uint</span> ACS_CENTER
= 0x0001;</pre>
          <pre>
            <span class="lnum"> 19: </span> </pre>
          <pre>
            <span class="lnum"> 20: </span>
            <span class="kwrd">readonly</span>
            <span class="kwrd">int</span> ACM_OPEN
= 0x400 + 100;</pre>
          <pre>
            <span class="lnum"> 21: </span>
            <span class="kwrd">readonly</span>
            <span class="kwrd">int</span> ACM_PLAY
= 0x400 + 101;</pre>
          <pre>
            <span class="lnum"> 22: </span>
            <span class="kwrd">readonly</span>
            <span class="kwrd">int</span> ACM_STOP
= 0x400 + 102;</pre>
          <pre>
            <span class="lnum"> 23: </span> </pre>
          <pre>
            <span class="lnum"> 24: </span> [DllImport(<span class="str">"user32"</span>)]</pre>
          <pre>
            <span class="lnum"> 25: </span>
            <span class="kwrd">static</span>
            <span class="kwrd">extern</span> IntPtr
CreateWindowEx(</pre>
          <pre>
            <span class="lnum"> 26: </span>
            <span class="kwrd">uint</span> dwExStyle, </pre>
          <pre>
            <span class="lnum"> 27: </span>
            <span class="kwrd">string</span> lpClassName, </pre>
          <pre>
            <span class="lnum"> 28: </span>
            <span class="kwrd">string</span> lpWindowName, </pre>
          <pre>
            <span class="lnum"> 29: </span>
            <span class="kwrd">uint</span> dwStyle, </pre>
          <pre>
            <span class="lnum"> 30: </span>
            <span class="kwrd">int</span> x, </pre>
          <pre>
            <span class="lnum"> 31: </span>
            <span class="kwrd">int</span> y, </pre>
          <pre>
            <span class="lnum"> 32: </span>
            <span class="kwrd">int</span> width, </pre>
          <pre>
            <span class="lnum"> 33: </span>
            <span class="kwrd">int</span> height, </pre>
          <pre>
            <span class="lnum"> 34: </span> IntPtr hWndParent, </pre>
          <pre>
            <span class="lnum"> 35: </span>
            <span class="kwrd">int</span> hMenu, </pre>
          <pre>
            <span class="lnum"> 36: </span> IntPtr hInstance, </pre>
          <pre>
            <span class="lnum"> 37: </span>
            <span class="kwrd">string</span> lpParam</pre>
          <pre>
            <span class="lnum"> 38: </span> );</pre>
          <pre>
            <span class="lnum"> 39: </span> </pre>
          <pre>
            <span class="lnum"> 40: </span> [DllImport(<span class="str">"kernel32"</span>)]</pre>
          <pre>
            <span class="lnum"> 41: </span>
            <span class="kwrd">static</span>
            <span class="kwrd">extern</span> IntPtr
LoadLibrary(<span class="kwrd">string</span> lpLibrary);</pre>
          <pre>
            <span class="lnum"> 42: </span> </pre>
          <pre>
            <span class="lnum"> 43: </span> [DllImport(<span class="str">"kernel32"</span>)]</pre>
          <pre>
            <span class="lnum"> 44: </span>
            <span class="kwrd">static</span>
            <span class="kwrd">extern</span>
            <span class="kwrd">void</span> FreeLibrary(IntPtr
hLibrary);</pre>
          <pre>
            <span class="lnum"> 45: </span> </pre>
          <pre>
            <span class="lnum"> 46: </span> [DllImport(<span class="str">"user32"</span>)]</pre>
          <pre>
            <span class="lnum"> 47: </span>
            <span class="kwrd">static</span>
            <span class="kwrd">extern</span>
            <span class="kwrd">int</span> SendMessage(</pre>
          <pre>
            <span class="lnum"> 48: </span> IntPtr hWnd,</pre>
          <pre>
            <span class="lnum"> 49: </span>
            <span class="kwrd">int</span> dwMsg,</pre>
          <pre>
            <span class="lnum"> 50: </span>
            <span class="kwrd">int</span> WParam,</pre>
          <pre>
            <span class="lnum"> 51: </span>
            <span class="kwrd">int</span> LParam</pre>
          <pre>
            <span class="lnum"> 52: </span> );</pre>
          <pre>
            <span class="lnum"> 53: </span> </pre>
          <pre>
            <span class="lnum"> 54: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre>
            <span class="lnum"> 55: </span> </pre>
          <pre>
            <span class="lnum"> 56: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">bool</span> disposed
= <span class="kwrd">false</span>;</pre>
          <pre>
            <span class="lnum"> 57: </span> </pre>
          <pre>
            <span class="lnum"> 58: </span>
            <span class="preproc">#region</span> .ctor</pre>
          <pre>
            <span class="lnum"> 59: </span> </pre>
          <pre>
            <span class="lnum"> 60: </span>
            <span class="kwrd">public</span> SysAnimate32(IntPtr
parent, <span class="kwrd">string</span> library, <span class="kwrd">int</span> index)
: </pre>
          <pre>
            <span class="lnum"> 61: </span>
            <span class="kwrd">this</span>(parent, library,
index, <span class="kwrd">new</span> Point(0,0), <span class="kwrd">new</span> Size(270,70))</pre>
          <pre>
            <span class="lnum"> 62: </span> {</pre>
          <pre>
            <span class="lnum"> 63: </span> }</pre>
          <pre>
            <span class="lnum"> 64: </span> </pre>
          <pre>
            <span class="lnum"> 65: </span>
            <span class="kwrd">public</span> SysAnimate32(IntPtr
parent, <span class="kwrd">string</span> library, <span class="kwrd">int</span> index, </pre>
          <pre>
            <span class="lnum"> 66: </span>
            <span class="kwrd">int</span> x, <span class="kwrd">int</span> y, <span class="kwrd">int</span> width, <span class="kwrd">int</span> height)
: </pre>
          <pre>
            <span class="lnum"> 67: </span>
            <span class="kwrd">this</span>(parent, library,
index, <span class="kwrd">new</span> Point(x, y), <span class="kwrd">new</span> Size(width,
height))</pre>
          <pre>
            <span class="lnum"> 68: </span> {</pre>
          <pre>
            <span class="lnum"> 69: </span> }</pre>
          <pre>
            <span class="lnum"> 70: </span> </pre>
          <pre>
            <span class="lnum"> 71: </span>
            <span class="kwrd">public</span> SysAnimate32(IntPtr
parent, <span class="kwrd">string</span> library, <span class="kwrd">int</span> index, </pre>
          <pre>
            <span class="lnum"> 72: </span> Point origin, Size size)</pre>
          <pre>
            <span class="lnum"> 73: </span> {</pre>
          <pre>
            <span class="lnum"> 74: </span>
            <span class="kwrd">if</span>((avi = LoadLibrary(library))
== IntPtr.Zero)</pre>
          <pre>
            <span class="lnum"> 75: </span> {</pre>
          <pre>
            <span class="lnum"> 76: </span> System.Windows.Forms.MessageBox.Show(</pre>
          <pre>
            <span class="lnum"> 77: </span>
            <span class="kwrd">string</span>.Format(<span class="str">"Unable
to load library \"{0}\""</span>,library)</pre>
          <pre>
            <span class="lnum"> 78: </span> );</pre>
          <pre>
            <span class="lnum"> 79: </span> }</pre>
          <pre>
            <span class="lnum"> 80: </span>
            <span class="kwrd">else</span>
          </pre>
          <pre>
            <span class="lnum"> 81: </span> {</pre>
          <pre>
            <span class="lnum"> 82: </span> hAnimCtrl = CreateWindowEx(</pre>
          <pre>
            <span class="lnum"> 83: </span> 0,</pre>
          <pre>
            <span class="lnum"> 84: </span> ANIMATE_CLASS,</pre>
          <pre>
            <span class="lnum"> 85: </span>
            <span class="kwrd">null</span>,</pre>
          <pre>
            <span class="lnum"> 86: </span> WS_CHILD|WS_VISIBLE|ACS_TRANSPARENT|ACS_CENTER,</pre>
          <pre>
            <span class="lnum"> 87: </span> origin.X,</pre>
          <pre>
            <span class="lnum"> 88: </span> origin.Y,</pre>
          <pre>
            <span class="lnum"> 89: </span> size.Width,</pre>
          <pre>
            <span class="lnum"> 90: </span> size.Height,</pre>
          <pre>
            <span class="lnum"> 91: </span> parent,</pre>
          <pre>
            <span class="lnum"> 92: </span> 0,</pre>
          <pre>
            <span class="lnum"> 93: </span> avi,</pre>
          <pre>
            <span class="lnum"> 94: </span>
            <span class="kwrd">null</span>
          </pre>
          <pre>
            <span class="lnum"> 95: </span> );</pre>
          <pre>
            <span class="lnum"> 96: </span> </pre>
          <pre>
            <span class="lnum"> 97: </span> SendMessage(hAnimCtrl, ACM_OPEN, (<span class="kwrd">int</span>)avi,
index);</pre>
          <pre>
            <span class="lnum"> 98: </span> }</pre>
          <pre>
            <span class="lnum"> 99: </span> }</pre>
          <pre>
            <span class="lnum"> 100: </span> </pre>
          <pre>
            <span class="lnum"> 101: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre>
            <span class="lnum"> 102: </span> </pre>
          <pre>
            <span class="lnum"> 103: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 104: </span>
            <span class="rem">/// Plays the AVI movie</span>
          </pre>
          <pre>
            <span class="lnum"> 105: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 106: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> Animate()</pre>
          <pre>
            <span class="lnum"> 107: </span> {</pre>
          <pre>
            <span class="lnum"> 108: </span> System.Threading.Thread.Sleep(100);</pre>
          <pre>
            <span class="lnum"> 109: </span> SendMessage(hAnimCtrl, ACM_PLAY, -1, -1);</pre>
          <pre>
            <span class="lnum"> 110: </span> }</pre>
          <pre>
            <span class="lnum"> 111: </span> </pre>
          <pre>
            <span class="lnum"> 112: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 113: </span>
            <span class="rem">/// Stops the AVI movie</span>
          </pre>
          <pre>
            <span class="lnum"> 114: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 115: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> Stop()</pre>
          <pre>
            <span class="lnum"> 116: </span> {</pre>
          <pre>
            <span class="lnum"> 117: </span> SendMessage(hAnimCtrl, ACM_STOP, -1, -1);</pre>
          <pre>
            <span class="lnum"> 118: </span> }</pre>
          <pre>
            <span class="lnum"> 119: </span> </pre>
          <pre>
            <span class="lnum"> 120: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> Dispose()</pre>
          <pre>
            <span class="lnum"> 121: </span> {</pre>
          <pre>
            <span class="lnum"> 122: </span> Dispose(<span class="kwrd">true</span>);</pre>
          <pre>
            <span class="lnum"> 123: </span> GC.SuppressFinalize(<span class="kwrd">this</span>); </pre>
          <pre>
            <span class="lnum"> 124: </span> }</pre>
          <pre>
            <span class="lnum"> 125: </span> </pre>
          <pre>
            <span class="lnum"> 126: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> Dispose(<span class="kwrd">bool</span> disposing)</pre>
          <pre>
            <span class="lnum"> 127: </span> {</pre>
          <pre>
            <span class="lnum"> 128: </span>
            <span class="kwrd">if</span>(!<span class="kwrd">this</span>.disposed)</pre>
          <pre>
            <span class="lnum"> 129: </span> {</pre>
          <pre>
            <span class="lnum"> 130: </span>
            <span class="kwrd">if</span>(disposing)</pre>
          <pre>
            <span class="lnum"> 131: </span> {</pre>
          <pre>
            <span class="lnum"> 132: </span>
            <span class="rem">// Dispose managed resources</span>
          </pre>
          <pre>
            <span class="lnum"> 133: </span> }</pre>
          <pre>
            <span class="lnum"> 134: </span> </pre>
          <pre>
            <span class="lnum"> 135: </span>
            <span class="rem">// Dispose unmanaged resources</span>
          </pre>
          <pre>
            <span class="lnum"> 136: </span>
            <span class="kwrd">if</span>(avi != IntPtr.Zero)</pre>
          <pre>
            <span class="lnum"> 137: </span> {</pre>
          <pre>
            <span class="lnum"> 138: </span> FreeLibrary(avi);</pre>
          <pre>
            <span class="lnum"> 139: </span> avi = IntPtr.Zero;</pre>
          <pre>
            <span class="lnum"> 140: </span> }</pre>
          <pre>
            <span class="lnum"> 141: </span> disposed = <span class="kwrd">true</span>;</pre>
          <pre>
            <span class="lnum"> 142: </span> }</pre>
          <pre>
            <span class="lnum"> 143: </span> }</pre>
          <pre>
            <span class="lnum"> 144: </span> </pre>
          <pre>
            <span class="lnum"> 145: </span>
            <span class="rem">// Finalizer required because
not everyone calls Dispose </span>
          </pre>
          <pre>
            <span class="lnum"> 146: </span> ~SysAnimate32()</pre>
          <pre>
            <span class="lnum"> 147: </span> {</pre>
          <pre>
            <span class="lnum"> 148: </span> Dispose(<span class="kwrd">false</span>);</pre>
          <pre>
            <span class="lnum"> 149: </span> }</pre>
          <pre>
            <span class="lnum"> 150: </span> }</pre>
          <pre>
            <span class="lnum"> 151: </span>}</pre>
        </div>
        <p>
Enjoy!
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=daae016b-ff5e-4e09-8782-d436492b83c7" />
      </body>
      <title>Hosting Native Controls in your Desktop Apps</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,daae016b-ff5e-4e09-8782-d436492b83c7.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2004/11/11/HostingNativeControlsInYourDesktopApps.aspx</link>
      <pubDate>Thu, 11 Nov 2004 20:15:04 GMT</pubDate>
      <description>&lt;p&gt;
Hot on the trial of &lt;a href="http://msdn.microsoft.com/library/en-us/dnnetcomp/html/HostingANativeWindowsControl.asp"&gt;Peter's
latest MSDN article&lt;/a&gt;, and in the spirit of showing that we embedded can fair well
in the desktop world too, here's how you can play those groovy AVI movie native resources
(like the File Copy dialog 
&lt;RANT&gt;
with the worst guestimates for 'Time remaining' ever known to mankind
&lt;/RANT&gt;
): Host the SysAnimate32 native control in your .NET app! And the code below shows
you how to does this:
&lt;/p&gt;
&lt;p&gt;
&lt;style type="text/css"&gt;
.csharpcode
{
 font-size: 10pt;
 color: black;
 font-family: Courier New , Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}
.csharpcode pre { margin: 0px; }
.rem { color: #008000; }
.kwrd { color: #0000ff; }
.str { color: #006080; }
.op { color: #0000c0; }
.preproc { color: #cc6633; }
.asp { background-color: #ffff00; }
.html { color: #800000; }
.attr { color: #ff0000; }
.alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0px;
}
.lnum { color: #606060; }
&lt;/style&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Drawing;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.InteropServices;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; OpenNETCF.Desktop.Windows.Forms&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SysAnimate32
: IDisposable&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; Interop&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt; IntPtr hAnimCtrl, avi;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ANIMATE_CLASS
= &lt;span class="str"&gt;"SysAnimate32"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;uint&lt;/span&gt; WS_CHILD
= 0x40000000;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 16: &lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;uint&lt;/span&gt; WS_VISIBLE
= 0x10000000;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 17: &lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;uint&lt;/span&gt; ACS_TRANSPARENT
= 0x0002;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 18: &lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;uint&lt;/span&gt; ACS_CENTER
= 0x0001;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 19: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 20: &lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; ACM_OPEN
= 0x400 + 100;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 21: &lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; ACM_PLAY
= 0x400 + 101;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 22: &lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; ACM_STOP
= 0x400 + 102;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 23: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 24: &lt;/span&gt; [DllImport(&lt;span class="str"&gt;"user32"&lt;/span&gt;)]&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 25: &lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; IntPtr
CreateWindowEx(&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 26: &lt;/span&gt; &lt;span class="kwrd"&gt;uint&lt;/span&gt; dwExStyle, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 27: &lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; lpClassName, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 28: &lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; lpWindowName, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 29: &lt;/span&gt; &lt;span class="kwrd"&gt;uint&lt;/span&gt; dwStyle, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 30: &lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; x, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 31: &lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; y, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 32: &lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; width, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 33: &lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; height, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 34: &lt;/span&gt; IntPtr hWndParent, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 35: &lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; hMenu, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 36: &lt;/span&gt; IntPtr hInstance, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 37: &lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; lpParam&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 38: &lt;/span&gt; );&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 39: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 40: &lt;/span&gt; [DllImport(&lt;span class="str"&gt;"kernel32"&lt;/span&gt;)]&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 41: &lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; IntPtr
LoadLibrary(&lt;span class="kwrd"&gt;string&lt;/span&gt; lpLibrary);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 42: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 43: &lt;/span&gt; [DllImport(&lt;span class="str"&gt;"kernel32"&lt;/span&gt;)]&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 44: &lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FreeLibrary(IntPtr
hLibrary);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 45: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 46: &lt;/span&gt; [DllImport(&lt;span class="str"&gt;"user32"&lt;/span&gt;)]&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 47: &lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; SendMessage(&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 48: &lt;/span&gt; IntPtr hWnd,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 49: &lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; dwMsg,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 50: &lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; WParam,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 51: &lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; LParam&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 52: &lt;/span&gt; );&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 53: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 54: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 55: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 56: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; disposed
= &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 57: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 58: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; .ctor&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 59: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 60: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; SysAnimate32(IntPtr
parent, &lt;span class="kwrd"&gt;string&lt;/span&gt; library, &lt;span class="kwrd"&gt;int&lt;/span&gt; index)
: &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 61: &lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;(parent, library,
index, &lt;span class="kwrd"&gt;new&lt;/span&gt; Point(0,0), &lt;span class="kwrd"&gt;new&lt;/span&gt; Size(270,70))&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 62: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 63: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 64: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 65: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; SysAnimate32(IntPtr
parent, &lt;span class="kwrd"&gt;string&lt;/span&gt; library, &lt;span class="kwrd"&gt;int&lt;/span&gt; index, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 66: &lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; x, &lt;span class="kwrd"&gt;int&lt;/span&gt; y, &lt;span class="kwrd"&gt;int&lt;/span&gt; width, &lt;span class="kwrd"&gt;int&lt;/span&gt; height)
: &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 67: &lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;(parent, library,
index, &lt;span class="kwrd"&gt;new&lt;/span&gt; Point(x, y), &lt;span class="kwrd"&gt;new&lt;/span&gt; Size(width,
height))&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 68: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 69: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 70: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 71: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; SysAnimate32(IntPtr
parent, &lt;span class="kwrd"&gt;string&lt;/span&gt; library, &lt;span class="kwrd"&gt;int&lt;/span&gt; index, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 72: &lt;/span&gt; Point origin, Size size)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 73: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 74: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt;((avi = LoadLibrary(library))
== IntPtr.Zero)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 75: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 76: &lt;/span&gt; System.Windows.Forms.MessageBox.Show(&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 77: &lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"Unable
to load library \"{0}\""&lt;/span&gt;,library)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 78: &lt;/span&gt; );&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 79: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 80: &lt;/span&gt; &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 81: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 82: &lt;/span&gt; hAnimCtrl = CreateWindowEx(&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 83: &lt;/span&gt; 0,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 84: &lt;/span&gt; ANIMATE_CLASS,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 85: &lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 86: &lt;/span&gt; WS_CHILD|WS_VISIBLE|ACS_TRANSPARENT|ACS_CENTER,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 87: &lt;/span&gt; origin.X,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 88: &lt;/span&gt; origin.Y,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 89: &lt;/span&gt; size.Width,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 90: &lt;/span&gt; size.Height,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 91: &lt;/span&gt; parent,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 92: &lt;/span&gt; 0,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 93: &lt;/span&gt; avi,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 94: &lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 95: &lt;/span&gt; );&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 96: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 97: &lt;/span&gt; SendMessage(hAnimCtrl, ACM_OPEN, (&lt;span class="kwrd"&gt;int&lt;/span&gt;)avi,
index);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 98: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 99: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 100: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 101: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 102: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 103: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 104: &lt;/span&gt; &lt;span class="rem"&gt;/// Plays the AVI movie&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 105: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 106: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Animate()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 107: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 108: &lt;/span&gt; System.Threading.Thread.Sleep(100);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 109: &lt;/span&gt; SendMessage(hAnimCtrl, ACM_PLAY, -1, -1);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 110: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 111: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 112: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 113: &lt;/span&gt; &lt;span class="rem"&gt;/// Stops the AVI movie&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 114: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 115: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Stop()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 116: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 117: &lt;/span&gt; SendMessage(hAnimCtrl, ACM_STOP, -1, -1);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 118: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 119: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 120: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Dispose()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 121: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 122: &lt;/span&gt; Dispose(&lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 123: &lt;/span&gt; GC.SuppressFinalize(&lt;span class="kwrd"&gt;this&lt;/span&gt;); &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 124: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 125: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 126: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Dispose(&lt;span class="kwrd"&gt;bool&lt;/span&gt; disposing)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 127: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 128: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt;(!&lt;span class="kwrd"&gt;this&lt;/span&gt;.disposed)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 129: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 130: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt;(disposing)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 131: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 132: &lt;/span&gt; &lt;span class="rem"&gt;// Dispose managed resources&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 133: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 134: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 135: &lt;/span&gt; &lt;span class="rem"&gt;// Dispose unmanaged resources&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 136: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt;(avi != IntPtr.Zero)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 137: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 138: &lt;/span&gt; FreeLibrary(avi);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 139: &lt;/span&gt; avi = IntPtr.Zero;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 140: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 141: &lt;/span&gt; disposed = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 142: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 143: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 144: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 145: &lt;/span&gt; &lt;span class="rem"&gt;// Finalizer required because
not everyone calls Dispose &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 146: &lt;/span&gt; ~SysAnimate32()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 147: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 148: &lt;/span&gt; Dispose(&lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 149: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 150: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 151: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&gt;
&lt;p&gt;
Enjoy!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=daae016b-ff5e-4e09-8782-d436492b83c7" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,daae016b-ff5e-4e09-8782-d436492b83c7.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=a6a84f30-d1a9-4a63-9bc9-e0242e290fda</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,a6a84f30-d1a9-4a63-9bc9-e0242e290fda.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,a6a84f30-d1a9-4a63-9bc9-e0242e290fda.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=a6a84f30-d1a9-4a63-9bc9-e0242e290fda</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Check out <a href="http://jobsearch.monster.co.uk/getjob.asp?JobID=23534704&amp;AVSDM=2004%2D08%2D11+08%3A29%3A22&amp;Logo=1&amp;col=dltci&amp;cy=UK&amp;brd=1%2C1&amp;lid=807%2C1254&amp;fn=&amp;q=C%23">this position
asking for NUnit skills</a>! That's the first time I've seen a job description detailing
the necessity of NUnit skills. 
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=a6a84f30-d1a9-4a63-9bc9-e0242e290fda" />
      </body>
      <title>Is unit testing finally coming of age? </title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,a6a84f30-d1a9-4a63-9bc9-e0242e290fda.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2004/09/01/IsUnitTestingFinallyComingOfAge.aspx</link>
      <pubDate>Wed, 01 Sep 2004 10:34:00 GMT</pubDate>
      <description>&lt;p&gt;
Check out &lt;a href="http://jobsearch.monster.co.uk/getjob.asp?JobID=23534704&amp;amp;AVSDM=2004%2D08%2D11+08%3A29%3A22&amp;amp;Logo=1&amp;amp;col=dltci&amp;amp;cy=UK&amp;amp;brd=1%2C1&amp;amp;lid=807%2C1254&amp;amp;fn=&amp;amp;q=C%23"&gt;this&amp;nbsp;position
asking for NUnit skills&lt;/a&gt;! That's the first time I've seen a job description detailing
the necessity of NUnit skills. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=a6a84f30-d1a9-4a63-9bc9-e0242e290fda" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,a6a84f30-d1a9-4a63-9bc9-e0242e290fda.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=f16ae56d-4ca3-4536-9834-b88a8f1f6a3a</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,f16ae56d-4ca3-4536-9834-b88a8f1f6a3a.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,f16ae56d-4ca3-4536-9834-b88a8f1f6a3a.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=f16ae56d-4ca3-4536-9834-b88a8f1f6a3a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Well, despite my good intentions, I was not able to resist the temptation to purchase
"<a href="http://www.apress.com/book/bookDisplay.html?bID=213">Build Your Own .NET
Language and Compiler</a>" (Apress) by Edward G. Nilges. This is one area
I've been meaning to read up on for a LONG time now so I'm looking forward to this
book being delivered so I can drive right on in :)
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=f16ae56d-4ca3-4536-9834-b88a8f1f6a3a" />
      </body>
      <title>Build Your Own .NET Language and Compiler</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,f16ae56d-4ca3-4536-9834-b88a8f1f6a3a.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2004/05/28/BuildYourOwnNETLanguageAndCompiler.aspx</link>
      <pubDate>Fri, 28 May 2004 20:24:37 GMT</pubDate>
      <description>&lt;p&gt;
Well, despite my good intentions, I was not able to resist the temptation to purchase
"&lt;a href="http://www.apress.com/book/bookDisplay.html?bID=213"&gt;Build Your Own .NET
Language and Compiler&lt;/a&gt;" (Apress)&amp;nbsp;by Edward G. Nilges. This is&amp;nbsp;one area
I've been meaning to read up on for a LONG time now so I'm looking forward to this
book being delivered so I can drive right on in :)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=f16ae56d-4ca3-4536-9834-b88a8f1f6a3a" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,f16ae56d-4ca3-4536-9834-b88a8f1f6a3a.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=40169eab-a7bd-404b-8a65-8a9adc3a6313</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,40169eab-a7bd-404b-8a65-8a9adc3a6313.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,40169eab-a7bd-404b-8a65-8a9adc3a6313.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=40169eab-a7bd-404b-8a65-8a9adc3a6313</wfw:commentRss>
      <slash:comments>7</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
If you've used iTunes, you'll know that the filtering/searching is fast. The grid
control that Apple uses is very performant, even with a few thousand tracks. However,
displaying the track info from the search results in a managed application is not. 
</p>
        <p>
In the screen grab below, iTunes Search is a C# application. As you can see, the search
was quick. iTunes filtered out 31 tracks from 2994 in just 10 milliseconds. However,
since we have to for-loop through the resulting IITTrackCollection, it took 180 milliseconds
to add the tracks to the list view. 
</p>
        <p>
Incidently, to add 2994 tracks to the list view takes around 22 seconds -- ouch! I
agree with Dan Crevier -- we need Apple to expose a managed API. 
</p>
        <p align="center">
          <a href="http://blog.opennetcf.org/ncowburn/content/binary/iTunesSearch.PNG">
            <img src="http://blog.opennetcf.org/ncowburn/content/binary/iTunesSearchTmb.png" border="0" />
          </a>
          <br />
Click the image for a larger version
</p>
        <p>
I code I used to add the tracks to the list view is as follows:
</p>
        <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
          <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <p>
              <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">IITTrackCollection
searchResults <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> app.LibraryPlaylist.Search(<br />
    SearchCriteria.Text,<br />
    </span>
              <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">ITPlaylistSearchField.ITPlaylistSearchFieldAll<br />
);<br /></span>
            </p>
            <p>
if
</p>
          </span>( searchResults.Count &gt; 0 )<br />
{<br />
    listView1.BeginUpdate();<br />
    listView1.Items.Clear();<br /><br />
    <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">for</span>(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span> i=1;
i&lt;=searchResults.Count ; i++)<br />
    {<br />
        listView1.Items.Add(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> ListViewItem(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> []
{ <br />
                searchResults[i].Artist, <br />
                searchResults[i].Name, <br />
                searchResults[i].Album <br />
        } ));<br />
    }<br /><br />
    listView1.EndUpdate();    <br />
}</span>
        <p>
 
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=40169eab-a7bd-404b-8a65-8a9adc3a6313" />
      </body>
      <title>Automating iTunes on Windows: Playlist filtering/searching</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,40169eab-a7bd-404b-8a65-8a9adc3a6313.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2004/05/12/AutomatingITunesOnWindowsPlaylistFilteringsearching.aspx</link>
      <pubDate>Wed, 12 May 2004 11:51:27 GMT</pubDate>
      <description>&lt;p&gt;
If you've used iTunes, you'll know that the filtering/searching is fast. The grid
control that Apple uses is very performant, even with a few thousand tracks. However,
displaying the track info from the search results in a managed application is not. 
&lt;/p&gt;
&lt;p&gt;
In the screen grab below, iTunes Search is a C# application. As you can see, the search
was quick. iTunes filtered out 31 tracks from 2994 in just 10 milliseconds. However,
since we have to for-loop through the resulting IITTrackCollection, it took 180 milliseconds
to add the tracks to the list view. 
&lt;/p&gt;
&lt;p&gt;
Incidently, to add 2994 tracks to the list view takes around 22 seconds -- ouch! I
agree with Dan Crevier -- we need Apple to expose a managed API. 
&lt;/p&gt;
&lt;p align=center&gt;
&lt;a href="http://blog.opennetcf.org/ncowburn/content/binary/iTunesSearch.PNG"&gt;&lt;img src="http://blog.opennetcf.org/ncowburn/content/binary/iTunesSearchTmb.png" border=0&gt;&lt;/a&gt;
&lt;br&gt;
Click the image for a larger version
&lt;/p&gt;
&lt;p&gt;
I code I used to add the tracks to the list view is as follows:
&lt;/p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt; 
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;IITTrackCollection
searchResults &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; app.LibraryPlaylist.Search(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SearchCriteria.Text,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;ITPlaylistSearchField.ITPlaylistSearchFieldAll&lt;br&gt;
);&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
if
&lt;/span&gt;( searchResults.Count &amp;gt; 0 )&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listView1.BeginUpdate();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listView1.Items.Clear();&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;for&lt;/span&gt;(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; i=1;
i&amp;lt;=searchResults.Count ; i++)&lt;br&gt;
&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;listView1.Items.Add(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; ListViewItem(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; []
{&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;searchResults[i].Artist,&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;searchResults[i].Name,&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;searchResults[i].Album&amp;nbsp;&lt;br&gt;
&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;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listView1.EndUpdate();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
}&lt;/span&gt;&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=40169eab-a7bd-404b-8a65-8a9adc3a6313" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,40169eab-a7bd-404b-8a65-8a9adc3a6313.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=2f613755-1bc5-47ff-8fc6-6f7e595ce71e</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,2f613755-1bc5-47ff-8fc6-6f7e595ce71e.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,2f613755-1bc5-47ff-8fc6-6f7e595ce71e.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=2f613755-1bc5-47ff-8fc6-6f7e595ce71e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I seem to have a couple of spare copies of the <a href="http://www.google.com/url?sa=U&amp;start=1&amp;q=http://msdn.microsoft.com/vs2005/preview/default.aspx&amp;e=747">Visual
Studio 2005 Community Tech Preview</a>. If you would like a copy, drop me an email
at neilc[at]opennetcf.org and I'll sort something out to you. I've only got two spare
copies so it's first come, first served. 
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=2f613755-1bc5-47ff-8fc6-6f7e595ce71e" />
      </body>
      <title>Visual Studio 2005 Community Tech Preview</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,2f613755-1bc5-47ff-8fc6-6f7e595ce71e.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2004/05/10/VisualStudio2005CommunityTechPreview.aspx</link>
      <pubDate>Mon, 10 May 2004 17:04:49 GMT</pubDate>
      <description>&lt;p&gt;
I seem to have a couple of spare copies of the &lt;a href="http://www.google.com/url?sa=U&amp;amp;start=1&amp;amp;q=http://msdn.microsoft.com/vs2005/preview/default.aspx&amp;amp;e=747"&gt;Visual
Studio 2005 Community Tech Preview&lt;/a&gt;. If you would like a copy, drop me an email
at neilc[at]opennetcf.org and I'll sort something out to you. I've only got two spare
copies so it's first come, first served. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=2f613755-1bc5-47ff-8fc6-6f7e595ce71e" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,2f613755-1bc5-47ff-8fc6-6f7e595ce71e.aspx</comments>
      <category>.NET Compact Framework</category>
      <category>.NET Framework</category>
      <category>Whidbey</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=9ac96698-706f-4c6b-8b30-34bfad43550f</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,9ac96698-706f-4c6b-8b30-34bfad43550f.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,9ac96698-706f-4c6b-8b30-34bfad43550f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=9ac96698-706f-4c6b-8b30-34bfad43550f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
When you skip a track, or when one track ends and another begins, iTunes bubbles two
events: first, it fires the OnPlayerStopEvent followed by the OnPlayerPlayEvent when
the next track begins. 
</p>
        <p>
To receive a notification that a track has started, you can add an event handler to
your code as follows:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">[STAThread]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">static</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> Main(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span>[]
args)<br />
{<br />
    iTunesApp app <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> iTunesAppClass();<br />
    app.OnPlayerPlayEvent += <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> _IiTunesEvents_OnPlayerPlayEventEventHandler(app_OnPlayerPlayEvent);<br /><br />
    <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
Pause execution so we can trap the events</span><br />
    Console.ReadLine();<br />
}<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">private</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">static</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> app_OnPlayerPlayEvent(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">object</span> iTrack)<br />
{<br />
    IITTrack track <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> iTrack <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">as</span> IITTrack;<br />
    <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span>(track
!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>)<br />
        Console.WriteLine(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"{0}
- {1}"</span>,track.Artist, track.Name);<br />
}</span>
        </p>
        <p>
 
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=9ac96698-706f-4c6b-8b30-34bfad43550f" />
      </body>
      <title>Automating iTunes on Windows: Changed track event handling</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,9ac96698-706f-4c6b-8b30-34bfad43550f.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2004/05/09/AutomatingITunesOnWindowsChangedTrackEventHandling.aspx</link>
      <pubDate>Sun, 09 May 2004 11:04:48 GMT</pubDate>
      <description>&lt;p&gt;
When you skip a track, or when one track ends and another begins, iTunes bubbles two
events: first, it fires the OnPlayerStopEvent followed by the OnPlayerPlayEvent when
the next track begins. 
&lt;/p&gt;
&lt;p&gt;
To receive a notification that a track has started, you can add an event handler to
your code as follows:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;[STAThread]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; Main(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt;[]
args)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iTunesApp app &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; iTunesAppClass();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app.OnPlayerPlayEvent += &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; _IiTunesEvents_OnPlayerPlayEventEventHandler(app_OnPlayerPlayEvent);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
Pause execution so we can trap the events&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.ReadLine();&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; app_OnPlayerPlayEvent(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;object&lt;/span&gt; iTrack)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IITTrack track &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; iTrack &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;as&lt;/span&gt; IITTrack;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt;(track
!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"{0}
- {1}"&lt;/span&gt;,track.Artist, track.Name);&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=9ac96698-706f-4c6b-8b30-34bfad43550f" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,9ac96698-706f-4c6b-8b30-34bfad43550f.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=060fba6a-90a8-45ee-be38-19fbef8840fd</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,060fba6a-90a8-45ee-be38-19fbef8840fd.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,060fba6a-90a8-45ee-be38-19fbef8840fd.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=060fba6a-90a8-45ee-be38-19fbef8840fd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://blogs.msdn.com/dancre/">Dan Crevier</a> gives some useful information
on <a href="http://blogs.msdn.com/dancre/archive/2004/05/08/128645.aspx">how to automate
iTunes 4.5 in C#</a>. One of the features I want to use is to change between the playlists
I have set up. You can retrieve all the known playlists by using the very simple piece
of code shown below:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">iTunesApp
app <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> iTunesAppClass();<br /><br />
IITPlaylistCollection playlists <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> app.LibrarySource.Playlists;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">for</span>(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span> i=0;i&lt;playlists.Count;i++)<br />
{<br />
    Console.WriteLine(playlists[i+1].Name);<br />
}</span>
        </p>
        <p>
To play a particular playlist, you call the PlayFirstTrack() method on a particular
playlist:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">app.LibrarySource.Playlists[3].PlayFirstTrack();</span>
        </p>
        <p>
Remember that all arrays in the iTunes type library are 1-based arrays. 
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=060fba6a-90a8-45ee-be38-19fbef8840fd" />
      </body>
      <title>Automating iTunes on Windows: Retrieving Playlists</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,060fba6a-90a8-45ee-be38-19fbef8840fd.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2004/05/09/AutomatingITunesOnWindowsRetrievingPlaylists.aspx</link>
      <pubDate>Sun, 09 May 2004 10:02:39 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://blogs.msdn.com/dancre/"&gt;Dan Crevier&lt;/a&gt; gives some useful information
on &lt;a href="http://blogs.msdn.com/dancre/archive/2004/05/08/128645.aspx"&gt;how to automate
iTunes 4.5 in C#&lt;/a&gt;. One of the features I want to use is to change between the playlists
I have set up. You can retrieve all the known playlists by using the very simple piece
of code shown below:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;iTunesApp
app &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; iTunesAppClass();&lt;br&gt;
&lt;br&gt;
IITPlaylistCollection playlists &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; app.LibrarySource.Playlists;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;for&lt;/span&gt;(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; i=0;i&amp;lt;playlists.Count;i++)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(playlists[i+1].Name);&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
To play a particular playlist, you call the PlayFirstTrack() method on a particular
playlist:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;app.LibrarySource.Playlists[3].PlayFirstTrack();&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Remember that all arrays in the iTunes type library are 1-based arrays. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=060fba6a-90a8-45ee-be38-19fbef8840fd" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,060fba6a-90a8-45ee-be38-19fbef8840fd.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=52a30fdb-bc63-4cbf-9783-a1014eb5d11f</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,52a30fdb-bc63-4cbf-9783-a1014eb5d11f.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,52a30fdb-bc63-4cbf-9783-a1014eb5d11f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=52a30fdb-bc63-4cbf-9783-a1014eb5d11f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
As ChrisTacke mentions, a few of the folks from <a href="http://www.opennetcf.org/">OpenNETCF.org</a> are
going into the <a href="/ctacke/PermaLink.aspx/0841e532-95da-4915-ac5a-32bb32bcf26b">consulting
business</a>. We're just working on getting the web site up and running over at <a href="http://www.opennetcf.com/CategoryView.aspx?category=Home">OpenNETCF.com</a>,
so it's pretty spare right now. 
</p>
        <p>
Need help architecting or implementing a .NET-enabled Mobile solution? Need advice
on design or just help writing code?  We are looking for possible contract work
for our upcoming DCS branch.  If you would like more information or you have
a specific project in mind, feel free to <a href="mailto:dcs@opennetcf.org">contact
us</a>.
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=52a30fdb-bc63-4cbf-9783-a1014eb5d11f" />
      </body>
      <title>OpenNETCF Consulting, LLC</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,52a30fdb-bc63-4cbf-9783-a1014eb5d11f.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2004/05/08/OpenNETCFConsultingLLC.aspx</link>
      <pubDate>Sat, 08 May 2004 10:16:55 GMT</pubDate>
      <description>&lt;p&gt;
As ChrisTacke mentions,&amp;nbsp;a few of the folks from &lt;a href="http://www.opennetcf.org/"&gt;OpenNETCF.org&lt;/a&gt;&amp;nbsp;are
going into the &lt;a href="/ctacke/PermaLink.aspx/0841e532-95da-4915-ac5a-32bb32bcf26b"&gt;consulting
business&lt;/a&gt;. We're just working on getting the web site up and running over at &lt;a href="http://www.opennetcf.com/CategoryView.aspx?category=Home"&gt;OpenNETCF.com&lt;/a&gt;,
so it's pretty spare right now. 
&lt;/p&gt;
&lt;p&gt;
Need help architecting or implementing a .NET-enabled Mobile solution? Need advice
on design or just help writing code?&amp;nbsp; We are looking for possible contract work
for our upcoming DCS branch.&amp;nbsp; If you would like more information or you have
a specific project in mind, feel free to &lt;a href="mailto:dcs@opennetcf.org"&gt;contact
us&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=52a30fdb-bc63-4cbf-9783-a1014eb5d11f" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,52a30fdb-bc63-4cbf-9783-a1014eb5d11f.aspx</comments>
      <category>.NET Compact Framework</category>
      <category>.NET Framework</category>
      <category>Mobility/Embedded</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=d96019dc-a0b1-4193-b7f1-dc337cbb2f7f</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,d96019dc-a0b1-4193-b7f1-dc337cbb2f7f.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,d96019dc-a0b1-4193-b7f1-dc337cbb2f7f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=d96019dc-a0b1-4193-b7f1-dc337cbb2f7f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
Here's definitive proof that I should not be allowed anywhere near a UI:
</p>
        <p>
          <img src="/ncowburn/content/binary/UI_vs_AppLogic.png" border="0" />
        </p>
        <p>
This is taken from the online <i>Developing Enterprise Windows®-based Applications
with .NET: Rich Client--Visual C#® .NET </i><a href="http://www.microsoft.com/learning/assessment/">Skills
Assessment</a> from <a href="http://www.microsoft.com/learning/">MS Learning</a>.
(The green arrows indicate the average scores for the assessment.) 
</p>
        <p>
Now you know why I enjoy working with <a href="http://www.opennetcf.org/">OpenNETCF.org</a> so
much :)
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=d96019dc-a0b1-4193-b7f1-dc337cbb2f7f" />
      </body>
      <title>I'm not a UI developer and I have proof!</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,d96019dc-a0b1-4193-b7f1-dc337cbb2f7f.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2004/04/28/ImNotAUIDeveloperAndIHaveProof.aspx</link>
      <pubDate>Wed, 28 Apr 2004 10:58:44 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Here's definitive proof that I should not be allowed anywhere near a UI:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="/ncowburn/content/binary/UI_vs_AppLogic.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
This is taken from the online &lt;i&gt;Developing Enterprise Windows&amp;#174;-based Applications
with .NET: Rich Client--Visual C#&amp;#174; .NET &lt;/i&gt;&lt;a href="http://www.microsoft.com/learning/assessment/"&gt;Skills
Assessment&lt;/a&gt; from &lt;a href="http://www.microsoft.com/learning/"&gt;MS Learning&lt;/a&gt;.
(The green arrows indicate the average scores for the assessment.) 
&lt;p&gt;
Now you know why I enjoy working with &lt;a href="http://www.opennetcf.org/"&gt;OpenNETCF.org&lt;/a&gt; so
much :)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=d96019dc-a0b1-4193-b7f1-dc337cbb2f7f" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,d96019dc-a0b1-4193-b7f1-dc337cbb2f7f.aspx</comments>
      <category>.NET Compact Framework</category>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=7b5a5ba1-68f0-4880-bb88-43e91d2c3cc0</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,7b5a5ba1-68f0-4880-bb88-43e91d2c3cc0.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,7b5a5ba1-68f0-4880-bb88-43e91d2c3cc0.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=7b5a5ba1-68f0-4880-bb88-43e91d2c3cc0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last week, I got a copy of <a href="http://blogs.msdn.com/brada">Brad Abram's</a><a href="http://www.amazon.com/exec/obidos/tg/detail/-/0321154894/qid=1082392861/sr=8-1/ref=sr_8_xs_ap_i1_xgl14/002-4802875-4373630?v=glance&amp;s=books&amp;n=507846">.NET
Framework Standard Library Annortated Reference</a> from <a href="http://www.compman.co.uk/">Computer
Manuals</a>. This is a "must have" book for anyone who wants to learn more about class
library design. I've not finished reading it yet, but I highly recommend it. Oh, guess
what? The book even identifies which methods are available in the .NET Compact Framework.
Sweeeeet. 
</p>
        <p>
I also got <a href="http://www.amazon.com/exec/obidos/tg/detail/-/0735619131/104-4611558-1950368?v=glance">Understanding
Web Service Specifications and WSE</a> by <a href="http://www.webbish6.com/">Jeannine
Hall Gailey</a>. This looks like another good read. I'll let you know when I'm through
with it. I'm sure it's going to help with some plans I have. 
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=7b5a5ba1-68f0-4880-bb88-43e91d2c3cc0" />
      </body>
      <title>.NET Framework Standard Library Annotated Reference and Understanding Web Service Specifications and WSE</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,7b5a5ba1-68f0-4880-bb88-43e91d2c3cc0.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2004/04/21/NETFrameworkStandardLibraryAnnotatedReferenceAndUnderstandingWebServiceSpecificationsAndWSE.aspx</link>
      <pubDate>Wed, 21 Apr 2004 00:20:08 GMT</pubDate>
      <description>&lt;p&gt;
Last week, I got a copy of &lt;a href="http://blogs.msdn.com/brada"&gt;Brad Abram's&lt;/a&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0321154894/qid=1082392861/sr=8-1/ref=sr_8_xs_ap_i1_xgl14/002-4802875-4373630?v=glance&amp;amp;s=books&amp;amp;n=507846"&gt;.NET
Framework Standard Library Annortated Reference&lt;/a&gt;&amp;nbsp;from &lt;a href="http://www.compman.co.uk/"&gt;Computer
Manuals&lt;/a&gt;. This is a "must have" book for anyone who wants to learn more about class
library design. I've not finished reading it yet, but I highly recommend it. Oh, guess
what? The book even identifies which methods are available in the .NET Compact Framework.
Sweeeeet. 
&lt;/p&gt;
&lt;p&gt;
I also got &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0735619131/104-4611558-1950368?v=glance"&gt;Understanding
Web Service&amp;nbsp;Specifications and WSE&lt;/a&gt;&amp;nbsp;by &lt;a href="http://www.webbish6.com/"&gt;Jeannine
Hall Gailey&lt;/a&gt;. This looks like another good read. I'll let you know when I'm through
with it. I'm sure it's going to help with some plans I have. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=7b5a5ba1-68f0-4880-bb88-43e91d2c3cc0" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,7b5a5ba1-68f0-4880-bb88-43e91d2c3cc0.aspx</comments>
      <category>.NET Compact Framework</category>
      <category>.NET Framework</category>
      <category>Web services</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=c37f77f7-8633-4dc9-8761-5ec48420a48f</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,c37f77f7-8633-4dc9-8761-5ec48420a48f.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,c37f77f7-8633-4dc9-8761-5ec48420a48f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=c37f77f7-8633-4dc9-8761-5ec48420a48f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Somedays you come across a site that *totally* makes your day. This is one of those
days. Check out the <a href="http://wince-port.sscli.net/">SSCLI for Windows CE port</a>! 
</p>
        <p>
        </p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=c37f77f7-8633-4dc9-8761-5ec48420a48f" />
      </body>
      <title>SSCLI for Windows CE</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,c37f77f7-8633-4dc9-8761-5ec48420a48f.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2004/01/08/SSCLIForWindowsCE.aspx</link>
      <pubDate>Thu, 08 Jan 2004 00:11:11 GMT</pubDate>
      <description>&lt;p&gt;
Somedays you come across a site that *totally* makes your day. This is one of those
days. Check out the &lt;a href="http://wince-port.sscli.net/"&gt;SSCLI for Windows CE port&lt;/a&gt;! 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=c37f77f7-8633-4dc9-8761-5ec48420a48f" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,c37f77f7-8633-4dc9-8761-5ec48420a48f.aspx</comments>
      <category>.NET Framework</category>
      <category>Mobility/Embedded</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=b071eb77-ae38-41d7-b032-168fe995cbc5</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,b071eb77-ae38-41d7-b032-168fe995cbc5.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,b071eb77-ae38-41d7-b032-168fe995cbc5.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=b071eb77-ae38-41d7-b032-168fe995cbc5</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I suffer from "knowledge gluttony". By that I mean I am constantly trying to learn
new stuff. One of the things I'm trying to understand better is how the garbage collector
works in the .NET Framework. One interesting article I read is titled "<a href="http://lieber.www.media.mit.edu/people/lieber/Lieberary/GC/Realtime/Realtime.html">A
Real-Time Garbage Collector Based on the Lifetimes of Objects</a>". The article describes
a heap storage framework that makes storage of short-lived objects a lot less expensive
that longer-lived objects. This sounds similar to what the .NET Framework uses. The
.NET Compact Framework, if my supposition is correct, uses a much simpler <a href="http://www.memorymanagement.org/glossary/m.html#mark-sweep">mark-sweep</a> garbage
collector, rather than the <a href="http://www.memorymanagement.org/glossary/g.html#generational.garbage.collection">generational
garbage collector</a> described in the article. If I'm wrong, please correct me. 
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=b071eb77-ae38-41d7-b032-168fe995cbc5" />
      </body>
      <title>Garbage Collection</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,b071eb77-ae38-41d7-b032-168fe995cbc5.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2004/01/07/GarbageCollection.aspx</link>
      <pubDate>Wed, 07 Jan 2004 17:11:18 GMT</pubDate>
      <description>&lt;p&gt;
I suffer from "knowledge gluttony". By that I mean I am constantly trying to learn
new stuff. One of the things I'm trying to understand better is how the garbage collector
works in the .NET Framework. One interesting article I read is titled "&lt;a href="http://lieber.www.media.mit.edu/people/lieber/Lieberary/GC/Realtime/Realtime.html"&gt;A
Real-Time Garbage Collector Based on the Lifetimes of Objects&lt;/a&gt;". The article describes
a heap storage framework that makes storage of short-lived objects a lot less expensive
that longer-lived objects. This sounds similar to what the .NET Framework uses. The
.NET Compact Framework, if my supposition is correct, uses a much simpler &lt;a href="http://www.memorymanagement.org/glossary/m.html#mark-sweep"&gt;mark-sweep&lt;/a&gt; garbage
collector, rather than the &lt;a href="http://www.memorymanagement.org/glossary/g.html#generational.garbage.collection"&gt;generational
garbage collector&lt;/a&gt; described in the article. If I'm wrong, please correct me. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=b071eb77-ae38-41d7-b032-168fe995cbc5" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,b071eb77-ae38-41d7-b032-168fe995cbc5.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=49dff3ec-f395-4bf3-99df-a98988ba5b0f</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,49dff3ec-f395-4bf3-99df-a98988ba5b0f.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,49dff3ec-f395-4bf3-99df-a98988ba5b0f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=49dff3ec-f395-4bf3-99df-a98988ba5b0f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <body xmlns="http://www.w3.org/1999/xhtml">
          <p>
I was browsing through the .NET books at <a href="http://www.compman.co.uk/">Computer
Manuals</a> when I came an upcoming useful nugget titled <span class="bbt2"><a href="http://www.apress.com/book/bookDisplay.html?bID=279">Developing
an Application Framework in .NET</a>. Looks like a very interesting read. It's on
my wishlist. </span></p>
          <p>
  
</p>
          <p>
            <a href="http://www.apress.com/book/bookDisplay.html?bID=279">
            </a>  
</p>
        </body>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=49dff3ec-f395-4bf3-99df-a98988ba5b0f" />
      </body>
      <title>Book: Developing an Application Framework in .NET </title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,49dff3ec-f395-4bf3-99df-a98988ba5b0f.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2004/01/06/BookDevelopingAnApplicationFrameworkInNET.aspx</link>
      <pubDate>Tue, 06 Jan 2004 21:41:44 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;
I was browsing through the .NET books at &lt;a href="http://www.compman.co.uk/"&gt;Computer
Manuals&lt;/a&gt; when I came an upcoming useful nugget titled &lt;span class="bbt2"&gt;&lt;a href="http://www.apress.com/book/bookDisplay.html?bID=279"&gt;Developing
an Application Framework in .NET&lt;/a&gt;. Looks like a very interesting read. It's on
my wishlist. &lt;/span&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.apress.com/book/bookDisplay.html?bID=279"&gt;&lt;/a&gt;&amp;#160; 
&lt;/p&gt;
&lt;/body&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=49dff3ec-f395-4bf3-99df-a98988ba5b0f" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,49dff3ec-f395-4bf3-99df-a98988ba5b0f.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=45ac57bc-3c8a-4f72-85a5-a81abdb51a6f</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,45ac57bc-3c8a-4f72-85a5-a81abdb51a6f.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,45ac57bc-3c8a-4f72-85a5-a81abdb51a6f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=45ac57bc-3c8a-4f72-85a5-a81abdb51a6f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <body xmlns="http://www.w3.org/1999/xhtml">
          <p>
            <a href="http://www.furrygoat.com/">Steve</a> asks: "<a href="http://www.furrygoat.com/archives/000752.html">Are
Web Services Immutable?</a>" 
</p>
          <p>
In his post, Steve points to <a href="http://radio.weblogs.com/0108971/stories/2002/07/23/stayingSaneInAnXmlWebServicesWorld.html">Clemens
Vaster</a>'s thoughts on this. Clemens sums up with a set of guidelines for developing
ASP.NET Web Services:  
</p>
          <ol>
            <li>
1. Use the [WebService(<strong>Namespace</strong>="http://myserver/myservice/myInterface/2002/07/23")]
attribute on your WebService class. <strong>Always. </strong></li>
            <li>
If you add, remove a [WebMethod] or change any of your [WebMethod]s signatures or <strong>any
of the types used directly or indirectly</strong> in any of those signatures, <strong>change
the namespace!</strong></li>
            <li>
If you happen to return or accept typed .NET DataSets and the DataSet schema changes,
change the DataSet namespace and for the Web Service <strong>change the namespace!</strong></li>
            <li>
If you wonder how you can support "legacy clients" with all these namespace changes
and all the resulting incompatible WSDLs, you may just have found a good reason why
people say that the backend implementation doesn't belong into the web method, but
into a backend component. Like XML Schema and WSDL, <strong>Web Service implementations</strong><strong>don't
know versions</strong>, backend components do.</li>
            <li>
Every time you change the namespace, you must create a new Web Service endpoint (.asmx)
for the new namespace, if you at all worry about backwards compatibility for the clients
that could still talk to you yesterday.</li>
          </ol>
          <p>
Take note. This is going to become a really important issue as we move towards a more
Service Oriented Architecture for loosely coupled applications. 
</p>
        </body>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=45ac57bc-3c8a-4f72-85a5-a81abdb51a6f" />
      </body>
      <title>Web Service immutability</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,45ac57bc-3c8a-4f72-85a5-a81abdb51a6f.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/11/10/WebServiceImmutability.aspx</link>
      <pubDate>Mon, 10 Nov 2003 17:27:12 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;
&lt;a href="http://www.furrygoat.com/"&gt;Steve&lt;/a&gt; asks: "&lt;a href="http://www.furrygoat.com/archives/000752.html"&gt;Are
Web Services Immutable?&lt;/a&gt;" 
&lt;/p&gt;
&lt;p&gt;
In his post, Steve points to &lt;a href="http://radio.weblogs.com/0108971/stories/2002/07/23/stayingSaneInAnXmlWebServicesWorld.html"&gt;Clemens
Vaster&lt;/a&gt;'s thoughts on this. Clemens sums up with a set of guidelines for developing
ASP.NET Web Services:&amp;#160; 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
1. Use the [WebService(&lt;strong&gt;Namespace&lt;/strong&gt;="http://myserver/myservice/myInterface/2002/07/23")]
attribute on your WebService class.&amp;#160;&lt;strong&gt;Always.&amp;#160;&lt;/strong&gt; 
&lt;/li&gt;
&lt;li&gt;
If you add, remove a [WebMethod] or change any of your [WebMethod]s signatures or &lt;strong&gt;any
of the types used directly or indirectly&lt;/strong&gt; in any of those signatures, &lt;strong&gt;change
the namespace!&lt;/strong&gt; 
&lt;/li&gt;
&lt;li&gt;
If you happen to return or accept typed .NET DataSets and the DataSet schema changes,
change the DataSet namespace and for the Web Service &lt;strong&gt;change the namespace!&lt;/strong&gt; 
&lt;/li&gt;
&lt;li&gt;
If you wonder how you can support "legacy clients" with all these namespace changes
and all the resulting incompatible WSDLs, you may just have found a good reason why
people say that the backend implementation doesn't belong into the web method, but
into a backend component. Like XML Schema and WSDL, &lt;strong&gt;Web Service implementations&lt;/strong&gt; &lt;strong&gt;don't
know versions&lt;/strong&gt;, backend components do.&lt;/li&gt;
&lt;li&gt;
Every time you change the namespace, you must create a new Web Service endpoint (.asmx)
for the new namespace, if you at all worry about backwards compatibility for the clients
that could still talk to you yesterday.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Take note. This is going to become a really important issue as we move towards a more
Service Oriented Architecture for loosely coupled applications. 
&lt;/p&gt;
&lt;/body&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=45ac57bc-3c8a-4f72-85a5-a81abdb51a6f" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,45ac57bc-3c8a-4f72-85a5-a81abdb51a6f.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=5a30adf4-1659-4dd0-93b9-beb20bc5067f</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,5a30adf4-1659-4dd0-93b9-beb20bc5067f.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,5a30adf4-1659-4dd0-93b9-beb20bc5067f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=5a30adf4-1659-4dd0-93b9-beb20bc5067f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">The next time you think about bagging Microsoft
for not fixing a bug in any product, go read Joe Bork's <a href="http://headblender.com/joe/blog/archives/microsoft/001280.html">anatomy
of a bug</a> and then redirect your negative energies to something more worthwhile. <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=5a30adf4-1659-4dd0-93b9-beb20bc5067f" /></body>
      <title>Anatomy of a Bug... a tester's point of view</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,5a30adf4-1659-4dd0-93b9-beb20bc5067f.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/10/28/AnatomyOfABugATestersPointOfView.aspx</link>
      <pubDate>Tue, 28 Oct 2003 05:21:18 GMT</pubDate>
      <description>The next time you think about bagging Microsoft for not fixing a bug in any product, go read Joe Bork's &lt;a href="http://headblender.com/joe/blog/archives/microsoft/001280.html"&gt;anatomy
of a bug&lt;/a&gt; and then redirect your negative energies to something more worthwhile. &lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=5a30adf4-1659-4dd0-93b9-beb20bc5067f" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,5a30adf4-1659-4dd0-93b9-beb20bc5067f.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=72104389-ccb7-4225-a766-c181eb3d1b85</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,72104389-ccb7-4225-a766-c181eb3d1b85.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,72104389-ccb7-4225-a766-c181eb3d1b85.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=72104389-ccb7-4225-a766-c181eb3d1b85</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <body xmlns="http://www.w3.org/1999/xhtml">
          <p>
Doug Reilly, at the PDC, offers a <a href="http://weblogs.asp.net/dreilly/archive/10262003.aspx">cool
tip he learnt from the CLR Internals session</a>. This is really one kick-ass tip!
I'll definitely be using this one in fture. 
</p>
          <p>
[via <a href="http://radio.weblogs.com/0001011/">Scoble</a>] 
</p>
        </body>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=72104389-ccb7-4225-a766-c181eb3d1b85" />
      </body>
      <title>Killer CLR tip</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,72104389-ccb7-4225-a766-c181eb3d1b85.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/10/27/KillerCLRTip.aspx</link>
      <pubDate>Mon, 27 Oct 2003 00:39:00 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;
Doug Reilly, at the PDC, offers a &lt;a href="http://weblogs.asp.net/dreilly/archive/10262003.aspx"&gt;cool
tip he learnt from the CLR Internals session&lt;/a&gt;. This is really one kick-ass tip!
I'll definitely be using this one in fture. 
&lt;/p&gt;
&lt;p&gt;
[via &lt;a href="http://radio.weblogs.com/0001011/"&gt;Scoble&lt;/a&gt;] 
&lt;/p&gt;
&lt;/body&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=72104389-ccb7-4225-a766-c181eb3d1b85" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,72104389-ccb7-4225-a766-c181eb3d1b85.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=035bb4eb-26c9-437b-8e80-c4c25812b3aa</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,035bb4eb-26c9-437b-8e80-c4c25812b3aa.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,035bb4eb-26c9-437b-8e80-c4c25812b3aa.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=035bb4eb-26c9-437b-8e80-c4c25812b3aa</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">I just received an email from <a href="http://blogs.gotdotnet.com/ericgu/">Eric
Gunnerson</a> with details of the <a href="http://msdn.microsoft.com/vcsharp/language">C#
2.0 Language Spec</a>. Also, there's now a <a href="http://www.gotdotnet.com/Community/MessageBoard/MessageBoard.aspx?ID=5627">message
board at GotDotNet</a> for discussing the C# language! Fantastic!<img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=035bb4eb-26c9-437b-8e80-c4c25812b3aa" /></body>
      <title>C# 2.0 Language Spec Released</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,035bb4eb-26c9-437b-8e80-c4c25812b3aa.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/10/24/C20LanguageSpecReleased.aspx</link>
      <pubDate>Fri, 24 Oct 2003 14:59:22 GMT</pubDate>
      <description>I just received an email from &lt;a href="http://blogs.gotdotnet.com/ericgu/"&gt;Eric Gunnerson&lt;/a&gt; with
details of the &lt;a href="http://msdn.microsoft.com/vcsharp/language"&gt;C# 2.0 Language
Spec&lt;/a&gt;. Also, there's now a &lt;a href="http://www.gotdotnet.com/Community/MessageBoard/MessageBoard.aspx?ID=5627"&gt;message
board at GotDotNet&lt;/a&gt; for discussing the C# language! Fantastic!&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=035bb4eb-26c9-437b-8e80-c4c25812b3aa" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,035bb4eb-26c9-437b-8e80-c4c25812b3aa.aspx</comments>
      <category>.NET Framework</category>
      <category>Whidbey</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=e4071f0a-fce9-44aa-a154-740c729a6c6d</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,e4071f0a-fce9-44aa-a154-740c729a6c6d.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,e4071f0a-fce9-44aa-a154-740c729a6c6d.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=e4071f0a-fce9-44aa-a154-740c729a6c6d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Another whitepaper goes live at Intel Developer Services. This one is about using
custom SOAP headers to hold authentication credentials (securely). 
</p>
        <p>
Link: Intel Developer Services: <a href="http://cedar.intel.com/cgi-bin/ids.dll/content/content.jsp?cntKey=Generic%20Editorial::mobile_custSOAP&amp;cntType=IDS_EDITORIAL&amp;catCode=CAB">Using
Custom SOAP Headers to Authenticate Web Service Access</a></p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=e4071f0a-fce9-44aa-a154-740c729a6c6d" />
      </body>
      <title>Intel: Using Custom SOAP Headers to Authenticate Web Service Access</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,e4071f0a-fce9-44aa-a154-740c729a6c6d.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/09/19/IntelUsingCustomSOAPHeadersToAuthenticateWebServiceAccess.aspx</link>
      <pubDate>Fri, 19 Sep 2003 10:41:20 GMT</pubDate>
      <description>&lt;p&gt;
Another whitepaper goes live at Intel Developer Services. This one is about using
custom SOAP headers to hold authentication credentials (securely). 
&lt;/p&gt;
&lt;p&gt;
Link: Intel Developer Services: &lt;a href="http://cedar.intel.com/cgi-bin/ids.dll/content/content.jsp?cntKey=Generic%20Editorial::mobile_custSOAP&amp;amp;cntType=IDS_EDITORIAL&amp;amp;catCode=CAB"&gt;Using
Custom SOAP Headers to Authenticate Web Service Access&lt;/a&gt; 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=e4071f0a-fce9-44aa-a154-740c729a6c6d" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,e4071f0a-fce9-44aa-a154-740c729a6c6d.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=5a6cd464-8c6d-4038-b968-f8d8d0f3fce7</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,5a6cd464-8c6d-4038-b968-f8d8d0f3fce7.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,5a6cd464-8c6d-4038-b968-f8d8d0f3fce7.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=5a6cd464-8c6d-4038-b968-f8d8d0f3fce7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://developer.intel.com/">Intel Developer Services</a> have posted
another web-based training module I wrote about a month or so ago. This module focuses
on using the Data Protection APIs, new to Windows XP and Windows Server 2003, to protect
authentication credentials for Web services, database connections, etc. It is also
a good starting point for advanced P/Invoke and manual marshaling. 
</p>
        <p>
Link: <a href="http://www.intel.com/software/products/college/PAC/">Intel Developer
Services: Protecting Authentication Credentials</a>. 
</p>
        <p>
        </p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=5a6cd464-8c6d-4038-b968-f8d8d0f3fce7" />
      </body>
      <title>Intel: Protecting Authentication Credentials</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,5a6cd464-8c6d-4038-b968-f8d8d0f3fce7.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/09/19/IntelProtectingAuthenticationCredentials.aspx</link>
      <pubDate>Fri, 19 Sep 2003 10:37:59 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://developer.intel.com/"&gt;Intel Developer Services&lt;/a&gt;&amp;nbsp;have posted
another web-based training module I wrote about a month or so ago. This module focuses
on using the Data Protection APIs, new to Windows XP and Windows Server 2003, to protect
authentication credentials for Web services, database connections, etc. It is also
a good starting point for advanced P/Invoke and manual marshaling. 
&lt;/p&gt;
&lt;p&gt;
Link: &lt;a href="http://www.intel.com/software/products/college/PAC/"&gt;Intel Developer
Services: Protecting Authentication Credentials&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=5a6cd464-8c6d-4038-b968-f8d8d0f3fce7" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,5a6cd464-8c6d-4038-b968-f8d8d0f3fce7.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=a7d3e037-9fd4-4684-8adf-8ed852658dfd</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,a7d3e037-9fd4-4684-8adf-8ed852658dfd.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,a7d3e037-9fd4-4684-8adf-8ed852658dfd.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=a7d3e037-9fd4-4684-8adf-8ed852658dfd</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I'm doing some research into parsing technologies and I'm coming up empty with my
Googling. Has anyone go any pointers to info on developing parsing technologies in
C#? Most of the stuff I find is about writing a compiler in C# that will produce C#...
I want to be able to parse a SQL string, if that helps. 
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=a7d3e037-9fd4-4684-8adf-8ed852658dfd" />
      </body>
      <title>Lexers, Parsers, Tokenizers</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,a7d3e037-9fd4-4684-8adf-8ed852658dfd.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/09/19/LexersParsersTokenizers.aspx</link>
      <pubDate>Fri, 19 Sep 2003 09:42:44 GMT</pubDate>
      <description>&lt;p&gt;
I'm doing some research into parsing technologies and I'm coming up empty with my
Googling. Has anyone go any pointers to info on developing parsing technologies in
C#? Most of the stuff I find is about writing a compiler in C# that will produce C#...
I want to be able to parse a SQL string, if that helps. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=a7d3e037-9fd4-4684-8adf-8ed852658dfd" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,a7d3e037-9fd4-4684-8adf-8ed852658dfd.aspx</comments>
      <category>.NET Framework</category>
      <category>Whidbey</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=b55bd4a1-3e7f-47d8-a288-e488e5dca9c4</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,b55bd4a1-3e7f-47d8-a288-e488e5dca9c4.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,b55bd4a1-3e7f-47d8-a288-e488e5dca9c4.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=b55bd4a1-3e7f-47d8-a288-e488e5dca9c4</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <body xmlns="http://www.w3.org/1999/xhtml">
Note to <a href="http://www.microsoft.com/">Microsoft</a>: I get a lot <a href="http://www.google.com/">Google</a> hits
looking for <a href="http://blog.opennetcf.org/ncowburn/PermaLink.aspx/c46f3a9c-2d51-4171-8cf3-a9886df69ba6">Julian
calendar conversions</a>. 
</body>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=b55bd4a1-3e7f-47d8-a288-e488e5dca9c4" />
      </body>
      <title>Julian Date Conversions</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,b55bd4a1-3e7f-47d8-a288-e488e5dca9c4.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/09/09/JulianDateConversions.aspx</link>
      <pubDate>Tue, 09 Sep 2003 18:07:41 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;
Note to &lt;a href="http://www.microsoft.com/"&gt;Microsoft&lt;/a&gt;: I get a lot &lt;a href="http://www.google.com/"&gt;Google&lt;/a&gt; hits
looking for &lt;a href="http://blog.opennetcf.org/ncowburn/PermaLink.aspx/c46f3a9c-2d51-4171-8cf3-a9886df69ba6"&gt;Julian
calendar conversions&lt;/a&gt;. 
&lt;/body&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=b55bd4a1-3e7f-47d8-a288-e488e5dca9c4" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,b55bd4a1-3e7f-47d8-a288-e488e5dca9c4.aspx</comments>
      <category>.NET Framework</category>
      <category>Whidbey</category>
      <category>.NET Compact Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=fcc336a2-6a15-4da7-89d5-e617f3b92db0</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,fcc336a2-6a15-4da7-89d5-e617f3b92db0.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,fcc336a2-6a15-4da7-89d5-e617f3b92db0.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=fcc336a2-6a15-4da7-89d5-e617f3b92db0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <body xmlns="http://www.w3.org/1999/xhtml">
          <p>
Right now I'm surfing through the pages over at <a href="http://www.msdn.com/">MSDN</a> and
the <a href="http://msdn.microsoft.com/netframework/">.NET Developer Center</a>, and
something has struck me: the .NET Compact Framework is FAR removed from anything .NET
at MSDN. You go look through the .NET stuff and see how easy (or not) it is to find
.NET Compact Framework information. Can't find it? Try looking under <a href="http://msdn.microsoft.com/vstudio/device/compact.aspx">Visual
Studio</a>! 
</p>
          <p align="center">
            <strong>WHY, OH, WHY is it like this?</strong>
          </p>
          <p>
  
</p>
        </body>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=fcc336a2-6a15-4da7-89d5-e617f3b92db0" />
      </body>
      <title>Why is it so?</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,fcc336a2-6a15-4da7-89d5-e617f3b92db0.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/08/20/WhyIsItSo.aspx</link>
      <pubDate>Wed, 20 Aug 2003 02:51:34 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;
Right now I'm surfing through the pages over at &lt;a href="http://www.msdn.com/"&gt;MSDN&lt;/a&gt; and
the &lt;a href="http://msdn.microsoft.com/netframework/"&gt;.NET Developer Center&lt;/a&gt;, and
something has struck me: the .NET Compact Framework is FAR removed from anything .NET
at MSDN. You go look through the .NET stuff and see how easy (or not) it is to find
.NET Compact Framework information. Can't find it? Try looking under &lt;a href="http://msdn.microsoft.com/vstudio/device/compact.aspx"&gt;Visual
Studio&lt;/a&gt;! 
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;strong&gt;WHY, OH, WHY is it like this?&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; 
&lt;/p&gt;
&lt;/body&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=fcc336a2-6a15-4da7-89d5-e617f3b92db0" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,fcc336a2-6a15-4da7-89d5-e617f3b92db0.aspx</comments>
      <category>.NET Framework</category>
      <category>.NET Compact Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=8387e9e6-cd83-4bbc-b5bb-78e7cae8d0c8</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,8387e9e6-cd83-4bbc-b5bb-78e7cae8d0c8.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,8387e9e6-cd83-4bbc-b5bb-78e7cae8d0c8.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=8387e9e6-cd83-4bbc-b5bb-78e7cae8d0c8</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">One of the features that has been announced
for Whidbey that VB developers will be happy about is the return of edit &amp; continue. <a href="http://www.panopticoncentral.net/PermaLink.aspx/43148516-89bc-4574-a190-4749b7ba31f9">Paul
Vicks</a> talks at length about the need for edit &amp; continue. <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=8387e9e6-cd83-4bbc-b5bb-78e7cae8d0c8" /></body>
      <title>Edit and Continue returns...</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,8387e9e6-cd83-4bbc-b5bb-78e7cae8d0c8.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/08/01/EditAndContinueReturns.aspx</link>
      <pubDate>Fri, 01 Aug 2003 09:04:30 GMT</pubDate>
      <description>One of the features that has been announced for Whidbey that VB developers will be happy about is the return of edit &amp;amp; continue. &lt;a href="http://www.panopticoncentral.net/PermaLink.aspx/43148516-89bc-4574-a190-4749b7ba31f9"&gt;Paul
Vicks&lt;/a&gt; talks at length about the need for edit &amp;amp; continue. &lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=8387e9e6-cd83-4bbc-b5bb-78e7cae8d0c8" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,8387e9e6-cd83-4bbc-b5bb-78e7cae8d0c8.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=3576622f-4048-4f00-a708-d9cb41d2d4fb</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,3576622f-4048-4f00-a708-d9cb41d2d4fb.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,3576622f-4048-4f00-a708-d9cb41d2d4fb.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=3576622f-4048-4f00-a708-d9cb41d2d4fb</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <a href="http://radio.weblogs.com/0117167/">Chris
Sells</a> gives us all <a href="http://radio.weblogs.com/0117167/2003/07/29.html#a403">good
news</a> -- Microsoft has issued the<a href="http://msdn.microsoft.com/vstudio/productinfo/roadmap.aspx"> roadmap
for Visual Studio .NET</a>! <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=3576622f-4048-4f00-a708-d9cb41d2d4fb" /></body>
      <title>Official word on Whidbey and Orcas</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,3576622f-4048-4f00-a708-d9cb41d2d4fb.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/07/30/OfficialWordOnWhidbeyAndOrcas.aspx</link>
      <pubDate>Wed, 30 Jul 2003 21:16:23 GMT</pubDate>
      <description>&lt;a href="http://radio.weblogs.com/0117167/"&gt;Chris Sells&lt;/a&gt; gives us all &lt;a href="http://radio.weblogs.com/0117167/2003/07/29.html#a403"&gt;good
news&lt;/a&gt; -- Microsoft has issued the&lt;a href="http://msdn.microsoft.com/vstudio/productinfo/roadmap.aspx"&gt; roadmap
for Visual Studio .NET&lt;/a&gt;! &lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=3576622f-4048-4f00-a708-d9cb41d2d4fb" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,3576622f-4048-4f00-a708-d9cb41d2d4fb.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=3f9c2a19-a813-435a-9921-817284ef7e39</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,3f9c2a19-a813-435a-9921-817284ef7e39.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,3f9c2a19-a813-435a-9921-817284ef7e39.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=3f9c2a19-a813-435a-9921-817284ef7e39</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've just released a Remote Deployment utility, called <a href="http://www.opennetcf.org/RapiDeploy.asp">RapiDeploy</a>,
at <a href="http://www.opennetcf.org/">OpenNETCF.org</a>. The utility, written in
C#, uses the OpenNETCF.org <a href="http://www.opennetcf.org/Communication.asp">Communication </a>library
to call out to RAPI functions. Yes, we <strong>really do</strong> eat our own dog
food. 
</p>
        <p>
RapiDeploy can be used to send files from your desktop to any device connected via
ActiveSync. In addition, you can use the optional /install switch, if the file is
a CAB file, and RapiDeploy will kick off the CAB installation process on the device.
I just used it to deploy and install a ringtone on my Smartphone. 
</p>
        <p>
RapiDeploy has several optional switches which, amongst other things, mean you can
use RapiDeploy in a "silent" mode where nothing is output to the command prompt window.
This is really useful for batch files and scripting. 
</p>
        <p>
For more information and to download the utility, visit the <a href="http://www.opennetcf.org/RapiDeploy.asp">RapiDeploy</a> page
at OpenNETCF.org. 
</p>
        <p>
Hell, I'm impressed with it and I wrote it. 
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=3f9c2a19-a813-435a-9921-817284ef7e39" />
      </body>
      <title>Remote Deploy utility</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,3f9c2a19-a813-435a-9921-817284ef7e39.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/07/16/RemoteDeployUtility.aspx</link>
      <pubDate>Wed, 16 Jul 2003 01:33:24 GMT</pubDate>
      <description>&lt;p&gt;
I've just released a Remote Deployment utility, called &lt;a href="http://www.opennetcf.org/RapiDeploy.asp"&gt;RapiDeploy&lt;/a&gt;,
at &lt;a href="http://www.opennetcf.org/"&gt;OpenNETCF.org&lt;/a&gt;. The utility, written in
C#, uses the OpenNETCF.org &lt;a href="http://www.opennetcf.org/Communication.asp"&gt;Communication &lt;/a&gt;library
to call out to RAPI functions. Yes, we &lt;strong&gt;really do&lt;/strong&gt; eat our own dog
food. 
&lt;/p&gt;
&lt;p&gt;
RapiDeploy can be used to send files from your desktop to any device connected via
ActiveSync. In addition, you can use the optional /install switch, if the file is
a CAB file, and RapiDeploy will kick off the CAB installation process on the device.
I just used it to deploy and install a ringtone on my Smartphone. 
&lt;/p&gt;
&lt;p&gt;
RapiDeploy has several optional switches which, amongst other things, mean you can
use RapiDeploy in a "silent" mode where nothing is output to the command prompt window.
This is really useful for batch files and scripting. 
&lt;/p&gt;
&lt;p&gt;
For more information and to download the utility, visit the &lt;a href="http://www.opennetcf.org/RapiDeploy.asp"&gt;RapiDeploy&lt;/a&gt; page
at OpenNETCF.org. 
&lt;/p&gt;
&lt;p&gt;
Hell, I'm impressed with it and I wrote it. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=3f9c2a19-a813-435a-9921-817284ef7e39" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,3f9c2a19-a813-435a-9921-817284ef7e39.aspx</comments>
      <category>.NET Compact Framework</category>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=4d776eb2-5e8b-45d3-b030-7e8aba0bccfa</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,4d776eb2-5e8b-45d3-b030-7e8aba0bccfa.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,4d776eb2-5e8b-45d3-b030-7e8aba0bccfa.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=4d776eb2-5e8b-45d3-b030-7e8aba0bccfa</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
If like me, you create/open a lot of projects in Visual Studio .NET, you treasure
the Projects tab on the Start Page. However, this only lists the 4 MRU items. Luckily,
this can be changed by selecting Options on the Tools menu. Under Environment, select
General. Locate the section that reads "Display XX items in most recently used lists".
The value of XX can be anything from 1 through 24. 
</p>
        <p>
        </p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=4d776eb2-5e8b-45d3-b030-7e8aba0bccfa" />
      </body>
      <title>Visual Studio Tip</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,4d776eb2-5e8b-45d3-b030-7e8aba0bccfa.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/07/10/VisualStudioTip.aspx</link>
      <pubDate>Thu, 10 Jul 2003 23:39:25 GMT</pubDate>
      <description>&lt;p&gt;
If like me, you create/open a lot of projects in Visual Studio .NET, you treasure
the Projects tab on the Start Page. However, this only lists the 4 MRU items. Luckily,
this can be changed by selecting Options on the Tools menu. Under Environment, select
General. Locate the section that reads "Display XX items in most recently used lists".
The value of XX can be anything from 1 through 24. 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=4d776eb2-5e8b-45d3-b030-7e8aba0bccfa" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,4d776eb2-5e8b-45d3-b030-7e8aba0bccfa.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=f689e6e4-b339-499b-95f7-52fc21e5ec02</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,f689e6e4-b339-499b-95f7-52fc21e5ec02.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,f689e6e4-b339-499b-95f7-52fc21e5ec02.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=f689e6e4-b339-499b-95f7-52fc21e5ec02</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://headblender.com/joe/blog/archives/microsoft/001201.html#001201">Joe
Bork</a> points out that <a href="http://steve.wedevelop.net/archives/000384.html">Steve
Clarke</a> tells us where to find the <a href="http://msdn.microsoft.com/vstudio/productinfo/posters/download.aspx">Visual
Studio .NET posters</a> that come in the box when you purchase the product.   
</p>
        <p>
Cool! I saw these posters on the wall in an advertisement for VS .NET in <a href="http://msdn.microsoft.com/msdnmag/">MSDN
Magazine</a> and I was wondering where I could get them. Even better is they are PDF
downloads of the posters in their original size. Now, I just need to find one b-i-g
printer... 
</p>
        <p>
        </p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=f689e6e4-b339-499b-95f7-52fc21e5ec02" />
      </body>
      <title>Visual Studio posters</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,f689e6e4-b339-499b-95f7-52fc21e5ec02.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/06/18/VisualStudioPosters.aspx</link>
      <pubDate>Wed, 18 Jun 2003 21:15:29 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://headblender.com/joe/blog/archives/microsoft/001201.html#001201"&gt;Joe
Bork&lt;/a&gt; points out that &lt;a href="http://steve.wedevelop.net/archives/000384.html"&gt;Steve
Clarke&lt;/a&gt; tells us where to find the &lt;a href="http://msdn.microsoft.com/vstudio/productinfo/posters/download.aspx"&gt;Visual
Studio .NET posters&lt;/a&gt; that come in the box when you purchase the product. &amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Cool! I saw these posters on the wall in an advertisement for VS .NET in &lt;a href="http://msdn.microsoft.com/msdnmag/"&gt;MSDN
Magazine&lt;/a&gt; and I was wondering where I could get them. Even better is they are PDF
downloads of the posters in their original size. Now, I just need to find one b-i-g
printer... 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=f689e6e4-b339-499b-95f7-52fc21e5ec02" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,f689e6e4-b339-499b-95f7-52fc21e5ec02.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=ec61a256-81f4-41c7-b9d1-4922c368aa61</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,ec61a256-81f4-41c7-b9d1-4922c368aa61.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,ec61a256-81f4-41c7-b9d1-4922c368aa61.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=ec61a256-81f4-41c7-b9d1-4922c368aa61</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <body xmlns="http://www.w3.org/1999/xhtml">
          <p>
The long awaited return of ASPToday.com is soon to be over. 
</p>
          <p>
Wrox went into liquidation on March 14, 2003 and since then ASPToday.com has been
out of commission. However, APress bought the domain and rights to the content and
are working on getting the site back up and running ASAP. The bad news is that ASPToday's
sister site, CSharpToday, won't be returning from the black depths of liquidation,
at least for now anyways. 
</p>
          <p>
Link: <a href="http://www.asptoday.com" target="_blank">ASPToday.com</a></p>
        </body>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=ec61a256-81f4-41c7-b9d1-4922c368aa61" />
      </body>
      <title>ASPToday is back... soon!</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,ec61a256-81f4-41c7-b9d1-4922c368aa61.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/06/16/ASPTodayIsBackSoon.aspx</link>
      <pubDate>Mon, 16 Jun 2003 11:49:57 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;
The long awaited return of ASPToday.com is soon to be over. 
&lt;/p&gt;
&lt;p&gt;
Wrox went into liquidation on March 14, 2003 and since then ASPToday.com has been
out of commission. However, APress bought the domain and rights to the content and
are working on getting the site back up and running ASAP. The bad news is that ASPToday's
sister site, CSharpToday, won't be returning from the black depths of liquidation,
at least for now anyways. 
&lt;/p&gt;
&lt;p&gt;
Link: &lt;a href="http://www.asptoday.com" target="_blank"&gt;ASPToday.com&lt;/a&gt; 
&lt;/p&gt;
&lt;/body&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=ec61a256-81f4-41c7-b9d1-4922c368aa61" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,ec61a256-81f4-41c7-b9d1-4922c368aa61.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=a634a693-9a72-4b15-b7f1-a9af9a176b02</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,a634a693-9a72-4b15-b7f1-a9af9a176b02.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,a634a693-9a72-4b15-b7f1-a9af9a176b02.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=a634a693-9a72-4b15-b7f1-a9af9a176b02</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <body xmlns="http://www.w3.org/1999/xhtml">
          <p>
            <strong>Finally!</strong> This has been a long time coming, but I've got Anakrino
running under Windows Server 2003. Thanks to Jay for this one. 
</p>
          <p>
If you want to run Anakrino with Win2K3 simply download this <a href="http://www.saurik.com/net/exemplar/Anakrino.xml" target="_blank">replacement
Anakrino.xml</a> file. Rename the existing Anakrino.xml to something else and copy
the new file into the directory. Anakrino should now launch successful. 
</p>
          <p>
          </p>
        </body>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=a634a693-9a72-4b15-b7f1-a9af9a176b02" />
      </body>
      <title>Anakrino on Windows Server 2003</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,a634a693-9a72-4b15-b7f1-a9af9a176b02.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/06/10/AnakrinoOnWindowsServer2003.aspx</link>
      <pubDate>Tue, 10 Jun 2003 11:47:49 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;
&lt;strong&gt;Finally!&lt;/strong&gt; This has been a long time coming, but I've got Anakrino
running under Windows Server 2003. Thanks to Jay for this one. 
&lt;/p&gt;
&lt;p&gt;
If you want to run Anakrino with Win2K3 simply download this &lt;a href="http://www.saurik.com/net/exemplar/Anakrino.xml" target="_blank"&gt;replacement
Anakrino.xml&lt;/a&gt; file. Rename the existing Anakrino.xml to something else and copy
the new file into the directory. Anakrino should now launch successful. 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;/body&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=a634a693-9a72-4b15-b7f1-a9af9a176b02" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,a634a693-9a72-4b15-b7f1-a9af9a176b02.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=3992b586-a20d-4f81-a462-8e4d401a934d</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,3992b586-a20d-4f81-a462-8e4d401a934d.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,3992b586-a20d-4f81-a462-8e4d401a934d.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=3992b586-a20d-4f81-a462-8e4d401a934d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today I've been mainly coding in... VB .NET. I have a grievance with VB .NET and the
way it handles projects in solutions. 
</p>
        <p>
The problem is that you cannot have VB .NET projects that target different platforms
in the same solution. That's <em>really</em> annoying! For my solution, I have
the following: 
</p>
        <ul>
          <li>
a XML Web Service 
</li>
          <li>
a class library 
</li>
          <li>
a Smart Device Windows Forms application 
</li>
        </ul>
        <p>
The class library is something I want to share between the Web Service and Smart Device
app, but I can't. Instead, I have to two solutions - one with the Web Service and
a desktop-targeted class library, and another with the Smart Device app and a Pocket
PC-targeted class library. For the life of me, I can't see how this could have been
overlooked during the Everett beta! 
</p>
        <p>
I've just doubled the project complexity by choosing VB .NET over C#. And the
aim of choosing VB .NET? To show it is as much a first class citizen of .NET as C#
is. Maybe it is, but when you use VB .NET in Visual Studio .NET, it doesn't do itself
any favours. 
</p>
        <p>
        </p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=3992b586-a20d-4f81-a462-8e4d401a934d" />
      </body>
      <title>VB .NET annoyances</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,3992b586-a20d-4f81-a462-8e4d401a934d.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/05/15/VBNETAnnoyances.aspx</link>
      <pubDate>Thu, 15 May 2003 16:02:46 GMT</pubDate>
      <description>&lt;p&gt;
Today I've been mainly coding in... VB .NET. I have a grievance with VB .NET and the
way it handles projects in solutions. 
&lt;/p&gt;
&lt;p&gt;
The problem is that you cannot have VB .NET projects that target different platforms
in the same solution. That's &lt;em&gt;really&lt;/em&gt; annoying! For my solution,&amp;nbsp;I have
the following: 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
a XML Web Service 
&lt;li&gt;
a&amp;nbsp;class library 
&lt;li&gt;
a Smart Device Windows Forms application 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The class library is something I want to share between the Web Service and Smart Device
app, but I can't. Instead, I have to two solutions - one with the Web Service and
a desktop-targeted class library, and another with the Smart Device app and a Pocket
PC-targeted class library. For the life of me, I can't see how this could have been
overlooked during the Everett beta! 
&lt;/p&gt;
&lt;p&gt;
I've just doubled the project complexity by choosing&amp;nbsp;VB .NET over C#. And the
aim of choosing VB .NET? To show it is as much a first class citizen of .NET as C#
is. Maybe it is, but when you use VB .NET in Visual Studio .NET, it doesn't do itself
any favours. 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=3992b586-a20d-4f81-a462-8e4d401a934d" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,3992b586-a20d-4f81-a462-8e4d401a934d.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ncowburn/Trackback.aspx?guid=5a40b53d-7a14-4d15-a27e-75f74c6d5746</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ncowburn/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ncowburn/PermaLink,guid,5a40b53d-7a14-4d15-a27e-75f74c6d5746.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blog.opennetcf.com/ncowburn/CommentView,guid,5a40b53d-7a14-4d15-a27e-75f74c6d5746.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ncowburn/SyndicationService.asmx/GetEntryCommentsRss?guid=5a40b53d-7a14-4d15-a27e-75f74c6d5746</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I was playing around with the command prompt (again) and I, for some random reason,
decided to call up the command-line usage for devenv.exe (the VS .NET engine). Here's
what I found: 
</p>
        <pre>Usage: devenv  [solutionfile | projectfile | anyfile.ext]  [switches]

Available command line switches:

/build          build the specified solution configuration
/project        specifies the project to build instead of solution
                must specify /build to use /project
/projectconfig  specifies project configuration to build
                must specify /project to use /projectconfig
/out            write build output to specified file
/rebuild        like /build but forces a clean first
/clean          clean up build outputs
/deploy         build the specified solution configuration and then deploy it
/run            run the specified solution configuration
/runexit        run the specified solution configuration and then terminate
/command        executes the specified internal command line after startup
/mditabs        use tabbed documents interface
/mdi            use MDI interface
/fn             use specified font name
/fs             use specified font size
/LCID           use specified language ID
/noVSIP         disables VSIP developers license key for VSIP testing
/safemode       only default environment and services load for stability
/resetskippkgs  allow VsPackages once flagged for loading failures to
                load again
/migratesettings migrate some user settings from another version

Product-specific switches:

/debugexe       Open the specified executable to be debugged. The
                remainder of the command line is passed to this
                executable as its arguments.
/useenv         Use PATH, INCLUDE, LIBPATH, and LIB environment variables
                instead of IDE paths for VC++ builds.

To attach the debugger from the command line, use:
        vs7jit.exe -p 
    
    
<PID></PID></pre>
        <p>
So, just how cool is that? This will help a lot with OpenNETCF projects. We can batch
compile from the solution files, and commit to CVS all from a batch script. Still,
there's no option for defining preprocessors other than to use /projectconfig after
creating a new project configuration to store them. And then that's project specific,
not solution-wide. 
</p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=5a40b53d-7a14-4d15-a27e-75f74c6d5746" />
      </body>
      <title>VS .NET cmd-line fun</title>
      <guid isPermaLink="false">http://blog.opennetcf.com/ncowburn/PermaLink,guid,5a40b53d-7a14-4d15-a27e-75f74c6d5746.aspx</guid>
      <link>http://blog.opennetcf.com/ncowburn/2003/05/15/VSNETCmdlineFun.aspx</link>
      <pubDate>Thu, 15 May 2003 00:26:24 GMT</pubDate>
      <description>&lt;p&gt;
I was playing around with the command prompt (again) and I, for some random reason,
decided to call up the command-line usage for devenv.exe (the VS .NET engine). Here's
what I found: 
&lt;/p&gt;
&lt;pre&gt;Usage: devenv  [solutionfile | projectfile | anyfile.ext]  [switches]

Available command line switches:

/build          build the specified solution configuration
/project        specifies the project to build instead of solution
                must specify /build to use /project
/projectconfig  specifies project configuration to build
                must specify /project to use /projectconfig
/out            write build output to specified file
/rebuild        like /build but forces a clean first
/clean          clean up build outputs
/deploy         build the specified solution configuration and then deploy it
/run            run the specified solution configuration
/runexit        run the specified solution configuration and then terminate
/command        executes the specified internal command line after startup
/mditabs        use tabbed documents interface
/mdi            use MDI interface
/fn             use specified font name
/fs             use specified font size
/LCID           use specified language ID
/noVSIP         disables VSIP developers license key for VSIP testing
/safemode       only default environment and services load for stability
/resetskippkgs  allow VsPackages once flagged for loading failures to
                load again
/migratesettings migrate some user settings from another version

Product-specific switches:

/debugexe       Open the specified executable to be debugged. The
                remainder of the command line is passed to this
                executable as its arguments.
/useenv         Use PATH, INCLUDE, LIBPATH, and LIB environment variables
                instead of IDE paths for VC++ builds.

To attach the debugger from the command line, use:
        vs7jit.exe -p 
    
    
&lt;PID&gt;
&lt;/PID&gt;
&lt;/pre&gt;
&lt;p&gt;
So, just how cool is that? This will help a lot with OpenNETCF projects. We can batch
compile from the solution files, and commit to CVS all from a batch script. Still,
there's no option for defining preprocessors other than to use /projectconfig after
creating a new project configuration to store them. And then that's project specific,
not solution-wide. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ncowburn/aggbug.ashx?id=5a40b53d-7a14-4d15-a27e-75f74c6d5746" /&gt;</description>
      <comments>http://blog.opennetcf.com/ncowburn/CommentView,guid,5a40b53d-7a14-4d15-a27e-75f74c6d5746.aspx</comments>
      <category>.NET Framework</category>
    </item>
  </channel>
</rss>