<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>Chris Tacke</title>
    <link>http://blog.opennetcf.com/ctacke/</link>
    <description>Bringing Managed Code to the Embedded World</description>
    <copyright>Chris Tacke</copyright>
    <lastBuildDate>Wed, 03 Sep 2008 17:40:08 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.8.5223.2</generator>
    <managingEditor>ctacke@opennetcf.com</managingEditor>
    <webMaster>ctacke@opennetcf.com</webMaster>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ctacke/Trackback.aspx?guid=12616a39-1663-4b64-81c2-611ea503e32f</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ctacke/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ctacke/PermaLink,guid,12616a39-1663-4b64-81c2-611ea503e32f.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ctacke/CommentView,guid,12616a39-1663-4b64-81c2-611ea503e32f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ctacke/SyndicationService.asmx/GetEntryCommentsRss?guid=12616a39-1663-4b64-81c2-611ea503e32f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Here's another quick peek at an upcoming
   class in the next release of the SDF:<br /><br /><u><b>Object Model</b></u><br /><br /><img src="http://blog.opennetcf.com/ctacke/content/binary/keyhook2.PNG" alt="keyhook2.PNG" border="0" width="475" height="264" /><br /><br /><u><b>Usage</b></u><br /><br /><pre>    private KeyboardHook m_keyHook;
    
    public Form1()
    {
      m_keyHook = new KeyboardHook();
      m_keyHook.KeyDetected += OnKeyDetected;
      m_keyHook.Enabled = true;
    }

    void OnKeyDetected(OpenNETCF.Win32.WM keyMessage, KeyData keyData)
    {
      // Do Stuff
    } 
</pre><br /><br /><u><b>Sample App in the SDF</b></u><br /><br /><img src="http://blog.opennetcf.com/ctacke/content/binary/keyhook1.PNG" alt="keyhook1.PNG" border="0" width="294" height="462" /><br /><p></p><img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=12616a39-1663-4b64-81c2-611ea503e32f" /><br /><hr />
   Managed Code in the Embedded World</body>
      <title>Keyboard Hooking in SDF v Next</title>
      <guid>http://blog.opennetcf.com/ctacke/PermaLink,guid,12616a39-1663-4b64-81c2-611ea503e32f.aspx</guid>
      <link>http://blog.opennetcf.com/ctacke/2008/09/03/KeyboardHookingInSDFVNext.aspx</link>
      <pubDate>Wed, 03 Sep 2008 17:40:08 GMT</pubDate>
      <description>Here's another quick peek at an upcoming class in the next release of the SDF:&lt;br&gt;
&lt;br&gt;
&lt;u&gt;&lt;b&gt;Object Model&lt;/b&gt;&lt;/u&gt;
&lt;br&gt;
&lt;br&gt;
&lt;img src="http://blog.opennetcf.com/ctacke/content/binary/keyhook2.PNG" alt="keyhook2.PNG" border="0" width="475" height="264"&gt;
&lt;br&gt;
&lt;br&gt;
&lt;u&gt;&lt;b&gt;Usage&lt;/b&gt;&lt;/u&gt;
&lt;br&gt;
&lt;br&gt;
&lt;pre&gt;    private KeyboardHook m_keyHook;
    
    public Form1()
    {
      m_keyHook = new KeyboardHook();
      m_keyHook.KeyDetected += OnKeyDetected;
      m_keyHook.Enabled = true;
    }

    void OnKeyDetected(OpenNETCF.Win32.WM keyMessage, KeyData keyData)
    {
      // Do Stuff
    } 
&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
&lt;u&gt;&lt;b&gt;Sample App in the SDF&lt;/b&gt;&lt;/u&gt;
&lt;br&gt;
&lt;br&gt;
&lt;img src="http://blog.opennetcf.com/ctacke/content/binary/keyhook1.PNG" alt="keyhook1.PNG" border="0" width="294" height="462"&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=12616a39-1663-4b64-81c2-611ea503e32f" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Managed Code in the Embedded World</description>
      <comments>http://blog.opennetcf.com/ctacke/CommentView,guid,12616a39-1663-4b64-81c2-611ea503e32f.aspx</comments>
      <category>OpenNETCF;SDF Samples</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ctacke/Trackback.aspx?guid=065ab605-2d4d-4d78-8233-fae8e8f71e23</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ctacke/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ctacke/PermaLink,guid,065ab605-2d4d-4d78-8233-fae8e8f71e23.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ctacke/CommentView,guid,065ab605-2d4d-4d78-8233-fae8e8f71e23.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ctacke/SyndicationService.asmx/GetEntryCommentsRss?guid=065ab605-2d4d-4d78-8233-fae8e8f71e23</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">This afternoon I learned of a few APIs
   that I was completely unaware of (that would have made my life a lot easier on some
   earlier projects).  3 hours later, We have this fully implemented:<br /><br /><img src="http://blog.opennetcf.com/ctacke/content/binary/radios.PNG" alt="radios.PNG" border="0" width="859" height="340" /><br /><br />
   Usage looks like this:<br /><pre name="code" class="csharp"><br />
   Radios radios = Radios.GetRadios();<br /><br />
   Debug.WriteLine("\nBefore\r\n--------");<br />
   foreach (IRadio radio in radios)<br />
   {<br />
     Debug.WriteLine(string.Format("Name: {0}, Type: {1}, State: {2}", radio.DeviceName,
   radio.RadioType.ToString(), radio.RadioState.ToString()));<br /><br />
     // toggle all radio states<br />
     radio.RadioState = (radio.RadioState == RadioState.On) ? RadioState.Off : RadioState.On;<br />
   }<br /><br />
   // give the radios enough time to change state - some (like BT) seem to be slow<br />
   Thread.Sleep(1000);<br /><br />
   radios.Refresh();<br /><br />
   // display again<br />
   Debug.WriteLine("\r\nAfter\r\n--------");<br />
   foreach (IRadio radio in radios)<br />
   {<br />
     Debug.WriteLine(string.Format("Name: {0}, Type: {1}, State: {2}", radio.DeviceName,
   radio.RadioType.ToString(), radio.RadioState.ToString()));<br />
   }<br />
   Debug.WriteLine("\r\n\n");<br />
   Thread.Sleep(100);<br /><br /><br /></pre>
   The only down side is that they are WinMo 5.0 and later only, so sorry CE devs.<br /><br />
   I'm going to add it to the SDF source tree so it will be in the next release (soon,
   I promise).<br /><p></p><img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=065ab605-2d4d-4d78-8233-fae8e8f71e23" /><br /><hr />
   Managed Code in the Embedded World</body>
      <title>New Classes in SDF v. Next</title>
      <guid>http://blog.opennetcf.com/ctacke/PermaLink,guid,065ab605-2d4d-4d78-8233-fae8e8f71e23.aspx</guid>
      <link>http://blog.opennetcf.com/ctacke/2008/08/28/NewClassesInSDFVNext.aspx</link>
      <pubDate>Thu, 28 Aug 2008 21:25:21 GMT</pubDate>
      <description>This afternoon I learned of a few APIs that I was completely unaware of (that would have made my life a lot easier on some earlier projects).&amp;nbsp; 3 hours later, We have this fully implemented:&lt;br&gt;
&lt;br&gt;
&lt;img src="http://blog.opennetcf.com/ctacke/content/binary/radios.PNG" alt="radios.PNG" border="0" width="859" height="340"&gt;
&lt;br&gt;
&lt;br&gt;
Usage looks like this:&lt;br&gt;
&lt;pre name="code" class="csharp"&gt;

&lt;br&gt;
Radios radios = Radios.GetRadios();&lt;br&gt;
&lt;br&gt;
Debug.WriteLine("\nBefore\r\n--------");&lt;br&gt;
foreach (IRadio radio in radios)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; Debug.WriteLine(string.Format("Name: {0}, Type: {1}, State: {2}", radio.DeviceName,
radio.RadioType.ToString(), radio.RadioState.ToString()));&lt;br&gt;
&lt;br&gt;
&amp;nbsp; // toggle all radio states&lt;br&gt;
&amp;nbsp; radio.RadioState = (radio.RadioState == RadioState.On) ? RadioState.Off : RadioState.On;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
// give the radios enough time to change state - some (like BT) seem to be slow&lt;br&gt;
Thread.Sleep(1000);&lt;br&gt;
&lt;br&gt;
radios.Refresh();&lt;br&gt;
&lt;br&gt;
// display again&lt;br&gt;
Debug.WriteLine("\r\nAfter\r\n--------");&lt;br&gt;
foreach (IRadio radio in radios)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; Debug.WriteLine(string.Format("Name: {0}, Type: {1}, State: {2}", radio.DeviceName,
radio.RadioType.ToString(), radio.RadioState.ToString()));&lt;br&gt;
}&lt;br&gt;
Debug.WriteLine("\r\n\n");&lt;br&gt;
Thread.Sleep(100);&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;/pre&gt;
The only down side is that they are WinMo 5.0 and later only, so sorry CE devs.&lt;br&gt;
&lt;br&gt;
I'm going to add it to the SDF source tree so it will be in the next release (soon,
I promise).&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=065ab605-2d4d-4d78-8233-fae8e8f71e23" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Managed Code in the Embedded World</description>
      <comments>http://blog.opennetcf.com/ctacke/CommentView,guid,065ab605-2d4d-4d78-8233-fae8e8f71e23.aspx</comments>
      <category>OpenNETCF;SDF Samples</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ctacke/Trackback.aspx?guid=975253f4-76fb-407d-977f-bab9008cb5ad</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ctacke/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ctacke/PermaLink,guid,975253f4-76fb-407d-977f-bab9008cb5ad.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ctacke/CommentView,guid,975253f4-76fb-407d-977f-bab9008cb5ad.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ctacke/SyndicationService.asmx/GetEntryCommentsRss?guid=975253f4-76fb-407d-977f-bab9008cb5ad</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">If you're using the sample code from Alex
   Feinman's <a href="http://msdn.microsoft.com/en-us/library/aa446515.aspx">MSDN article
   on hosting ActiveX controls</a>, then you might be interested to know that we've found
   and fixed a bug in it.  The original code doesn't properly clean up and destroy
   the native control instances, so the native destructor is never called and you leak
   objects.  For many things like Media Player, where you create one control and
   use it for the life of your app it's not much of a problem, but if you're creating
   and disposing a lot of controls in your app, it is a problem.<br /><br /><p></p><a href="http://blog.opennetcf.com/ctacke/binary/AxHost.zip">The fixed file is available
   here [AxHost.zip (7.89 KB)]</a><img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=975253f4-76fb-407d-977f-bab9008cb5ad" /><br /><hr />
   Managed Code in the Embedded World</body>
      <title>Bug in MSDN ActiveX Hosting code</title>
      <guid>http://blog.opennetcf.com/ctacke/PermaLink,guid,975253f4-76fb-407d-977f-bab9008cb5ad.aspx</guid>
      <link>http://blog.opennetcf.com/ctacke/2008/08/14/BugInMSDNActiveXHostingCode.aspx</link>
      <pubDate>Thu, 14 Aug 2008 14:40:38 GMT</pubDate>
      <description>If you're using the sample code from Alex Feinman's &lt;a href="http://msdn.microsoft.com/en-us/library/aa446515.aspx"&gt;MSDN
article on hosting ActiveX controls&lt;/a&gt;, then you might be interested to know that
we've found and fixed a bug in it.&amp;nbsp; The original code doesn't properly clean
up and destroy the native control instances, so the native destructor is never called
and you leak objects.&amp;nbsp; For many things like Media Player, where you create one
control and use it for the life of your app it's not much of a problem, but if you're
creating and disposing a lot of controls in your app, it is a problem.&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;a href="http://blog.opennetcf.com/ctacke/binary/AxHost.zip"&gt;The fixed file is available
here [AxHost.zip (7.89 KB)]&lt;/a&gt;&lt;img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=975253f4-76fb-407d-977f-bab9008cb5ad" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Managed Code in the Embedded World</description>
      <comments>http://blog.opennetcf.com/ctacke/CommentView,guid,975253f4-76fb-407d-977f-bab9008cb5ad.aspx</comments>
      <category>.NET Compact Framework;OpenNETCF</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ctacke/Trackback.aspx?guid=947eaf63-d1d2-43e1-ac95-c43d9e874416</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ctacke/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ctacke/PermaLink,guid,947eaf63-d1d2-43e1-ac95-c43d9e874416.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ctacke/CommentView,guid,947eaf63-d1d2-43e1-ac95-c43d9e874416.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ctacke/SyndicationService.asmx/GetEntryCommentsRss?guid=947eaf63-d1d2-43e1-ac95-c43d9e874416</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Today I saw two separate posts on pretty
   much teh same question.  How can you determine if the foreground window changes
   in a WinMo application?  Moreover, how can you determine if the new foreground
   window is your own, or in some other process?  My initial thoughts were to do
   some work in the Form's Deactivate event, but that would lead to having to plumb it
   into every Form, and then you'd still need special case handlers for MessageBoxes
   and Dialogs and it would be an unmaintainable pain in the ass. I decided to put some
   time aside this afternoon and see if I could come up with a better solution, and what
   I came up with is outlined in a new article entitled '<a href="http://community.opennetcf.com/articles/cf/archive/2008/08/13/determining-form-and-process-changes-in-windows-ce.aspx">Determining
   Form and Process Changes in Windows CE</a>'.<br /><p></p><img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=947eaf63-d1d2-43e1-ac95-c43d9e874416" /><br /><hr />
   Managed Code in the Embedded World</body>
      <title>New Article: Determining Form and Process Changes in Windows CE</title>
      <guid>http://blog.opennetcf.com/ctacke/PermaLink,guid,947eaf63-d1d2-43e1-ac95-c43d9e874416.aspx</guid>
      <link>http://blog.opennetcf.com/ctacke/2008/08/13/NewArticleDeterminingFormAndProcessChangesInWindowsCE.aspx</link>
      <pubDate>Wed, 13 Aug 2008 22:14:58 GMT</pubDate>
      <description>Today I saw two separate posts on pretty much teh same question.&amp;nbsp; How can you determine if the foreground window changes in a WinMo application?&amp;nbsp; Moreover, how can you determine if the new foreground window is your own, or in some other process?&amp;nbsp; My initial thoughts were to do some work in the Form's Deactivate event, but that would lead to having to plumb it into every Form, and then you'd still need special case handlers for MessageBoxes and Dialogs and it would be an unmaintainable pain in the ass. I decided to put some time aside this afternoon and see if I could come up with a better solution, and what I came up with is outlined in a new article entitled '&lt;a href="http://community.opennetcf.com/articles/cf/archive/2008/08/13/determining-form-and-process-changes-in-windows-ce.aspx"&gt;Determining
Form and Process Changes in Windows CE&lt;/a&gt;'.&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=947eaf63-d1d2-43e1-ac95-c43d9e874416" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Managed Code in the Embedded World</description>
      <comments>http://blog.opennetcf.com/ctacke/CommentView,guid,947eaf63-d1d2-43e1-ac95-c43d9e874416.aspx</comments>
      <category>Community;Compact Framework Code;OpenNETCF</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ctacke/Trackback.aspx?guid=3aa2c19c-5842-4966-a5de-668404168308</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ctacke/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ctacke/PermaLink,guid,3aa2c19c-5842-4966-a5de-668404168308.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ctacke/CommentView,guid,3aa2c19c-5842-4966-a5de-668404168308.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ctacke/SyndicationService.asmx/GetEntryCommentsRss?guid=3aa2c19c-5842-4966-a5de-668404168308</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">We've been getting a lot of inquiries lately
   about our plans for releasing the <a href="http://www.opennetcf.com/cf/products/sdf.ocf">SDF</a> built
   for <a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx">Visual Studio 2008</a> and
   against <a href="http://msdn.microsoft.com/en-us/netframework/aa497273.aspx">CF 3.5</a>,
   so I'll lay out our current status and short-term plan.<br /><br />
   I realize we're a bit late in releasing a version for Studio '08.  Now you might
   say to yourself "how hard can it be?  Just open the solution in Studio '08, let
   it upgrade, recompile and release."  Sure, it <u>could</u> be that simple if
   we wer content with just tossing it out there, but we're not.  With the move
   to Studio '08 we decided to take advantage of some of the new tools we have. 
   First we migrated the entire SDF source tree from <a href="http://www.sourcegear.com/vault/">Vault</a> to <a href="http://msdn.microsoft.com/en-us/tfs2008/default.aspx">TFS</a>. 
   Vault worked just fine, but we wanted to take advantage of TFS and integrate both <a href="http://en.wikipedia.org/wiki/Continuous_Integration">continuous
   integration</a>, <a href="http://en.wikipedia.org/wiki/Automated_unit_testing">automated
   testing</a> and <a href="http://en.wikipedia.org/wiki/Test-driven_development">test-driven
   development</a> into the product.  
   <br /><br />
   That mean rearchitecting the solution and projecy layouts and then writing tests. 
   Lots of tests.  Of course writing tests leads to finding bugs, which then leads
   to fixing bugs.  We started by looking at <a href="http://bugzilla.opennetcf.com/buglist.cgi?query_format=specific&amp;order=relevance+desc&amp;bug_status=__all__&amp;product=Smart+Device+Framework&amp;content=">reported
   bugs</a> but also looking at some use cases and testing classes we know get the most
   use.  We have no delusion that we're going to have even close to full code coverage
   (or even 50%) by our next release, but we want to get off on the right foot and at
   least have some coverage for the next release.<br /><br />
   Of course we've also added some new features like the OpenNETCF.Net.Mail namespace
   and all of this takes time.  As of right now we have less than 40 hours of test
   writing left to hit our release milestone.  Once we hit that, we then have to
   build the Help and installation package and release.  My hope is to have something
   ready in early September, but that's not a guarantee.  We know you want the release
   - we do - we just want to make sure it's right.<br /><br />
   An ancillary question that also comes up is "when will we be releasing a version compiled
   for CF 3.5?"  As of right now we have no plans to release a CF 3.5-targeted version
   of the SDF.  Yes, you read that right.  We have no plan for a CF 3.5 release. 
   "Why is that?" you might ask, after all CF 3.5 is the latest and greatest, right? 
   Sure, it is, and we think that when possible you should use it.  However the
   SDF has historically been used by developers using older versions of the CF and is
   already rolled out in a *lot* of CF 2.0 projects.  If we moved to 3.5, none of
   those 2.0 project would be able to use the SDF without recompiling themselves. 
   If we moved to 3.5, then we'd also be tempted to use 3.5 features, which would then
   even make the source incompatible with 2.0 and a recompile wouldn't even be an option.
   I, for one, don't really want to leave all of those CF 2.0 developer's high and dry.  
   <br /><br />
   Since CF 3.5 assemblies are unusable in CF 2.0 projects, but <a href="http://blog.opennetcf.com/ncowburn/2008/08/12/HOWTOPreventResolveAssemblyReferencesWarningsInVisualStudio2008.aspx">CF
   2.0 assemblies can be used without a problem in CF 3.5 applications</a> it makes the
   decision pretty simple.  If we stay with CF 2.0 as a target, then far more people
   can use the library.  If you absolutely must have it built targeting CF 3.5,
   you can always recompile the source yourself.<br /><br /><p></p><img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=3aa2c19c-5842-4966-a5de-668404168308" /><br /><hr />
   Managed Code in the Embedded World</body>
      <title>The Smart Device Framework, Studio '08 and CF 3.5</title>
      <guid>http://blog.opennetcf.com/ctacke/PermaLink,guid,3aa2c19c-5842-4966-a5de-668404168308.aspx</guid>
      <link>http://blog.opennetcf.com/ctacke/2008/08/12/TheSmartDeviceFrameworkStudio08AndCF35.aspx</link>
      <pubDate>Tue, 12 Aug 2008 16:03:11 GMT</pubDate>
      <description>We've been getting a lot of inquiries lately about our plans for releasing the &lt;a href="http://www.opennetcf.com/cf/products/sdf.ocf"&gt;SDF&lt;/a&gt; built
for &lt;a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx"&gt;Visual Studio 2008&lt;/a&gt; and
against &lt;a href="http://msdn.microsoft.com/en-us/netframework/aa497273.aspx"&gt;CF 3.5&lt;/a&gt;,
so I'll lay out our current status and short-term plan.&lt;br&gt;
&lt;br&gt;
I realize we're a bit late in releasing a version for Studio '08.&amp;nbsp; Now you might
say to yourself "how hard can it be?&amp;nbsp; Just open the solution in Studio '08, let
it upgrade, recompile and release."&amp;nbsp; Sure, it &lt;u&gt;could&lt;/u&gt; be that simple if
we wer content with just tossing it out there, but we're not.&amp;nbsp; With the move
to Studio '08 we decided to take advantage of some of the new tools we have.&amp;nbsp;
First we migrated the entire SDF source tree from &lt;a href="http://www.sourcegear.com/vault/"&gt;Vault&lt;/a&gt; to &lt;a href="http://msdn.microsoft.com/en-us/tfs2008/default.aspx"&gt;TFS&lt;/a&gt;.&amp;nbsp;
Vault worked just fine, but we wanted to take advantage of TFS and integrate both &lt;a href="http://en.wikipedia.org/wiki/Continuous_Integration"&gt;continuous
integration&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Automated_unit_testing"&gt;automated
testing&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;test-driven
development&lt;/a&gt; into the product.&amp;nbsp; 
&lt;br&gt;
&lt;br&gt;
That mean rearchitecting the solution and projecy layouts and then writing tests.&amp;nbsp;
Lots of tests.&amp;nbsp; Of course writing tests leads to finding bugs, which then leads
to fixing bugs.&amp;nbsp; We started by looking at &lt;a href="http://bugzilla.opennetcf.com/buglist.cgi?query_format=specific&amp;amp;order=relevance+desc&amp;amp;bug_status=__all__&amp;amp;product=Smart+Device+Framework&amp;amp;content="&gt;reported
bugs&lt;/a&gt; but also looking at some use cases and testing classes we know get the most
use.&amp;nbsp; We have no delusion that we're going to have even close to full code coverage
(or even 50%) by our next release, but we want to get off on the right foot and at
least have some coverage for the next release.&lt;br&gt;
&lt;br&gt;
Of course we've also added some new features like the OpenNETCF.Net.Mail namespace
and all of this takes time.&amp;nbsp; As of right now we have less than 40 hours of test
writing left to hit our release milestone.&amp;nbsp; Once we hit that, we then have to
build the Help and installation package and release.&amp;nbsp; My hope is to have something
ready in early September, but that's not a guarantee.&amp;nbsp; We know you want the release
- we do - we just want to make sure it's right.&lt;br&gt;
&lt;br&gt;
An ancillary question that also comes up is "when will we be releasing a version compiled
for CF 3.5?"&amp;nbsp; As of right now we have no plans to release a CF 3.5-targeted version
of the SDF.&amp;nbsp; Yes, you read that right.&amp;nbsp; We have no plan for a CF 3.5 release.&amp;nbsp;
"Why is that?" you might ask, after all CF 3.5 is the latest and greatest, right?&amp;nbsp;
Sure, it is, and we think that when possible you should use it.&amp;nbsp; However the
SDF has historically been used by developers using older versions of the CF and is
already rolled out in a *lot* of CF 2.0 projects.&amp;nbsp; If we moved to 3.5, none of
those 2.0 project would be able to use the SDF without recompiling themselves.&amp;nbsp;
If we moved to 3.5, then we'd also be tempted to use 3.5 features, which would then
even make the source incompatible with 2.0 and a recompile wouldn't even be an option.
I, for one, don't really want to leave all of those CF 2.0 developer's high and dry.&amp;nbsp; 
&lt;br&gt;
&lt;br&gt;
Since CF 3.5 assemblies are unusable in CF 2.0 projects, but &lt;a href="http://blog.opennetcf.com/ncowburn/2008/08/12/HOWTOPreventResolveAssemblyReferencesWarningsInVisualStudio2008.aspx"&gt;CF
2.0 assemblies can be used without a problem in CF 3.5 applications&lt;/a&gt; it makes the
decision pretty simple.&amp;nbsp; If we stay with CF 2.0 as a target, then far more people
can use the library.&amp;nbsp; If you absolutely must have it built targeting CF 3.5,
you can always recompile the source yourself.&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=3aa2c19c-5842-4966-a5de-668404168308" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Managed Code in the Embedded World</description>
      <comments>http://blog.opennetcf.com/ctacke/CommentView,guid,3aa2c19c-5842-4966-a5de-668404168308.aspx</comments>
      <category>.NET Compact Framework;CE Device Development;OpenNETCF</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ctacke/Trackback.aspx?guid=945b5893-2766-4505-8a6a-5f304dfc927f</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ctacke/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ctacke/PermaLink,guid,945b5893-2766-4505-8a6a-5f304dfc927f.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ctacke/CommentView,guid,945b5893-2766-4505-8a6a-5f304dfc927f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ctacke/SyndicationService.asmx/GetEntryCommentsRss?guid=945b5893-2766-4505-8a6a-5f304dfc927f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">    Microsoft has <a href="http://blogs.msdn.com/stevelasker/archive/2008/08/07/sql-server-compact-3-5-sp1-released.aspx">released
   SQL Server Compact 3.5 SP1</a>, providing support for the <a href="http://msdn.microsoft.com/en-us/library/aa697427%28VS.80%29.aspx">ADO.NET
   Entity Framework</a> and 64-bit desktops.<br /><p></p><img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=945b5893-2766-4505-8a6a-5f304dfc927f" /><br /><hr />
   Managed Code in the Embedded World</body>
      <title>SQL Server Compact 3.5 SP1 Released</title>
      <guid>http://blog.opennetcf.com/ctacke/PermaLink,guid,945b5893-2766-4505-8a6a-5f304dfc927f.aspx</guid>
      <link>http://blog.opennetcf.com/ctacke/2008/08/07/SQLServerCompact35SP1Released.aspx</link>
      <pubDate>Thu, 07 Aug 2008 13:40:05 GMT</pubDate>
      <description>&amp;nbsp;&amp;nbsp;&amp;nbsp; Microsoft has &lt;a href="http://blogs.msdn.com/stevelasker/archive/2008/08/07/sql-server-compact-3-5-sp1-released.aspx"&gt;released
SQL Server Compact 3.5 SP1&lt;/a&gt;, providing support for the &lt;a href="http://msdn.microsoft.com/en-us/library/aa697427%28VS.80%29.aspx"&gt;ADO.NET
Entity Framework&lt;/a&gt; and 64-bit desktops.&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=945b5893-2766-4505-8a6a-5f304dfc927f" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Managed Code in the Embedded World</description>
      <comments>http://blog.opennetcf.com/ctacke/CommentView,guid,945b5893-2766-4505-8a6a-5f304dfc927f.aspx</comments>
      <category>OpenNETCF</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ctacke/Trackback.aspx?guid=7b100465-a5da-402c-944a-9653e34b97c3</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ctacke/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ctacke/PermaLink,guid,7b100465-a5da-402c-944a-9653e34b97c3.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ctacke/CommentView,guid,7b100465-a5da-402c-944a-9653e34b97c3.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ctacke/SyndicationService.asmx/GetEntryCommentsRss?guid=7b100465-a5da-402c-944a-9653e34b97c3</wfw:commentRss>
      <title>Announcing the CAB Installer SDK</title>
      <guid>http://blog.opennetcf.com/ctacke/PermaLink,guid,7b100465-a5da-402c-944a-9653e34b97c3.aspx</guid>
      <link>http://blog.opennetcf.com/ctacke/2008/08/01/AnnouncingTheCABInstallerSDK.aspx</link>
      <pubDate>Fri, 01 Aug 2008 19:42:52 GMT</pubDate>
      <description>It seems that every time I work on a project I get near the end and have to deal with actual deployment of the application and things go south.&amp;nbsp; Let's face it, &lt;a href="http://msdn.microsoft.com/en-us/library/ms933760.aspx"&gt;Microsoft's
wceload application&lt;/a&gt; sucks - and that's being generous. It's limited, it's got
no object model, and it's behavior has changed over time without any of those changes
being documented.&lt;br&gt;
&lt;br&gt;
In a recent project I was trying to silently install an application to a directory
that would change depending on the target hardware becasue different devices have
their storage media named differently.&amp;nbsp; I wanted to do this without changing
or having multiple CAB files, since the application was no different. Achieving this
with wceload, I am convinced, is utterly impossible so I put on my reverse-engineering
hat, &lt;a href="http://msdn.microsoft.com/en-us/library/ms933760.aspx"&gt;downloaded the
CAB spec&lt;/a&gt; (cabfmt.doc), and went to work.&amp;nbsp; Now, a few month later, and with
the help of &lt;a href="http://blog.opennetcf.com/afeinman/"&gt;Alex Feinman&lt;/a&gt;, we've
created a new product called the &lt;a href="http://opennetcf.com/Products/CABInstallerSDK/tabid/272/Default.aspx"&gt;Windows
CE CAB Installer SDK&lt;/a&gt;.&amp;nbsp; In addition to a new product, we went with a &lt;a href="http://blog.opennetcf.com/ctacke/2008/08/01/ValueBasedPricingASocialExperiment.aspx"&gt;new
pricing model as well&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
The SDK comes with full source,&amp;nbsp; unit and integration tests designed for running
under mstest, samples for generating compressed and uncompressed CAB (the SDK supports
both), a template for creating custom installer DLLs and both VB and C# examples of
using the SDK.&lt;br&gt;
&lt;br&gt;
The main workhorse of the SDK is the WinCEInstallerFIle class, which looks like this:&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img src="http://blog.opennetcf.com/ctacke/content/binary/cab_sdk.PNG" border="0"&gt;
&lt;br&gt;
&lt;br&gt;
An example of a custom installer looks like this (just to give you a flavor of how
it works):&lt;br&gt;
&lt;br&gt;
&lt;pre name="code" class="csharp"&gt;using System;&lt;br&gt;
&lt;br&gt;
using System.Collections.Generic;&lt;br&gt;
using System.Collections.Specialized;&lt;br&gt;
using System.Text;&lt;br&gt;
using OpenNETCF.Compression.CAB;&lt;br&gt;
&lt;br&gt;
namespace System.Runtime.CompilerServices&lt;br&gt;
{&lt;br&gt;
public class ExtensionAttribute : Attribute&lt;br&gt;
{&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
namespace ONCFInstall&lt;br&gt;
{&lt;br&gt;
public delegate void FileProgressHandler(int progressPercent);&lt;br&gt;
&lt;br&gt;
public static class Extensions&lt;br&gt;
{&lt;br&gt;
public static string Find(this List&lt;string&gt;
   list, string findString)&lt;br&gt;
   {&lt;br&gt;
   foreach (string file in list)&lt;br&gt;
   {&lt;br&gt;
   if (string.Compare(file, findString, true) == 0)&lt;br&gt;
   {&lt;br&gt;
   return file;&lt;br&gt;
   }&lt;br&gt;
   }&lt;br&gt;
   return null;&lt;br&gt;
   }&lt;br&gt;
   }&lt;br&gt;
   &lt;br&gt;
   public class CustomCABInstaller : WinCEInstallerFile&lt;br&gt;
   {&lt;br&gt;
   private int m_fileCount = 0;&lt;br&gt;
   private CommandLineArgs m_args;&lt;br&gt;
   &lt;br&gt;
   public event FileProgressHandler FileProgress;&lt;br&gt;
   &lt;br&gt;
   public CustomCABInstaller(string cabFileName, CommandLineArgs args)&lt;br&gt;
   : base(cabFileName)&lt;br&gt;
   {&lt;br&gt;
   m_args = args;&lt;br&gt;
   SkipFileNames = m_args.SkipFiles ?? new List&lt;string&gt;
      ();&lt;br&gt;&lt;string, string=""&gt;
      PathStringReplacements = m_args.PathStringReplacements ?? new Dictionary();&lt;br&gt;
      SkipOSVersionCheck = m_args.SkipOSVersionCheck;&lt;br&gt;
      }&lt;br&gt;
      &lt;br&gt;
      /// 
      &lt;summary&gt;
         /// List of file names to skip during installation /// 
      &lt;/summary&gt;
      public List&lt;string&gt;
         SkipFileNames { get; set; }&lt;br&gt;
         &lt;br&gt;
         /// 
         &lt;summary&gt;
            /// List of path replacement strings /// 
         &lt;/summary&gt;&lt;string, string=""&gt;
         public Dictionary PathStringReplacements { get; set; }&lt;br&gt;
         &lt;br&gt;
         /// 
         &lt;summary&gt;
            /// If &lt;b&gt;true&lt;/b&gt;, the installer will not check to ensure the target meets the installer's
            version requirements&lt;br&gt;
            /// 
         &lt;/summary&gt;&lt;string, string=""&gt;
         public bool SkipOSVersionCheck { get; set; } public override void OnInstallBegin()
         { m_fileCount = 0; } public override void OnTargetOSVersionCheck() { // check to see
         if we should skip the OS version check if (!SkipOSVersionCheck) { base.OnTargetOSVersionCheck();
         } } public override void OnInstallFile(ref FileInstallInfo fileInfo, out bool skipped)
         { // check to see if it's a name we should skip if (SkipFileNames.Find(fileInfo.FileName)
         != null) { Utility.Output(string.Format("Skipping file '{0}'", fileInfo.FileName));
         skipped = true; return; } // do any path replacements foreach (KeyValuePair val in
         PathStringReplacements)&lt;br&gt;
         {&lt;br&gt;
         fileInfo.DestinationFolder = fileInfo.DestinationFolder.Replace(val.Key, val.Value);&lt;br&gt;
         }&lt;br&gt;
         &lt;br&gt;
         Utility.Output(string.Format("Installing '{0}' to '{1}'", fileInfo.FileName, fileInfo.DestinationFolder));&lt;br&gt;
         &lt;br&gt;
         base.OnInstallFile(ref fileInfo, out skipped);&lt;br&gt;
         &lt;br&gt;
         if (FileProgress != null)&lt;br&gt;
         {&lt;br&gt;
         FileProgress((++m_fileCount * 100) / FileCount);&lt;br&gt;
         }&lt;br&gt;
         }&lt;br&gt;
         }&lt;br&gt;
         }&lt;br&gt;string,&gt;string,&gt;
      &lt;/string&gt;string,&gt;
   &lt;/string&gt;
&lt;/string&gt;
&lt;/pre&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=7b100465-a5da-402c-944a-9653e34b97c3" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Managed Code in the Embedded World</description>
      <comments>http://blog.opennetcf.com/ctacke/CommentView,guid,7b100465-a5da-402c-944a-9653e34b97c3.aspx</comments>
      <category>CE Device Development;Compact Framework Code;OpenNETCF</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ctacke/Trackback.aspx?guid=7664b2ab-da54-4464-abef-ae41fc155951</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ctacke/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ctacke/PermaLink,guid,7664b2ab-da54-4464-abef-ae41fc155951.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ctacke/CommentView,guid,7664b2ab-da54-4464-abef-ae41fc155951.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ctacke/SyndicationService.asmx/GetEntryCommentsRss?guid=7664b2ab-da54-4464-abef-ae41fc155951</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Today OpenNETCF announces a new pricing
   model that is going to be somewhat of a social experiment.  Our latest product
   - the <a href="http://opennetcf.com/Products/CABInstallerSDK/tabid/272/Default.aspx">Windows
   CE CAB Installer SDK</a> - is being released under a "value-based" pricing (VBP) model. 
   In this model we're letting the customer determine how much they pay for a product
   based on how much value they feel it provides them. 
   <br /><br />
   The general idea is that we believe that most developers are honest, understand the
   value of time and have varying perceptions on the value of a software package. 
   For example a college student writing some quick utility for her personal use might
   find that the product saved a little time, but that she doesn't have a whole lot of
   expendable cash.  To her, $10 may be a reasonable representation of the value
   that our product brought to the solution.  On the other hand a developer working
   on an enterprise solution might find that the product saved his team several days
   of internal development and testing.  He knows the cost of his developers' time
   and the opportunity cost of letting them work on other product features instead of
   implementing what our product does.  For him $1,000 is a reasonable value.<br /><br />
   In both cases we agree.  Software certainly doesn't always hold the same value
   to everyone.  We've all purchased software that we use a lot, and we feel that
   it was a great deal for what we paid for it.  We've all also bought software
   that maybe got used once or twice and that we know wasn't worth what we paid for it.
   Since the only person that can reasonably determine the value of the software is the
   customer themself, we've decided to let them pay based on their perceived value of
   the software.  Instead of purchasing the product, or some quantity of the product,
   customers will instead purchase a quantity of $5 "value units."  The number of
   units they purchase is completely up to them.<br /><br />
   So now the college student can pay $10 for the exact same software that some company
   might pay $1,000 or more for.  If you're unsure if the software will meet your
   needs you can pay a small amount to give it a try - after all there is value in the
   effort alone.  If you determine that it does solve a problem for you and indeed
   does have value, you can always come back and purchase more value units.  What
   about bug fixes and upgrades?  New features and fixes are added value, so simply
   come back and purchase the number of value units that you feel represent the feature
   or fix.<br /><br />
   Sure, I suspect that there will be a few people who take advantage of the model. 
   People who know that it saved them days of work but decide to pay in only $5. 
   The hope, however, is that those people will be the exception.  Software is never
   complete - there are always more features to add and bugs to fix.  What drives
   our ability to add those features and make those fixes is cash flow. We feel that
   if most people pay what they truly feel is the value of the product, then it will
   provide us enough revenue to continue working on it, and if the model works for this
   product, it may well spread and be applied to some of our other products as well.<p></p><img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=7664b2ab-da54-4464-abef-ae41fc155951" /><br /><hr />
   Managed Code in the Embedded World</body>
      <title>Value-Based Pricing: A Social Experiment</title>
      <guid>http://blog.opennetcf.com/ctacke/PermaLink,guid,7664b2ab-da54-4464-abef-ae41fc155951.aspx</guid>
      <link>http://blog.opennetcf.com/ctacke/2008/08/01/ValueBasedPricingASocialExperiment.aspx</link>
      <pubDate>Fri, 01 Aug 2008 19:00:38 GMT</pubDate>
      <description>Today OpenNETCF announces a new pricing model that is going to be somewhat of a social experiment.&amp;nbsp; Our latest product - the &lt;a href="http://opennetcf.com/Products/CABInstallerSDK/tabid/272/Default.aspx"&gt;Windows
CE CAB Installer SDK&lt;/a&gt; - is being released under a "value-based" pricing (VBP) model.&amp;nbsp;
In this model we're letting the customer determine how much they pay for a product
based on how much value they feel it provides them. 
&lt;br&gt;
&lt;br&gt;
The general idea is that we believe that most developers are honest, understand the
value of time and have varying perceptions on the value of a software package.&amp;nbsp;
For example a college student writing some quick utility for her personal use might
find that the product saved a little time, but that she doesn't have a whole lot of
expendable cash.&amp;nbsp; To her, $10 may be a reasonable representation of the value
that our product brought to the solution.&amp;nbsp; On the other hand a developer working
on an enterprise solution might find that the product saved his team several days
of internal development and testing.&amp;nbsp; He knows the cost of his developers' time
and the opportunity cost of letting them work on other product features instead of
implementing what our product does.&amp;nbsp; For him $1,000 is a reasonable value.&lt;br&gt;
&lt;br&gt;
In both cases we agree.&amp;nbsp; Software certainly doesn't always hold the same value
to everyone.&amp;nbsp; We've all purchased software that we use a lot, and we feel that
it was a great deal for what we paid for it.&amp;nbsp; We've all also bought software
that maybe got used once or twice and that we know wasn't worth what we paid for it.
Since the only person that can reasonably determine the value of the software is the
customer themself, we've decided to let them pay based on their perceived value of
the software.&amp;nbsp; Instead of purchasing the product, or some quantity of the product,
customers will instead purchase a quantity of $5 "value units."&amp;nbsp; The number of
units they purchase is completely up to them.&lt;br&gt;
&lt;br&gt;
So now the college student can pay $10 for the exact same software that some company
might pay $1,000 or more for.&amp;nbsp; If you're unsure if the software will meet your
needs you can pay a small amount to give it a try - after all there is value in the
effort alone.&amp;nbsp; If you determine that it does solve a problem for you and indeed
does have value, you can always come back and purchase more value units.&amp;nbsp; What
about bug fixes and upgrades?&amp;nbsp; New features and fixes are added value, so simply
come back and purchase the number of value units that you feel represent the feature
or fix.&lt;br&gt;
&lt;br&gt;
Sure, I suspect that there will be a few people who take advantage of the model.&amp;nbsp;
People who know that it saved them days of work but decide to pay in only $5.&amp;nbsp;
The hope, however, is that those people will be the exception.&amp;nbsp; Software is never
complete - there are always more features to add and bugs to fix.&amp;nbsp; What drives
our ability to add those features and make those fixes is cash flow. We feel that
if most people pay what they truly feel is the value of the product, then it will
provide us enough revenue to continue working on it, and if the model works for this
product, it may well spread and be applied to some of our other products as well.&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=7664b2ab-da54-4464-abef-ae41fc155951" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Managed Code in the Embedded World</description>
      <comments>http://blog.opennetcf.com/ctacke/CommentView,guid,7664b2ab-da54-4464-abef-ae41fc155951.aspx</comments>
      <category>OpenNETCF</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ctacke/Trackback.aspx?guid=16a22596-0eb2-4f6d-8c43-e238e6d8bf1e</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ctacke/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ctacke/PermaLink,guid,16a22596-0eb2-4f6d-8c43-e238e6d8bf1e.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ctacke/CommentView,guid,16a22596-0eb2-4f6d-8c43-e238e6d8bf1e.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ctacke/SyndicationService.asmx/GetEntryCommentsRss?guid=16a22596-0eb2-4f6d-8c43-e238e6d8bf1e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      We've been working for a couple months now at migrating some of our projects from
      our older <a href="http://www.sourcegear.com/vault/">SourceGear Vault</a> source code
      repository to Microsoft's <a href="http://msdn.microsoft.com/en-us/tfs2008/default.aspx">Team
      Foundation Server</a>.  I've been perfectly happy with Vault - it's a great,
      inexpensive code repository - but we wanted to start doing <a href="http://en.wikipedia.org/wiki/Test-driven_development">test
      driven design</a> and adding <a href="http://en.wikipedia.org/wiki/Continuous_integration">continuous
      integration</a> into the mix.  One would think that since that's what TFS is
      all about that this would be pretty simple, right?  Hardly.
   </p>
        <p>
      TFS may work out of the box for desktop developers, but when it comes to doing device
      work you quickly end up in a tar pit of problems, which is only compounded when you're
      new to TFS to begin with.  In my opinion a root of these problems is that the <a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx">Visual
      Studio</a> IDE is not using <a href="http://msdn.microsoft.com/en-us/library/ms164311.aspx">msbuild.exe</a> and <a href="http://msdn.microsoft.com/en-us/library/ms182489(VS.80).aspx">mstest.exe</a> for
      doing device project builds and tests.  This is evidenced by the fact that you
      can create a device project with unit tests and they all run just happily from the
      IDE, but if you open a command windows and use msbuild with your solution it fails
      miserably. 
   </p>
        <p>
      I consider this a major failure on the part of the <a href="http://blogs.msdn.com/vsdteam/">Visual
      Studio for Devices (VSD) team</a>.  You see TFS doesn't launch Studio to build
      your solution, it uses msbuild.  So to just get the solution to compile you have
      to learn how TFS works and make modifications.  Oh, and once it's compiling that
      certainly doesn't mean that unit tests will actually run.  We've hit several
      snags along the way on that too.
   </p>
        <p>
      Fortunately for us, I have a good friend and long-time colleague, <a href="http://forums.microsoft.com/MSDN/User/Profile.aspx?UserID=296899&amp;SiteID=1">Tim
      Bassett</a>, who is big into CI and TDD, has a lot of experience with TFS and
      is considering <a href="http://tfsadvantage.com/">hanging out his own shingle</a>. He
      just has no experience doing device development (well not really any since the days
      of eVB when we worked together).  So we formed a kind of symbiotic relationship
      with him <a href="http://tfsadvantage.com/blogs/tim/archive/2008/06/04/building-compact-framework-unit-tests-in-microsoft-team-foundation-server-with-team-foundation-build.aspx">helping
      us getting our server working</a> and running and us helping him develop <a href="http://ciontfs.com/content/THCF.aspx">some
      products</a> that will benefit any other hapless suckers who think that maybe automating
      builds and testing for device development might be useful.  If you're in that
      boat, take a look at what he's got. <a href="http://tfsadvantage.com/forums/">Ask
      him questions</a>.  Help him help us improve the experience of using TFS for
      device work. And if you ever have the ear of anyone on the VSD or CF team, tell them
      they should be dogfooding this stuff so they can feel our pain and that yes, unit
      tests for native code *is* necessary.
   </p>
        <p>
       
   </p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=16a22596-0eb2-4f6d-8c43-e238e6d8bf1e" />
        <br />
        <hr />
   Managed Code in the Embedded World</body>
      <title>Theorem: CF + CI + TFS == PIA</title>
      <guid>http://blog.opennetcf.com/ctacke/PermaLink,guid,16a22596-0eb2-4f6d-8c43-e238e6d8bf1e.aspx</guid>
      <link>http://blog.opennetcf.com/ctacke/2008/06/04/TheoremCFCITFSPIA.aspx</link>
      <pubDate>Wed, 04 Jun 2008 15:36:47 GMT</pubDate>
      <description>&lt;p&gt;
   We've been working for a couple months now at migrating some of our projects from
   our older &lt;a href="http://www.sourcegear.com/vault/"&gt;SourceGear Vault&lt;/a&gt; source code
   repository to Microsoft's &lt;a href="http://msdn.microsoft.com/en-us/tfs2008/default.aspx"&gt;Team
   Foundation Server&lt;/a&gt;.&amp;nbsp; I've been perfectly happy with Vault - it's a great,
   inexpensive code repository - but we wanted to start doing &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;test
   driven design&lt;/a&gt; and adding &lt;a href="http://en.wikipedia.org/wiki/Continuous_integration"&gt;continuous
   integration&lt;/a&gt; into the mix.&amp;nbsp; One would think that since that's what TFS is
   all about that this would be pretty simple, right?&amp;nbsp; Hardly.
&lt;/p&gt;
&lt;p&gt;
   TFS may work out of the box for desktop developers, but when it comes to doing device
   work you quickly end up in a tar pit of problems, which is only compounded when you're
   new to TFS to begin with.&amp;nbsp; In my opinion a root of these problems is that the &lt;a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx"&gt;Visual
   Studio&lt;/a&gt; IDE is not using &lt;a href="http://msdn.microsoft.com/en-us/library/ms164311.aspx"&gt;msbuild.exe&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/ms182489(VS.80).aspx"&gt;mstest.exe&lt;/a&gt; for
   doing device project builds and tests.&amp;nbsp; This is evidenced by the fact that you
   can create a device project with unit tests and they all run just happily from the
   IDE, but if you open a command windows and use msbuild with your solution it fails
   miserably. 
&lt;/p&gt;
&lt;p&gt;
   I consider this a major failure on the part of the &lt;a href="http://blogs.msdn.com/vsdteam/"&gt;Visual
   Studio for Devices (VSD) team&lt;/a&gt;.&amp;nbsp; You see TFS doesn't launch Studio to build
   your solution, it uses msbuild.&amp;nbsp; So to just get the solution to compile you have
   to learn how TFS works and make modifications.&amp;nbsp; Oh, and once it's compiling that
   certainly doesn't mean that unit tests will actually run.&amp;nbsp; We've hit several
   snags along the way on that too.
&lt;/p&gt;
&lt;p&gt;
   Fortunately for us, I have a good friend and long-time colleague, &lt;a href="http://forums.microsoft.com/MSDN/User/Profile.aspx?UserID=296899&amp;amp;SiteID=1"&gt;Tim
   Bassett&lt;/a&gt;,&amp;nbsp;who is big into CI and TDD, has a lot of experience with TFS and
   is considering &lt;a href="http://tfsadvantage.com/"&gt;hanging out his own shingle&lt;/a&gt;.&amp;nbsp;He
   just has no experience doing device development (well not really any since the days
   of eVB when we worked together).&amp;nbsp; So we formed a kind of symbiotic relationship
   with him &lt;a href="http://tfsadvantage.com/blogs/tim/archive/2008/06/04/building-compact-framework-unit-tests-in-microsoft-team-foundation-server-with-team-foundation-build.aspx"&gt;helping
   us getting our server working&lt;/a&gt; and running and us helping him develop &lt;a href="http://ciontfs.com/content/THCF.aspx"&gt;some
   products&lt;/a&gt; that will benefit any other hapless suckers who think that maybe automating
   builds and testing for device development might be useful.&amp;nbsp; If you're in that
   boat, take a look at what he's got. &lt;a href="http://tfsadvantage.com/forums/"&gt;Ask
   him questions&lt;/a&gt;.&amp;nbsp; Help him help us improve the experience of using TFS for
   device work. And if you ever have the ear of anyone on the VSD or CF team, tell them
   they should be dogfooding this stuff so they can feel our pain and that yes, unit
   tests for native code *is* necessary.
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=16a22596-0eb2-4f6d-8c43-e238e6d8bf1e" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Managed Code in the Embedded World</description>
      <comments>http://blog.opennetcf.com/ctacke/CommentView,guid,16a22596-0eb2-4f6d-8c43-e238e6d8bf1e.aspx</comments>
      <category>OpenNETCF</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ctacke/Trackback.aspx?guid=f550902d-5de2-4a82-82f9-542420cdf958</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ctacke/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ctacke/PermaLink,guid,f550902d-5de2-4a82-82f9-542420cdf958.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ctacke/CommentView,guid,f550902d-5de2-4a82-82f9-542420cdf958.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ctacke/SyndicationService.asmx/GetEntryCommentsRss?guid=f550902d-5de2-4a82-82f9-542420cdf958</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      For some time now we've offered "support and maintenance" as an option when purchasing our
      flagship <a href="http://opennetcf.com/CompactFramework/Products/SmartDeviceFramework/tabid/65/Default.aspx">Smart
      Device Framework </a>product.  If I recall correctly, the price is something
      like $240 for a year.  In the entire time we've offered it I can probably count
      the number of sales of that option on one hand - it's way less than 1% of the people
      who bought the extensions.
   </p>
        <p>
      I had a call from a prospective customer asking about the feature and it clued me
      in to what most people's thought process is.  He asked "why should I buy maintenance
      for $240 when I can just buy each new version for $50.  It's less expensive to
      just re-buy."
   </p>
        <p>
      Ah, on the surface that may seem true, and like a good deal.  But here's the
      value in buying maintenance:
   </p>
        <p>
      Right now we're in the process of moving the SDF to Studio 2008.  In the process
      we're also moving to using Team Foundation Server as a back end and integrating unit
      testing and continuious integration.  In this process we're shaking out quite
      a few bugs (take a look at our <a href="http://bugzilla.opennetcf.com">online bug
      database</a> to see what we're up to).  People <u>with</u> maintenance agreements
      can request the source for these fixes at any time.  They also get source drops
      for all service packs (no one else does).  Those <u>without</u> maintenance must
      wait until the next release or service pack to take advantage of these fixes.
   </p>
        <p>
      There is one exception to this rule.  We feel that if you've gone through
      the task of finding it and reporting it, we owe you so if you are the first to find
      and report a bug, we'll provide you the fix immediately upon fixing it.  
   </p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=f550902d-5de2-4a82-82f9-542420cdf958" />
        <br />
        <hr />
   Managed Code in the Embedded World</body>
      <title>Why buy support for the SDF?</title>
      <guid>http://blog.opennetcf.com/ctacke/PermaLink,guid,f550902d-5de2-4a82-82f9-542420cdf958.aspx</guid>
      <link>http://blog.opennetcf.com/ctacke/2008/06/03/WhyBuySupportForTheSDF.aspx</link>
      <pubDate>Tue, 03 Jun 2008 16:48:33 GMT</pubDate>
      <description>&lt;p&gt;
   For some time now we've offered "support and maintenance" as an option when purchasing&amp;nbsp;our
   flagship&amp;nbsp;&lt;a href="http://opennetcf.com/CompactFramework/Products/SmartDeviceFramework/tabid/65/Default.aspx"&gt;Smart
   Device Framework &lt;/a&gt;product.&amp;nbsp; If I recall correctly, the price is something
   like $240 for a year.&amp;nbsp; In the entire time we've offered it I can probably count
   the number of sales of that option on one hand - it's way less than 1% of the people
   who bought the extensions.
&lt;/p&gt;
&lt;p&gt;
   I had a call from a prospective customer asking about the feature and it clued me
   in to what most people's thought process is.&amp;nbsp; He asked "why should I buy maintenance
   for $240 when I can just buy each new version for $50.&amp;nbsp; It's less expensive to
   just re-buy."
&lt;/p&gt;
&lt;p&gt;
   Ah, on the surface that may seem true, and like a good deal.&amp;nbsp; But here's the
   value in buying maintenance:
&lt;/p&gt;
&lt;p&gt;
   Right now we're in the process of moving the SDF to Studio 2008.&amp;nbsp; In the process
   we're also moving to using Team Foundation Server as a back end and integrating unit
   testing and continuious integration.&amp;nbsp; In this process we're shaking out quite
   a few bugs (take a look at our &lt;a href="http://bugzilla.opennetcf.com"&gt;online bug
   database&lt;/a&gt; to see what we're up to).&amp;nbsp; People &lt;u&gt;with&lt;/u&gt; maintenance agreements
   can request the source for these fixes at any time.&amp;nbsp; They also get source drops
   for all service packs (no one else does).&amp;nbsp; Those &lt;u&gt;without&lt;/u&gt; maintenance must
   wait until the next release or service pack to take advantage of these fixes.
&lt;/p&gt;
&lt;p&gt;
   There is&amp;nbsp;one exception to this rule.&amp;nbsp; We feel that if you've gone through
   the task of finding it and reporting it, we owe you so if you are the first to find
   and report a bug, we'll provide you the fix immediately upon fixing it.&amp;nbsp; 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=f550902d-5de2-4a82-82f9-542420cdf958" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Managed Code in the Embedded World</description>
      <comments>http://blog.opennetcf.com/ctacke/CommentView,guid,f550902d-5de2-4a82-82f9-542420cdf958.aspx</comments>
      <category>OpenNETCF</category>
    </item>
    <item>
      <trackback:ping>http://blog.opennetcf.com/ctacke/Trackback.aspx?guid=f938d733-5d31-4fcd-b55a-8f01b01a5853</trackback:ping>
      <pingback:server>http://blog.opennetcf.com/ctacke/pingback.aspx</pingback:server>
      <pingback:target>http://blog.opennetcf.com/ctacke/PermaLink,guid,f938d733-5d31-4fcd-b55a-8f01b01a5853.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.opennetcf.com/ctacke/CommentView,guid,f938d733-5d31-4fcd-b55a-8f01b01a5853.aspx</wfw:comment>
      <wfw:commentRss>http://blog.opennetcf.com/ctacke/SyndicationService.asmx/GetEntryCommentsRss?guid=f938d733-5d31-4fcd-b55a-8f01b01a5853</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      We're just about to release a new version of Padarn, out ASP.NET Web Server for Windows
      CE.  This version brings SSL support as well as Basic and Digest authentication. 
      Another part of this release was trying to keep the footprint reasonably small. 
      Here's a screen shot of all of the assemblies needed for the entire engine implementation:
   </p>
        <p>
          <img height="81" alt="padarnfootprint.PNG" src="http://blog.opennetcf.com/ctacke/content/binary/padarnfootprint.PNG" width="279" border="1" />
        </p>
        <p>
      So yes, we have an ASP.NET web server with SSL and authentication support and it's
      just 305KB - and half of that is for SSL alone.
   </p>
        <p>
       
   </p>
        <img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=f938d733-5d31-4fcd-b55a-8f01b01a5853" />
        <br />
        <hr />
   Managed Code in the Embedded World</body>
      <title>Padarn's Footprint</title>
      <guid>http://blog.opennetcf.com/ctacke/PermaLink,guid,f938d733-5d31-4fcd-b55a-8f01b01a5853.aspx</guid>
      <link>http://blog.opennetcf.com/ctacke/2008/05/29/PadarnsFootprint.aspx</link>
      <pubDate>Thu, 29 May 2008 16:26:56 GMT</pubDate>
      <description>&lt;p&gt;
   We're just about to release a new version of Padarn, out ASP.NET Web Server for Windows
   CE.&amp;nbsp;&amp;nbsp;This version brings&amp;nbsp;SSL support as well as Basic and Digest authentication.&amp;nbsp;
   Another part of this release was trying to keep the footprint reasonably small.&amp;nbsp;
   Here's a screen shot of all of the assemblies needed for the entire engine implementation:
&lt;/p&gt;
&lt;p&gt;
   &lt;img height=81 alt=padarnfootprint.PNG src="http://blog.opennetcf.com/ctacke/content/binary/padarnfootprint.PNG" width=279 border=1&gt;
&lt;/p&gt;
&lt;p&gt;
   So yes, we have an ASP.NET web server with SSL and authentication support and it's
   just 305KB - and half of that is for SSL alone.
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.opennetcf.com/ctacke/aggbug.ashx?id=f938d733-5d31-4fcd-b55a-8f01b01a5853" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Managed Code in the Embedded World</description>
      <comments>http://blog.opennetcf.com/ctacke/CommentView,guid,f938d733-5d31-4fcd-b55a-8f01b01a5853.aspx</comments>
      <category>OpenNETCF;Padarn</category>
    </item>
  </channel>
</rss>