<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" 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/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Thoughts from the Wet Coast</title>
    <description>The musings of an ASP.NET Developer from the We(s)t Coast of Canada</description>
    <link>http://www.charlesnurse.com/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.4.5.0</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://www.charlesnurse.com/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>My name</dc:creator>
    <dc:title>Thoughts from the Wet Coast</dc:title>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ThoughtsFromTheWetCoast" type="application/rss+xml" /><item>
      <title>DotNetNuke Community Edition in the New Web Application Gallery</title>
      <description>&lt;p&gt;Today (March 18th, 2009) during the keynote at MIX 09, Scott Guthrie announced the release of version 2 of the Web Platform Installer (WPI) and the release of the new &lt;a href="http://www.microsoft.com/web"&gt;Web Application Gallery&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Bill Staples, the Program Manager responsible for the Web Application Gallery described it as an “App Store for the Web”.&amp;#160; I am pleased to say that DotNetNuke Community Edition is part of this initiative and that Bill Staples used DotNetNuke as his demonstration install during the keynote.&lt;/p&gt;  &lt;p&gt;If you want to download and try DotNetNuke Community Edition you can install it from the Web Application Gallery by clicking the image below.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/web/gallery/install.aspx?appsxml=www.microsoft.com%2fweb%2fwebpi%2f2.0%2fWebApplicationList.xml&amp;amp;appid=106"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wpiBadgeGreen_3" border="0" alt="wpiBadgeGreen_3" src="http://www.charlesnurse.com/image.axd?picture=wpiBadgeGreen_3.png" width="180" height="55" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;The Installation Experience&lt;/h2&gt;  &lt;p&gt;When you click on the install link, you will get a popup (in Firefox 3) that confirms which program you want to use to run the installer.&amp;#160; In my case I already have the Web Platform Installer on my machine.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.charlesnurse.com/image.axd?picture=WebAppGallery_1.png" rel="lightbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="WebAppGallery_1" border="0" alt="WebAppGallery_1" src="http://www.charlesnurse.com/image.axd?picture=WebAppGallery_1_thumb.png" width="335" height="358" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The Installer will launch and you will get the following screen.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.charlesnurse.com/image.axd?picture=WebAppGallery_2.png" rel="lightbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="WebAppGallery_2" border="0" alt="WebAppGallery_2" src="http://www.charlesnurse.com/image.axd?picture=WebAppGallery_2_thumb.png" width="704" height="520" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Clicking on Install will download the application (in the case of DotNetNuke it will download from Codeplex) and display the following screen, where you can provide an “Application Name” – the default is dotnetnuke.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.charlesnurse.com/image.axd?picture=WebAppGallery_3.png" rel="lightbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="WebAppGallery_3" border="0" alt="WebAppGallery_3" src="http://www.charlesnurse.com/image.axd?picture=WebAppGallery_3_thumb.png" width="702" height="516" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The second page allows the user to configure the database.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.charlesnurse.com/image.axd?picture=WebAppGallery_4.png" rel="lightbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="WebAppGallery_4" border="0" alt="WebAppGallery_4" src="http://www.charlesnurse.com/image.axd?picture=WebAppGallery_4_thumb.png" width="697" height="805" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Clicking continue will set up IIS and SQL Server.&amp;#160; You will then see the final screen, which lets you know that the install was successful.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.charlesnurse.com/image.axd?picture=WebAppGallery_5.png" rel="lightbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="WebAppGallery_5" border="0" alt="WebAppGallery_5" src="http://www.charlesnurse.com/image.axd?picture=WebAppGallery_5_thumb.png" width="689" height="477" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Finally clicking the link will automatically launch the DotNetNuke Install Wizard to complete the installation of your DotNetNuke Application.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.charlesnurse.com/image.axd?picture=WebAppGallery_6.png" rel="lightbox"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="WebAppGallery_6" border="0" alt="WebAppGallery_6" src="http://www.charlesnurse.com/image.axd?picture=WebAppGallery_6_thumb.png" width="704" height="455" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Scott Hanselman has &lt;a href="http://www.hanselman.com/blog/MicrosoftWebPlatformWebApplicationGalleryWebPlatformInstallerAndDasBlog.aspx"&gt;blogged&lt;/a&gt; about the new installer, using Das Blog as the example.&amp;#160; He describes some of the technical details behind the installer.&amp;#160; In a future article I will describe the set up of the DotNetNuke package, which I created for this initiative.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThoughtsFromTheWetCoast/~4/Xrabkhjeuj4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ThoughtsFromTheWetCoast/~3/Xrabkhjeuj4/post.aspx</link>
      <author>charles.nurse.nospam@nospam.dotnetnuke.com (cnurse)</author>
      <comments>http://www.charlesnurse.com/post/DotNetNuke-Community-Edition-in-the-New-Web-Application-Gallery.aspx#comment</comments>
      <guid isPermaLink="false">http://www.charlesnurse.com/post.aspx?id=fcb63b95-d478-4c87-84fa-ed7499b56a98</guid>
      <pubDate>Wed, 18 Mar 2009 10:38:51 -0700</pubDate>
      <category>DotNetNuke</category>
      <dc:publisher>cnurse</dc:publisher>
      <pingback:server>http://www.charlesnurse.com/pingback.axd</pingback:server>
      <pingback:target>http://www.charlesnurse.com/post.aspx?id=fcb63b95-d478-4c87-84fa-ed7499b56a98</pingback:target>
      <slash:comments>13</slash:comments>
      <trackback:ping>http://www.charlesnurse.com/trackback.axd?id=fcb63b95-d478-4c87-84fa-ed7499b56a98</trackback:ping>
      <wfw:comment>http://www.charlesnurse.com/post/DotNetNuke-Community-Edition-in-the-New-Web-Application-Gallery.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.charlesnurse.com/syndication.axd?post=fcb63b95-d478-4c87-84fa-ed7499b56a98</wfw:commentRss>
    <feedburner:origLink>http://www.charlesnurse.com/post.aspx?id=fcb63b95-d478-4c87-84fa-ed7499b56a98</feedburner:origLink></item>
    <item>
      <title>The New Extension Installer Manifest – Part 6, The Script Component</title>
      <description>&lt;p&gt;In DotNetNuke v 4.6 a new installer system was introduced to handle the new Authentication Systems.&amp;#160; In DotNetNuke 5.0 we have extended the use of the Installer to all extensions, including Modules, Language Packs and Skins.&amp;#160; &lt;/p&gt;  &lt;p&gt;In previous blogs in this series I &lt;a href="http://www.charlesnurse.com/post/The-New-Extension-Manifest-Part1.aspx"&gt;introduced&lt;/a&gt; the new Extension Installer Manifest, and the &lt;a href="http://www.charlesnurse.com/post/The-New-Extension-Manifest-Part2.aspx"&gt;3 components&lt;/a&gt; that most developers would be fairly familiar with – Module, Assembly, File, as they are similar to the legacy module manifest, and I began to detail the individual component manifests by describing the &lt;a href="http://www.charlesnurse.com/post/The-New-Extension-Installer-Manifest-Part-3-The-Cleanup-Component.aspx"&gt;Cleanup Component&lt;/a&gt; and the &lt;a href="http://www.charlesnurse.com/post/The-New-Extension-Installer-Manifest-Part-4-The-Assembly-Component.aspx"&gt;Assembly Component&lt;/a&gt; and &lt;a href="http://www.charlesnurse.com/post/The-New-Extension-Installer-Manifest-Part-5-The-File-Component.aspx"&gt;File Component&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In this article I will dive deeper into the Script Component (see Listing 1).&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;         &lt;h6&gt;Listing 1 - The Script Component manifest fragment from the BroadcastPollingCachingProvider&lt;/h6&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;         &lt;div class="csharpcode"&gt;           &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;component&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Script&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;scripts&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;basePath&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Providers/CachingProviders/BroadcastPollingCachingProvider&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;basePath&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Install&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;      &amp;lt;path&amp;gt;Install&amp;lt;/path&amp;gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;      &amp;lt;name&amp;gt;Install.SqlDataProvider&amp;lt;/name&amp;gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;      &amp;lt;version&amp;gt;05.00.00&amp;lt;/version&amp;gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &amp;lt;script type=&lt;span class="str"&gt;&amp;quot;UnInstall&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;      &amp;lt;path&amp;gt;UnInstall&amp;lt;/path&amp;gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;      &amp;lt;name&amp;gt;UnInstall.SqlDataProvider&amp;lt;/name&amp;gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;      &amp;lt;version&amp;gt;05.00.00&amp;lt;/version&amp;gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;scripts&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;component&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
        &lt;/div&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;The Script component is another Installer that inherits from the base File Component.&amp;#160; The &amp;lt;basePath&amp;gt; element identifies the root location for the Script.&amp;#160; It uses the &amp;lt;scripts&amp;gt; and &amp;lt;script&amp;gt; elements in place of the base class &amp;lt;files&amp;gt; and &amp;lt;file&amp;gt; element.&lt;/p&gt;

&lt;p&gt;Note that there a few enhancements (compared with the legacy Module Installer) in how scripts are handled.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Each script has a “type” attribute, which identifies whether the Script should be used in Install/Upgrade mode or is used 'in “UnInstall” mode&lt;/li&gt;

  &lt;li&gt;Each script has a required version element which identifies which version the script corresponds to.&amp;#160; This means that you no longer have to use the convention of naming the script with the version “xx.xx.xx.SqlDataProvider”.&amp;#160; ou can of course still use the legacy naming convention, but you are not required to.&lt;/li&gt;

  &lt;li&gt;The installer does support the “Install.SqlDataProvider” special script which is run first when installing an Extension.&lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://feeds.feedburner.com/~r/ThoughtsFromTheWetCoast/~4/su2_UQGoaaU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ThoughtsFromTheWetCoast/~3/su2_UQGoaaU/post.aspx</link>
      <author>charles.nurse.nospam@nospam.dotnetnuke.com (cnurse)</author>
      <comments>http://www.charlesnurse.com/post/The-New-Extension-Installer-Manifest-Part-6-The-Script-Component.aspx#comment</comments>
      <guid isPermaLink="false">http://www.charlesnurse.com/post.aspx?id=df813b12-c747-4458-b8f0-9b98a03cb76f</guid>
      <pubDate>Fri, 27 Feb 2009 10:18:56 -0700</pubDate>
      <category>DotNetNuke</category>
      <dc:publisher>cnurse</dc:publisher>
      <pingback:server>http://www.charlesnurse.com/pingback.axd</pingback:server>
      <pingback:target>http://www.charlesnurse.com/post.aspx?id=df813b12-c747-4458-b8f0-9b98a03cb76f</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://www.charlesnurse.com/trackback.axd?id=df813b12-c747-4458-b8f0-9b98a03cb76f</trackback:ping>
      <wfw:comment>http://www.charlesnurse.com/post/The-New-Extension-Installer-Manifest-Part-6-The-Script-Component.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.charlesnurse.com/syndication.axd?post=df813b12-c747-4458-b8f0-9b98a03cb76f</wfw:commentRss>
    <feedburner:origLink>http://www.charlesnurse.com/post.aspx?id=df813b12-c747-4458-b8f0-9b98a03cb76f</feedburner:origLink></item>
    <item>
      <title>Kudos to Dell</title>
      <description>&lt;p&gt;Last week my Dell XPS M1330 laptop died. &lt;/p&gt;  &lt;p&gt;After searching the internet I discovered that the problem was a faulty NVidea graphics card, which was quite a well-known problem.&amp;#160; &lt;/p&gt;  &lt;p&gt;On Thursday, I called Dell’s Canadian XPS Customer Support line and the representative immediately recognised the problem and arranged to have a box shipped to me so I could pack it up and send it to their Canadian Service Centre in Newmarket, Ontario.&lt;/p&gt;  &lt;p&gt;The box arrived Friday morning, and I packed the laptop into it and dropped it off at the local Purolator office in Langley.&lt;/p&gt;  &lt;p&gt;Yesterday, I was surprised when a Purolator delivery man knocked on my door with my laptop, and its running great now!!&lt;/p&gt;  &lt;p&gt;So Kudos to Dell, who expedited this repair taking 4 business days to ship a box 3 times across the country as well as repairing my computer.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThoughtsFromTheWetCoast/~4/6oLbxD_dmk0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ThoughtsFromTheWetCoast/~3/6oLbxD_dmk0/post.aspx</link>
      <author>charles.nurse.nospam@nospam.dotnetnuke.com (cnurse)</author>
      <comments>http://www.charlesnurse.com/post/Kudos-to-Dell.aspx#comment</comments>
      <guid isPermaLink="false">http://www.charlesnurse.com/post.aspx?id=ba71a1f1-9b88-45d0-ad47-bb8eb713f178</guid>
      <pubDate>Thu, 26 Feb 2009 10:02:27 -0700</pubDate>
      <category>Personal</category>
      <dc:publisher>cnurse</dc:publisher>
      <pingback:server>http://www.charlesnurse.com/pingback.axd</pingback:server>
      <pingback:target>http://www.charlesnurse.com/post.aspx?id=ba71a1f1-9b88-45d0-ad47-bb8eb713f178</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.charlesnurse.com/trackback.axd?id=ba71a1f1-9b88-45d0-ad47-bb8eb713f178</trackback:ping>
      <wfw:comment>http://www.charlesnurse.com/post/Kudos-to-Dell.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.charlesnurse.com/syndication.axd?post=ba71a1f1-9b88-45d0-ad47-bb8eb713f178</wfw:commentRss>
    <feedburner:origLink>http://www.charlesnurse.com/post.aspx?id=ba71a1f1-9b88-45d0-ad47-bb8eb713f178</feedburner:origLink></item>
    <item>
      <title>The New Extension Installer Manifest – Part 5, The File Component</title>
      <description>&lt;p&gt;In DotNetNuke v 4.6 a new installer system was introduced to handle the new Authentication Systems.&amp;#160; In DotNetNuke 5.0 we have extended the use of the Installer to all extensions, including Modules, Language Packs and Skins.&amp;#160; &lt;/p&gt;  &lt;p&gt;In previous blogs in this series I &lt;a href="http://www.charlesnurse.com/post/The-New-Extension-Manifest-Part1.aspx"&gt;introduced&lt;/a&gt; the new Extension Installer Manifest, and the &lt;a href="http://www.charlesnurse.com/post/The-New-Extension-Manifest-Part2.aspx"&gt;3 components&lt;/a&gt; that most developers would be fairly familiar with – Module, Assembly, File, as they are similar to the legacy module manifest, and I began to detail the individual component manifests by describing the &lt;a href="http://www.charlesnurse.com/post/The-New-Extension-Installer-Manifest-Part-3-The-Cleanup-Component.aspx"&gt;Cleanup Component&lt;/a&gt; and the &lt;a href="http://www.charlesnurse.com/post/The-New-Extension-Installer-Manifest-Part-4-The-Assembly-Component.aspx"&gt;Assembly Component&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In this article I will dive deeper into the File Component (see Listing 1).&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;         &lt;h6&gt;Listing 1 - The File Component manifest fragment from the FileBasedCachingProvider&lt;/h6&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;         &lt;div class="csharpcode"&gt;           &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;component&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;File&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;files&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;basePath&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Providers\CachingProviders\FileBasedCachingProvider&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;basePath&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;file&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;license.txt&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;file&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;file&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;releaseNotes.txt&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;file&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;files&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;component&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
        &lt;/div&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Most of the components which handle files inherit from the base File Component.&amp;#160; The &amp;lt;basePath&amp;gt; element is used to identify a base (or root) path for all the files identified.&amp;#160; Each &amp;lt;file&amp;gt; element has a &amp;lt;name&amp;gt; and &amp;lt;path&amp;gt; which is combined with this base path to identify the file completely.&amp;#160; The &amp;lt;file&amp;gt; element also has a &amp;lt;sourceFileName&amp;gt; element.&amp;#160; This is used to identify the file’s location within the zip file, if different from the file location in the destination.&lt;/p&gt;

&lt;p&gt;The component installers that inherit from the File Installer essentially have the same general structure – they use different names for the &amp;lt;file&amp;gt; and &amp;lt;files&amp;gt; nodes, but in most respects are the same.&amp;#160; They use the base class’s logic to manage the file copying etc. implementing only the custom behaviour they need.&lt;/p&gt;

&lt;p&gt;In addition to &amp;lt;name&amp;gt; and &amp;lt;path&amp;gt;, there are two other elements that are defined in File component but have no effect in the base class.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt; &amp;lt;action&amp;gt; is used by the Assembly Installer to determine whether the assembly should be added or removed&lt;/li&gt;

  &lt;li&gt;&amp;lt;version&amp;gt; is used by both the Assembly Installer and the Script Installer&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Backup and Restore&lt;/h3&gt;

&lt;p&gt;As the new Installer supports a limited rollback model, the File Installer will backup existing files before copying a new copy during Upgrade.&amp;#160; If there is a failure in some other component, the backups will be copied back to their original location, so the old version of the file is still present.&amp;#160; &lt;/p&gt;

&lt;p&gt;If the installation/upgrade is successful, during the commit phase the backup copy is deleted and the new file is used.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThoughtsFromTheWetCoast/~4/HD-LnXleoO0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ThoughtsFromTheWetCoast/~3/HD-LnXleoO0/post.aspx</link>
      <author>charles.nurse.nospam@nospam.dotnetnuke.com (cnurse)</author>
      <comments>http://www.charlesnurse.com/post/The-New-Extension-Installer-Manifest-Part-5-The-File-Component.aspx#comment</comments>
      <guid isPermaLink="false">http://www.charlesnurse.com/post.aspx?id=0cd739e4-0b0b-4036-b9ea-919af3e55b0a</guid>
      <pubDate>Wed, 25 Feb 2009 11:15:50 -0700</pubDate>
      <category>DotNetNuke</category>
      <dc:publisher>cnurse</dc:publisher>
      <pingback:server>http://www.charlesnurse.com/pingback.axd</pingback:server>
      <pingback:target>http://www.charlesnurse.com/post.aspx?id=0cd739e4-0b0b-4036-b9ea-919af3e55b0a</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.charlesnurse.com/trackback.axd?id=0cd739e4-0b0b-4036-b9ea-919af3e55b0a</trackback:ping>
      <wfw:comment>http://www.charlesnurse.com/post/The-New-Extension-Installer-Manifest-Part-5-The-File-Component.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.charlesnurse.com/syndication.axd?post=0cd739e4-0b0b-4036-b9ea-919af3e55b0a</wfw:commentRss>
    <feedburner:origLink>http://www.charlesnurse.com/post.aspx?id=0cd739e4-0b0b-4036-b9ea-919af3e55b0a</feedburner:origLink></item>
    <item>
      <title>The New Extension Installer Manifest – Part 4, The Assembly Component</title>
      <description>&lt;p&gt;In DotNetNuke v 4.6 a new installer system was introduced to handle the new Authentication Systems.&amp;#160; In DotNetNuke 5.0 we have extended the use of the Installer to all extensions, including Modules, Language Packs and Skins.&amp;#160; &lt;/p&gt;  &lt;p&gt;In previous blogs in this series I &lt;a href="http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryId/1847/The-New-Extension-Installer-Manifest-Part-1-Introduction.aspx"&gt;introduced&lt;/a&gt; the new Extension Installer Manifest, and the &lt;a href="http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryId/1848/The-New-Extension-Installer-Manifest-Part-2-Component-Installers.aspx"&gt;3 components&lt;/a&gt; that most developers would be fairly familiar with – Module, Assembly, File, as they are similar to the legacy module manifest, and I began to detail the individual component manifests by describing the &lt;a href="http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryId/1970/The-New-Extension-Installer-Manifest-Part-3-The-Cleanup-Component.aspx"&gt;Cleanup Component&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In this article I will dive deeper into the Assembly Component (see Listing 1).&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;         &lt;h3&gt;Listing 1 - The Assembly Component manifest fragment from the FileBasedCachingProvider&lt;/h3&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;         &lt;div class="csharpcode"&gt;           &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;component&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Assembly&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;assemblies&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;assembly&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;path&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;bin\Providers&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;path&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;DotNetNuke.Caching.FileBasedCachingProvider.dll&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;05.00.01&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;assembly&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;assemblies&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;component&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
        &lt;/div&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Most of the components which handle files inherit from the base File Component, and so the Assembly Component has a &amp;lt;path&amp;gt; element and a &amp;lt;file&amp;gt; element.&amp;#160; The element name for the collection is &amp;lt;assemblies&amp;gt; rather than &amp;lt;files&amp;gt; and the element name for a single assembly is &amp;lt;assembly&amp;gt; rather than &amp;lt;file&amp;gt;,&amp;#160; but in code the actual copying of the file is handled by the base FileInstaller.&lt;/p&gt;

&lt;p&gt;While the &amp;lt;version&amp;gt; element is defined for the File Component it is not really used for standard files.&amp;#160; However the version element is important for assemblies.&lt;/p&gt;

&lt;h3&gt;Registering Assemblies&lt;/h3&gt;

&lt;p&gt;One of the problems with earlier versions of DotNetNuke is in handling assembly versioning.&amp;#160; Each module, when installed just extracts its assemblies and copies them to the /bin folder, regardless of whether an existing version of the assembly is already in use.&amp;#160; &lt;/p&gt;

&lt;p&gt;This makes life difficult, if module developers use 3rd party libraries of any kind – either their own shared code or controls from commercial vendors.&amp;#160; For example, if Module A uses Assembly A version 1 (Assembly A1) and Module B uses Assembly A version 2 (Assembly A2), then if Module A is installed after Module B it could break Module B as the older version (A1) is installed over the version Module B expects (A2).&lt;/p&gt;

&lt;p&gt;Conversely, on uninstall, Module A will remove the associated assembly, which will again break Module B.&lt;/p&gt;

&lt;p&gt;This situation is solved in the new Installer, by using the &amp;lt;version&amp;gt; element and by using assembly referencing.&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top"&gt;
        &lt;h3&gt;Listing 2 – The InstallFile method of the AssemblyInstaller&lt;/h3&gt;
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top"&gt;
        &lt;div class="csharpcode"&gt;
          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;Protected&lt;/span&gt; &lt;span class="kwrd"&gt;Overrides&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; InstallFile(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; file &lt;span class="kwrd"&gt;As&lt;/span&gt; InstallFile) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Boolean&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; bSuccess &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Boolean&lt;/span&gt; = &lt;span class="kwrd"&gt;True&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;If&lt;/span&gt; file.Action = &lt;span class="str"&gt;&amp;quot;UnRegister&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        DeleteFile(file)&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="rem"&gt;'Attempt to register assembly this will return False if the assembly exists&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="rem"&gt;'and true if it does not or is older&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; returnCode &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Integer&lt;/span&gt; = DataProvider.Instance.RegisterAssembly(&lt;span class="kwrd"&gt;Me&lt;/span&gt;.Package.PackageID, &lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                                                         file.Name, file.Version.ToString(3))&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="kwrd"&gt;Select&lt;/span&gt; &lt;span class="kwrd"&gt;Case&lt;/span&gt; returnCode&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            &lt;span class="kwrd"&gt;Case&lt;/span&gt; 0&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                &lt;span class="rem"&gt;'Assembly Does Not Exist&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                Log.AddInfo(Util.ASSEMBLY_Added + &lt;span class="str"&gt;&amp;quot; - &amp;quot;&lt;/span&gt; + file.FullName)&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            &lt;span class="kwrd"&gt;Case&lt;/span&gt; 1&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                &lt;span class="rem"&gt;'Older version of Assembly Exists&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                Log.AddInfo(Util.ASSEMBLY_Updated + &lt;span class="str"&gt;&amp;quot; - &amp;quot;&lt;/span&gt; + file.FullName)&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="kwrd"&gt;Case&lt;/span&gt; 2, 3&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;                &lt;span class="rem"&gt;'Assembly already Registered&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                Log.AddInfo(Util.ASSEMBLY_Registered + &lt;span class="str"&gt;&amp;quot; - &amp;quot;&lt;/span&gt; + file.FullName)&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Select&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        &lt;span class="rem"&gt;'If assembly not registered, is newer (or is the same version and we are in repair mode)&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        &lt;span class="kwrd"&gt;If&lt;/span&gt; returnCode &amp;lt; 2 &lt;span class="kwrd"&gt;OrElse&lt;/span&gt; (returnCode = 2 &lt;span class="kwrd"&gt;AndAlso&lt;/span&gt; file.InstallerInfo.RepairInstall) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            &lt;span class="rem"&gt;'Call base class version to copy file to \bin&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            bSuccess = &lt;span class="kwrd"&gt;MyBase&lt;/span&gt;.InstallFile(file)&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;    &lt;span class="kwrd"&gt;Return&lt;/span&gt; bSuccess&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; Function&lt;/pre&gt;
        &lt;/div&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;The AssemblyInstaller overrides the InstallFile method of the base FileComponent (it also overrides the DeleteFile method – see later), and before copying the file into the /bin folder, it registers the assembly in the database (see Listing 2).&amp;#160; The RegisterAssembly method checks if the assembly is already registered by another extension and returns one of 4 return Codes.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;0 – Assembly does not exist &lt;/li&gt;

  &lt;li&gt;1 – An older version of the assembly exists &lt;/li&gt;

  &lt;li&gt;2 – The same version of the assembly exists &lt;/li&gt;

  &lt;li&gt;3 – A newer version of the assembly exists &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the return code is 0 or 1 then the file is copied (as the assembly does not exist or is older than the current version) by calling the base FileInstaller class’s InstallFile method.&amp;#160; If the return code is 2 the assembly is only copied if we are repairing the install, and if the return code is 3 the assembly is not copied as it could potentially break another extension that is already installed.&lt;/p&gt;

&lt;p&gt;The RegisterAssemby method adds an entry into the Assemblies table, recording the PackageID of the Extension which registered the assembly.&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="2" width="600"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" width="600"&gt;
        &lt;h3&gt;Figure 1 – The Assemblies Table&lt;/h3&gt;
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="600"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Assemblies_Table" border="0" alt="Assemblies_Table" src="http://www.charlesnurse.com/image.axd?picture=Assemblies_Table.png" width="541" height="449" /&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;h3&gt;&amp;#160;&lt;/h3&gt;

&lt;h3&gt;UnRegistering Assemblies&lt;/h3&gt;

&lt;p&gt;On uninstall the reverse process happens.&amp;#160; As mentioned above, the AssemblyInstaller also overrides the base FileInstaller’s DeleteFile method.&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top"&gt;
        &lt;h3&gt;Listing 3 – The DeleteFile method of the AssemblyInstaller&lt;/h3&gt;
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top"&gt;
        &lt;div class="csharpcode"&gt;
          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;Protected&lt;/span&gt; &lt;span class="kwrd"&gt;Overrides&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; DeleteFile(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; file &lt;span class="kwrd"&gt;As&lt;/span&gt; InstallFile)&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="rem"&gt;'Attempt to unregister assembly this will return False if the &lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="rem"&gt;'assembly is used by another package and cannot be delete and&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="rem"&gt;'true if it is not being used and can be deleted&lt;/span&gt;&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;If&lt;/span&gt; DataProvider.Instance.UnRegisterAssembly(&lt;span class="kwrd"&gt;Me&lt;/span&gt;.Package.PackageID, file.Name) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        Log.AddInfo(Util.ASSEMBLY_UnRegistered + &lt;span class="str"&gt;&amp;quot; - &amp;quot;&lt;/span&gt; + file.FullName)&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="rem"&gt;'Call base class version to deleteFile file from \bin&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;MyBase&lt;/span&gt;.DeleteFile(file)&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        Log.AddInfo(Util.ASSEMBLY_InUse + &lt;span class="str"&gt;&amp;quot; - &amp;quot;&lt;/span&gt; + file.FullName)&lt;/pre&gt;

          &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;/pre&gt;

          &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; Sub&lt;/pre&gt;
        &lt;/div&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;In the DeleteFile method (see Listing 3), the UnRegisterAssembly method is called.&amp;#160; This method removes the record from the assemblies table and returns a boolean value:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;true – the registration was the only registration for this assembly and the assembly can be safely deleted &lt;/li&gt;

  &lt;li&gt;false – there are other extensions which still require the assembly and the assembly should not be deleted &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the result of this is that, by using assembly counting, we can improve the situation where shared assemblies are being used.&amp;#160; The only remaining case which could break Extensions is if a shared assembly does not retain binary compatibility in newer versions.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThoughtsFromTheWetCoast/~4/dz54cc5M3xE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ThoughtsFromTheWetCoast/~3/dz54cc5M3xE/post.aspx</link>
      <author>charles.nurse.nospam@nospam.dotnetnuke.com (cnurse)</author>
      <comments>http://www.charlesnurse.com/post/The-New-Extension-Installer-Manifest-Part-4-Assembly-Component.aspx#comment</comments>
      <guid isPermaLink="false">http://www.charlesnurse.com/post.aspx?id=ef440612-1210-4fa9-96d6-c635365998e1</guid>
      <pubDate>Wed, 11 Feb 2009 09:14:37 -0700</pubDate>
      <category>DotNetNuke</category>
      <dc:publisher>cnurse</dc:publisher>
      <pingback:server>http://www.charlesnurse.com/pingback.axd</pingback:server>
      <pingback:target>http://www.charlesnurse.com/post.aspx?id=ef440612-1210-4fa9-96d6-c635365998e1</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.charlesnurse.com/trackback.axd?id=ef440612-1210-4fa9-96d6-c635365998e1</trackback:ping>
      <wfw:comment>http://www.charlesnurse.com/post/The-New-Extension-Installer-Manifest-Part-4-Assembly-Component.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.charlesnurse.com/syndication.axd?post=ef440612-1210-4fa9-96d6-c635365998e1</wfw:commentRss>
    <feedburner:origLink>http://www.charlesnurse.com/post.aspx?id=ef440612-1210-4fa9-96d6-c635365998e1</feedburner:origLink></item>
    <item>
      <title>Nurse Family History – Samuel Nurse of Hanham (Born 1809)</title>
      <description>&lt;p&gt;In the previous &lt;a href="http://www.charlesnurse.com/post/Nurse-Family-History-Robert-Nurse-of-Hanham-1821.aspx"&gt;article&lt;/a&gt; in this blog series I described the life of Robert Nurse (my great-great-grandfather).&amp;#160; Robert was the youngest child and his older brother Samuel, was also my great-great-grandfather, as Robert’s son Robert Francis Nurse married Samuel’s daughter Sarah Elizabeth Nurse.&lt;/p&gt;  &lt;p&gt;Samuel married Dinah Willis on Christmas Day 1848.&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="700"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="326"&gt;         &lt;h6&gt;Figure 1 – Samuel Nurse (c 1860)&lt;/h6&gt;       &lt;/td&gt;        &lt;td valign="top" width="15"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="357"&gt;         &lt;h6&gt;Figure 2 – Dinah Nurse&lt;/h6&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="325"&gt;&lt;a href="http://www.charlesnurse.com/image.axd?picture=SamuelNc1860.jpg" rel="lightbox"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Samuel N c1860" border="0" alt="Samuel N c1860" src="http://www.charlesnurse.com/image.axd?picture=SamuelNc1860_thumb.jpg" width="312" height="484" /&gt;&lt;/a&gt; &lt;/td&gt;        &lt;td valign="top" width="15"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="357"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Dinah Nurse c 1870" border="0" alt="Dinah Nurse c 1870" src="http://www.charlesnurse.com/image.axd?picture=DinahNursec1870.jpg" width="345" height="484" /&gt; &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Dinah was the eldest of six children (5 daughters and one son) of Robert Willis and Dinah Leonard.[1],[2]&lt;/p&gt;  &lt;p&gt;Willis [3] is quite a popular name in Hanham, most of the Willises being labourers or quarrymen. [5] Robert however, was quite well off, being classified, as a Yeoman in both the 1851 and 1861 [5], [6], [7] censuses and his will,[8] where he leaves most of his estate to his daughter Dinah Willis, Samuel Nurse’s wife.&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="400"&gt;         &lt;h6&gt;Figure 3 – The Family of Samuel and Dinah Nurse&lt;/h6&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="SamuelDinahNurse" border="0" alt="SamuelDinahNurse" src="http://www.charlesnurse.com/image.axd?picture=SamuelDinahNurse.png" width="513" height="331" /&gt; &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;While both Samuel and his brother Robert had inherited the family malting business, it was Samuel who operated the business. Samuel and Dinah had three children a boy Robert Willis and two daughters Sarah Elizabeth and Frances Willis.&lt;/p&gt;  &lt;hr width="95%" /&gt;  &lt;h2&gt;Bibliography and Notes&lt;/h2&gt;  &lt;p&gt;&lt;a href="#_ednref1" name="_edn1"&gt;[1]&lt;/a&gt; Personal Notes of William Richmond Nurse, 1882-1937.&lt;/p&gt;  &lt;p&gt;&lt;a href="#_ednref2" name="_edn2"&gt;[2]&lt;/a&gt; Parish Register of St. Nicholas Church, City of Bristol, 1754-1812. Microfiched by the Bristol Record Office, Bristol.&lt;/p&gt;  &lt;p&gt;&lt;a href="#_ftnref1_9075" name="_ftn1_9075"&gt;[3]&lt;/a&gt; Due to the number of Willis families in the Hanham/Bitton area it has proven quite difficult to trace the Willis line back very far. Robert Willis and Dinah Leonard were married 24 Jun 1810 at St. Nicholas Church in the city of Bristol.&lt;/p&gt;  &lt;p&gt;Robert, born 28 Feb 1777, was the one of eleven children (6 boys and 5 girls) of Samuel Willis and Sarah Rawbone, who were married on 1 May 1774 at St. Mary, Bitton. [4]&lt;/p&gt;  &lt;p&gt;Samuel Willis was the son of Thomas Willis and Elizabeth Hicks and Sarah Rawbone was the daughter of John and Jane Rawbone (and the sister of Betty Rawbone who married John Couch and was the mother of Salley Couch).&lt;/p&gt;  &lt;p&gt;&lt;a href="#_ednref1" name="_edn1"&gt;[4]&lt;/a&gt; Parish Register for the Parish of St. Mary, Bitton, including the chapelries of Hanham and Oldland, 1571 - 1934. Microfiched by the Bristol Record Office, Bristol.&lt;/p&gt;  &lt;p&gt;&lt;a href="#_ednref1" name="_edn1"&gt;[5]&lt;/a&gt; 1851 National Census. Microfiche copy held at the Bristol Reference Library.&lt;/p&gt;  &lt;p&gt;&lt;a href="#_ednref1" name="_edn1"&gt;[6]&lt;/a&gt; 1841 National Census. Microfiche copy held at the Bristol Reference Library.&lt;/p&gt;  &lt;p&gt;&lt;a href="#_ednref1" name="_edn1"&gt;[7]&lt;/a&gt; 1861 National Census. Microfiche copy held at the Bristol Reference Library.&lt;/p&gt;  &lt;p&gt;&lt;a href="#_ednref3" name="_edn3"&gt;[8]&lt;/a&gt; The Will of Robert Willis, dated 19 Jun 1863; Bristol Wills, vol. 26, Bristol Record Office.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThoughtsFromTheWetCoast/~4/OrkZvTAK5AE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ThoughtsFromTheWetCoast/~3/OrkZvTAK5AE/post.aspx</link>
      <author>charles.nurse.nospam@nospam.dotnetnuke.com (cnurse)</author>
      <comments>http://www.charlesnurse.com/post/Nurse-Family-History-Samuel-Nurse-of-Hanham-Born-1809.aspx#comment</comments>
      <guid isPermaLink="false">http://www.charlesnurse.com/post.aspx?id=db403767-8f2c-478c-b380-b12d60d14d52</guid>
      <pubDate>Tue, 10 Feb 2009 07:20:42 -0700</pubDate>
      <category>Genealogy</category>
      <dc:publisher>cnurse</dc:publisher>
      <pingback:server>http://www.charlesnurse.com/pingback.axd</pingback:server>
      <pingback:target>http://www.charlesnurse.com/post.aspx?id=db403767-8f2c-478c-b380-b12d60d14d52</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.charlesnurse.com/trackback.axd?id=db403767-8f2c-478c-b380-b12d60d14d52</trackback:ping>
      <wfw:comment>http://www.charlesnurse.com/post/Nurse-Family-History-Samuel-Nurse-of-Hanham-Born-1809.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.charlesnurse.com/syndication.axd?post=db403767-8f2c-478c-b380-b12d60d14d52</wfw:commentRss>
    <feedburner:origLink>http://www.charlesnurse.com/post.aspx?id=db403767-8f2c-478c-b380-b12d60d14d52</feedburner:origLink></item>
    <item>
      <title>Back Again</title>
      <description>&lt;p&gt;I was checking this blog yesterday, and I realized that I haven’t posted a single blog in 2009.&lt;/p&gt;  &lt;p&gt;Well, that’s not good.&amp;#160; &lt;/p&gt;  &lt;p&gt;The last few weeks I have been busy fixing bugs from the recently released DotNetNuke 5.0, and preparing for some of the enhancements we hope to introduce in the next major release.&amp;#160; We have three new developers and we will need to introduce some more formal practices.&amp;#160; This will be good for me personally and for the project.&lt;/p&gt;  &lt;p&gt;My initial plan, when I started this blog was to blog daily.&amp;#160; I hope to get back into a routine of frequently posting here, but with a more achievable goal (3-4 times weekly).&lt;/p&gt;  &lt;p&gt;So please check back here frequently, or subscribe through the subscribe link, and hopefully you will find my musings of interest.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThoughtsFromTheWetCoast/~4/J_ShjIbVvkI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ThoughtsFromTheWetCoast/~3/J_ShjIbVvkI/post.aspx</link>
      <author>charles.nurse.nospam@nospam.dotnetnuke.com (cnurse)</author>
      <comments>http://www.charlesnurse.com/post/Back-Again.aspx#comment</comments>
      <guid isPermaLink="false">http://www.charlesnurse.com/post.aspx?id=fce46062-ac1d-4d62-96d5-28b45b4b3d11</guid>
      <pubDate>Mon, 09 Feb 2009 09:12:15 -0700</pubDate>
      <category>Random Thoughts</category>
      <dc:publisher>cnurse</dc:publisher>
      <pingback:server>http://www.charlesnurse.com/pingback.axd</pingback:server>
      <pingback:target>http://www.charlesnurse.com/post.aspx?id=fce46062-ac1d-4d62-96d5-28b45b4b3d11</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.charlesnurse.com/trackback.axd?id=fce46062-ac1d-4d62-96d5-28b45b4b3d11</trackback:ping>
      <wfw:comment>http://www.charlesnurse.com/post/Back-Again.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.charlesnurse.com/syndication.axd?post=fce46062-ac1d-4d62-96d5-28b45b4b3d11</wfw:commentRss>
    <feedburner:origLink>http://www.charlesnurse.com/post.aspx?id=fce46062-ac1d-4d62-96d5-28b45b4b3d11</feedburner:origLink></item>
    <item>
      <title>Happy New Year - 2009</title>
      <description>&lt;p&gt;It is dinner time on New Years Eve, here on the Wet Coast.&amp;#160; Most of the world is already celebrating the New Year, but as in many things we are a bit late here in North America.&lt;/p&gt;  &lt;h2&gt;Looking Back&lt;/h2&gt;  &lt;p&gt;2008 has been a challenging year for many people as the financial crisis struck.&amp;#160; Many retired people or people approaching retirement took a big hit in their income as their savings were decimated.&amp;#160; Thankfully, I still have a few years to go, for my retirement savings to recover.&lt;/p&gt;  &lt;p&gt;&lt;a href="https://mvp.support.microsoft.com"&gt;&lt;img style="margin: 0px 20px 0px 0px; display: inline" title="MVPLogo" border="0" alt="MVPLogo" align="left" src="http://www.charlesnurse.com/image.axd?picture=WindowsLiveWriter/HappyNewYear2009_FE36/MVPLogo_3.gif" width="115" height="180" /&gt;&lt;/a&gt; For me 2008 was quite a good year.&amp;#160; In January, my Microsoft MVP award was renewed for a 2nd year, and a month later I was nominated to the prestigious ASPInsiders group.&amp;#160; Both of these “groups” held summits in Seattle and I met a lot of other ASP.NET developers who I respect.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://aspinsiders.com/"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 20px; display: inline; border-top: 0px; border-right: 0px" title="insiders" border="0" alt="insiders" align="right" src="http://www.charlesnurse.com/image.axd?picture=WindowsLiveWriter/HappyNewYear2009_FE36/insiders_3.gif" width="220" height="92" /&gt;&lt;/a&gt; In June, my wife Eileen and I celebrated our 25th Wedding Anniversary by travelling to Italy for 17 days.&amp;#160; I have blogged about this in some &lt;a href="http://www.charlesnurse.com/?tag=/italy"&gt;depth&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The fall was full of speaking engagements.&amp;#160; It began with &lt;a href="http://www.sdc.nl/"&gt;Open Force Europe&lt;/a&gt; in the Netherlands in early October, followed by a trip to England to visit family.&amp;#160; In November I spoke at the .NET BC User Group meeting at BCIT and at &lt;a href="http://www.openforce08.com/"&gt;Open Force North America/DevConnections&lt;/a&gt; in Las Vegas.&lt;/p&gt;  &lt;p&gt;Finally, in late November, &lt;a href="http://www.dotnetnuke.com/News/MediaReleases/DotNetNukeCorporationRaisesSeriesACapital/tabid/1185/Default.aspx"&gt;DotNetNuke Corporation received Series A Venture Financing&lt;/a&gt; which hopefully will allow us to grow, both the company and the community.&lt;/p&gt;  &lt;h2&gt;Looking Forward – 2009&lt;/h2&gt;  &lt;p&gt;2009 starts tomorrow.&amp;#160; For me, January 1st sees me start a new job as I become a salaried employee of DotNetNuke Corporation (I had previously been working on a personal services contract).&amp;#160; We have already hired a few new developers that will also be starting early in the new year, and in February or March we should be able to open an office, somewhere in the Fraser Valley, just east of Vancouver.&amp;#160; &lt;/p&gt;  &lt;p&gt;It will feel strange to go back to commuting to work again – I have worked from home since 1995 – but I am looking forward to working closely with a team of excellent programmers as we grow DotNetNuke.&lt;/p&gt;  &lt;p&gt;We don’t have any travel plans (yet) this year, although I expect I will be at one or both Open Force conferences.&amp;#160; I would really like to travel to Australia (hint, hint).&lt;/p&gt;  &lt;p&gt;To conclude, I wish everybody a Happy New Year.&amp;#160; If 2008 was bad for you, I hope 2009 will be better.&amp;#160; If 2008 was good for you, I hope 2009 will continue that trend.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThoughtsFromTheWetCoast/~4/fp8vk2upnkw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ThoughtsFromTheWetCoast/~3/fp8vk2upnkw/post.aspx</link>
      <author>charles.nurse.nospam@nospam.dotnetnuke.com (cnurse)</author>
      <comments>http://www.charlesnurse.com/post/Happy-New-Year-2009.aspx#comment</comments>
      <guid isPermaLink="false">http://www.charlesnurse.com/post.aspx?id=d761b823-744f-4781-9b7e-131d64d51a03</guid>
      <pubDate>Wed, 31 Dec 2008 19:04:58 -0700</pubDate>
      <category>Personal</category>
      <category>DotNetNuke</category>
      <dc:publisher>cnurse</dc:publisher>
      <pingback:server>http://www.charlesnurse.com/pingback.axd</pingback:server>
      <pingback:target>http://www.charlesnurse.com/post.aspx?id=d761b823-744f-4781-9b7e-131d64d51a03</pingback:target>
      <slash:comments>11</slash:comments>
      <trackback:ping>http://www.charlesnurse.com/trackback.axd?id=d761b823-744f-4781-9b7e-131d64d51a03</trackback:ping>
      <wfw:comment>http://www.charlesnurse.com/post/Happy-New-Year-2009.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.charlesnurse.com/syndication.axd?post=d761b823-744f-4781-9b7e-131d64d51a03</wfw:commentRss>
    <feedburner:origLink>http://www.charlesnurse.com/post.aspx?id=d761b823-744f-4781-9b7e-131d64d51a03</feedburner:origLink></item>
    <item>
      <title>Merry Christmas from the Wet Coast</title>
      <description>&lt;p&gt;It is Christmas Eve on the Wet Coast, and I am sitting in my office looking out on a Winter Wonderland - and to prove it below is a picture taken from the front porch of my house, just a few minutes ago.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.charlesnurse.com/image.axd?picture=WindowsLiveWriter/MerryChristmasfromtheWetCoast_900B/IMG_0987.jpg" rel="lightbox"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="IMG_0987" border="0" alt="IMG_0987" src="http://www.charlesnurse.com/image.axd?picture=WindowsLiveWriter/MerryChristmasfromtheWetCoast_900B/IMG_0987_thumb.jpg" width="660" height="500" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;As you can surmise we are not going anywhere soon.&amp;#160; Thankfully we finished all our holiday preparations yesterday, so today and tomorrow we can focus on enjoying the holiday spirit (my favourite is GlenMorangie Single Malt Scotch Whiskey).&lt;/p&gt;  &lt;p&gt;For those of you who are Christian like us, we wish you a Merry Christmas, and for everyone we wish you the best for the Holiday Season. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThoughtsFromTheWetCoast/~4/toPI1qqmCvc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ThoughtsFromTheWetCoast/~3/toPI1qqmCvc/post.aspx</link>
      <author>charles.nurse.nospam@nospam.dotnetnuke.com (cnurse)</author>
      <comments>http://www.charlesnurse.com/post/Merry-Christmas-from-the-Wet-Coast.aspx#comment</comments>
      <guid isPermaLink="false">http://www.charlesnurse.com/post.aspx?id=aebf8d55-99e6-4bb7-a7b6-7c600768ced6</guid>
      <pubDate>Wed, 24 Dec 2008 11:14:58 -0700</pubDate>
      <category>Personal</category>
      <dc:publisher>cnurse</dc:publisher>
      <pingback:server>http://www.charlesnurse.com/pingback.axd</pingback:server>
      <pingback:target>http://www.charlesnurse.com/post.aspx?id=aebf8d55-99e6-4bb7-a7b6-7c600768ced6</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.charlesnurse.com/trackback.axd?id=aebf8d55-99e6-4bb7-a7b6-7c600768ced6</trackback:ping>
      <wfw:comment>http://www.charlesnurse.com/post/Merry-Christmas-from-the-Wet-Coast.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.charlesnurse.com/syndication.axd?post=aebf8d55-99e6-4bb7-a7b6-7c600768ced6</wfw:commentRss>
    <feedburner:origLink>http://www.charlesnurse.com/post.aspx?id=aebf8d55-99e6-4bb7-a7b6-7c600768ced6</feedburner:origLink></item>
    <item>
      <title>Oxite – An update</title>
      <description>&lt;p&gt;In my last &lt;a href="http://www.charlesnurse.com/post/Oxite-MVC-Best-Practices.aspx"&gt;blog&lt;/a&gt; I criticized the team that released Oxite recently.&amp;#160; My concern was that they were promoting Oxite as a “real-world sample using ASP.NET MVC”, but as many others have said it is a poor example.&lt;/p&gt;  &lt;p&gt;Since my earlier blog there have been a few more blogs on the topic.&lt;/p&gt;  &lt;p&gt;Casey Charlton -&amp;#160; &lt;a href="http://devlicio.us/blogs/casey/archive/2008/12/19/oxite-an-example-of-how-not-to-write-mvc-applications.aspx"&gt;Oxite - An Example of How Not To Write MVC Applications&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Rob Conery - &lt;a href="http://blog.wekeroad.com/blog/oxite-refactor-take-1/"&gt;Oxite Refactor, Take 1&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Scott Hansleman - &lt;a href="http://www.hanselman.com/blog/ASPNETMVCSamplesOxiteAndCommunity.aspx"&gt;ASP.NET MVC Samples, Oxite, and Community&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Oren Eini - &lt;a href="http://ayende.com/Blog/archive/2008/12/19/oxite-open-exchangable-informative-troubled-engine.aspx"&gt;Oxite: Open eXchangable Informative Troubled Engine&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;While Rob and Scott take a more conciliatory take – they are now of course Microsoft employees - the comment that for me “hits the nail on the head” is from &lt;a href="http://codebetter.com/blogs/glenn.block/archive/2008/12/19/on-oxite.aspx"&gt;Glenn Block&lt;/a&gt;, who is also an MS employee.&lt;/p&gt;  &lt;p&gt;He has a refreshingly honest comment.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;There is no excuse for this. There are tons of folks both internal to Microsoft or external that can help people who want to learn good practices for developing software. The fact that the MVC team was not even consulted by the Oxite guys is literally stunning.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;It is pretty clear now that releasing this was a marketing blunder.&amp;#160; As I mentioned in my earlier blog, I hope the development team can provide some better examples of how they believe this new “tool” can and should be used.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ThoughtsFromTheWetCoast/~4/obVTWQy_qtY" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ThoughtsFromTheWetCoast/~3/obVTWQy_qtY/post.aspx</link>
      <author>charles.nurse.nospam@nospam.dotnetnuke.com (cnurse)</author>
      <comments>http://www.charlesnurse.com/post/Oxite-An-Update.aspx#comment</comments>
      <guid isPermaLink="false">http://www.charlesnurse.com/post.aspx?id=09871b23-b28f-40e9-8871-66ab9d11a3dc</guid>
      <pubDate>Fri, 19 Dec 2008 14:11:41 -0700</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>cnurse</dc:publisher>
      <pingback:server>http://www.charlesnurse.com/pingback.axd</pingback:server>
      <pingback:target>http://www.charlesnurse.com/post.aspx?id=09871b23-b28f-40e9-8871-66ab9d11a3dc</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.charlesnurse.com/trackback.axd?id=09871b23-b28f-40e9-8871-66ab9d11a3dc</trackback:ping>
      <wfw:comment>http://www.charlesnurse.com/post/Oxite-An-Update.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.charlesnurse.com/syndication.axd?post=09871b23-b28f-40e9-8871-66ab9d11a3dc</wfw:commentRss>
    <feedburner:origLink>http://www.charlesnurse.com/post.aspx?id=09871b23-b28f-40e9-8871-66ab9d11a3dc</feedburner:origLink></item>
  </channel>
</rss>
