<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns: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:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>this.Pose() as Expert - .NET</title>
    <link>http://chrison.net/</link>
    <description />
    <language>en-us</language>
    <copyright>Christoph Wille</copyright>
    <lastBuildDate>Fri, 24 Oct 2008 06:09:45 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>christoph.wille@gmail.com</managingEditor>
    <webMaster>christoph.wille@gmail.com</webMaster>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=fc5c1984-84a0-4c59-943e-89f72841f014</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,fc5c1984-84a0-4c59-943e-89f72841f014.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,fc5c1984-84a0-4c59-943e-89f72841f014.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=fc5c1984-84a0-4c59-943e-89f72841f014</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <table cellpadding="5">
          <tbody>
            <tr>
              <td valign="top">
                <img src="http://chrison.net/content/binary/PDC2008Bling.jpg" border="0" />
              </td>
              <td valign="top">
                <p>
During PDC05 I put up a post <a href="http://chrison.net/PDCsIHaveAttendedSoFar.aspx">PDC's
I have attended so far</a>. Next week, I am going to add another one to the list -
PDC2008 is my seventh Professional Developers Conference. Kind of makes me look old
;-) 
</p>
                <p>
 
</p>
              </td>
            </tr>
          </tbody>
        </table>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=fc5c1984-84a0-4c59-943e-89f72841f014" />
      </body>
      <title>PDC2008 - PDC #7 For Me</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,fc5c1984-84a0-4c59-943e-89f72841f014.aspx</guid>
      <link>http://chrison.net/PDC2008PDC7ForMe.aspx</link>
      <pubDate>Fri, 24 Oct 2008 06:09:45 GMT</pubDate>
      <description>&lt;table cellpadding=5&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=top&gt;
&lt;img src="http://chrison.net/content/binary/PDC2008Bling.jpg" border=0&gt;&lt;/td&gt;
&lt;td valign=top&gt;
&lt;p&gt;
During PDC05 I put up a post &lt;a href="http://chrison.net/PDCsIHaveAttendedSoFar.aspx"&gt;PDC's
I have attended so far&lt;/a&gt;. Next week, I am going to add another one to the list -
PDC2008 is my seventh Professional Developers Conference. Kind of makes me look old
;-) 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=fc5c1984-84a0-4c59-943e-89f72841f014" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,fc5c1984-84a0-4c59-943e-89f72841f014.aspx</comments>
      <category>.NET</category>
      <category>this</category>
      <category>Training and Conferences</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=87d85c15-403c-4c3d-9dfd-606b6f7b4f6a</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,87d85c15-403c-4c3d-9dfd-606b6f7b4f6a.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,87d85c15-403c-4c3d-9dfd-606b6f7b4f6a.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=87d85c15-403c-4c3d-9dfd-606b6f7b4f6a</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://msdn.microsoft.com/en-us/library/system.string.indexof.aspx">IndexOf</a> has
overloads that take <a href="http://msdn.microsoft.com/en-us/library/system.stringcomparison.aspx">StringComparison</a> which
allows me to specify how the comparison is done: culture (in)sensitive, case (in)
sensitive, et cetera. Why is it that <a href="http://msdn.microsoft.com/en-us/library/system.string.contains.aspx">Contains</a> doesn't
sport such an overload? IndexOf makes a LINQ query look so much more ugly than Contains...
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=87d85c15-403c-4c3d-9dfd-606b6f7b4f6a" />
      </body>
      <title>Why No String.Contains(string, StringComparison)?</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,87d85c15-403c-4c3d-9dfd-606b6f7b4f6a.aspx</guid>
      <link>http://chrison.net/WhyNoStringContainsstringStringComparison.aspx</link>
      <pubDate>Wed, 08 Oct 2008 12:37:23 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/system.string.indexof.aspx"&gt;IndexOf&lt;/a&gt; has
overloads that take &lt;a href="http://msdn.microsoft.com/en-us/library/system.stringcomparison.aspx"&gt;StringComparison&lt;/a&gt; which
allows me to specify how the comparison is done: culture (in)sensitive, case (in)
sensitive, et cetera. Why is it that &lt;a href="http://msdn.microsoft.com/en-us/library/system.string.contains.aspx"&gt;Contains&lt;/a&gt; doesn't
sport such an overload? IndexOf makes a LINQ query look so much more ugly than Contains...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=87d85c15-403c-4c3d-9dfd-606b6f7b4f6a" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,87d85c15-403c-4c3d-9dfd-606b6f7b4f6a.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=059d9379-138d-419d-9672-8408db9e5ceb</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,059d9379-138d-419d-9672-8408db9e5ceb.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,059d9379-138d-419d-9672-8408db9e5ceb.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=059d9379-138d-419d-9672-8408db9e5ceb</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This time it is the Visual Studio 2008 extensions for Windows Sharepoint Services
3.0:
</p>
        <p>
          <img src="http://chrison.net/content/binary/anotherone_x64.png" border="0" />
        </p>
        <p>
Given all my past run-ins with developing on x64, how is anyone supposed get any development
work done on a x64 box? 
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=059d9379-138d-419d-9672-8408db9e5ceb" />
      </body>
      <title>Yet Another Microsoft Application Not Supporting x64</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,059d9379-138d-419d-9672-8408db9e5ceb.aspx</guid>
      <link>http://chrison.net/YetAnotherMicrosoftApplicationNotSupportingX64.aspx</link>
      <pubDate>Tue, 07 Oct 2008 16:36:13 GMT</pubDate>
      <description>&lt;p&gt;
This time it is the Visual Studio 2008 extensions for Windows Sharepoint Services
3.0:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/anotherone_x64.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Given all my past run-ins with developing on x64, how is anyone supposed get any development
work done on a x64 box? 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=059d9379-138d-419d-9672-8408db9e5ceb" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,059d9379-138d-419d-9672-8408db9e5ceb.aspx</comments>
      <category>.NET</category>
      <category>x64</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=05d23e24-27a1-4c6d-a6a8-31cd20f8f41a</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,05d23e24-27a1-4c6d-a6a8-31cd20f8f41a.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,05d23e24-27a1-4c6d-a6a8-31cd20f8f41a.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=05d23e24-27a1-4c6d-a6a8-31cd20f8f41a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The MSDN article <a href="http://msdn.microsoft.com/en-us/library/ms734701.aspx">Synchronous
and Asynchronous Operations</a> explains what options are available to you when using
WCF. It even tells me that svcutil.exe has an /async switch. Great!
</p>
        <p>
Now, back to my current home turf, Compact Framework. There is netCFsvcutil.exe, that
comes with the Compact Framework Power Toys 3.5. Guess what? That option isn't available
in this scaled down rendition of svcutil.
</p>
        <p>
Once again Compact Framework makes it so much harder to work productively, and here's
why:
</p>
        <p>
          <a href="http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx">http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx</a>
        </p>
        <p>
Quote: <em>Asynchronous delegates, specifically the BeginInvoke and EndInvoke methods,
are not supported in the .NET Compact Framework.</em></p>
        <p>
Back to the drawing board and the thread pool (most likely).
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=05d23e24-27a1-4c6d-a6a8-31cd20f8f41a" />
      </body>
      <title>Error: Unrecognized option 'async' specified</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,05d23e24-27a1-4c6d-a6a8-31cd20f8f41a.aspx</guid>
      <link>http://chrison.net/ErrorUnrecognizedOptionAsyncSpecified.aspx</link>
      <pubDate>Tue, 05 Aug 2008 16:43:23 GMT</pubDate>
      <description>&lt;p&gt;
The MSDN article &lt;a href="http://msdn.microsoft.com/en-us/library/ms734701.aspx"&gt;Synchronous
and Asynchronous Operations&lt;/a&gt; explains what options are available to you when using
WCF. It even tells me that svcutil.exe has an /async switch. Great!
&lt;/p&gt;
&lt;p&gt;
Now, back to my current home turf, Compact Framework. There is netCFsvcutil.exe, that
comes with the Compact Framework Power Toys 3.5. Guess what? That option isn't available
in this scaled down rendition of svcutil.
&lt;/p&gt;
&lt;p&gt;
Once again Compact Framework makes it so much harder to work productively, and here's
why:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx"&gt;http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Quote: &lt;em&gt;Asynchronous delegates, specifically the BeginInvoke and EndInvoke methods,
are not supported in the .NET Compact Framework.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Back to the drawing board and the thread pool (most likely).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=05d23e24-27a1-4c6d-a6a8-31cd20f8f41a" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,05d23e24-27a1-4c6d-a6a8-31cd20f8f41a.aspx</comments>
      <category>.NET</category>
      <category>3.5</category>
      <category>Smartphone and PocketPC</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=f0d1f505-a9c2-4536-81b1-862c87c7e745</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,f0d1f505-a9c2-4536-81b1-862c87c7e745.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,f0d1f505-a9c2-4536-81b1-862c87c7e745.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=f0d1f505-a9c2-4536-81b1-862c87c7e745</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I am currently working on a Compact Framework project, and started development on
a different machine - where I successfully used the Cellular Emulator of the Windows
Mobile SDK. Today, on the other machine (the laptop), it didn't start but present
me with the following error message:
</p>
        <p>
          <img src="http://chrison.net/content/binary/sevenpairsofsomething.png" border="0" />
        </p>
        <p>
After some searching (on the G-word search engine), I came across this post:
</p>
        <p>
          <a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3538593&amp;SiteID=1">http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3538593&amp;SiteID=1</a>
        </p>
        <p>
Sure enough I am using Vista x64, heck, we are living in 2008 with multicore CPUs
and 4GB+ of RAM!
</p>
        <p>
And here is the Catch 22: when moving development to a Virtual PC image, you don't
get USB ports which you need for connecting to a real device...
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=f0d1f505-a9c2-4536-81b1-862c87c7e745" />
      </body>
      <title>Mid-2008 and x64 is Still a Dead End</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,f0d1f505-a9c2-4536-81b1-862c87c7e745.aspx</guid>
      <link>http://chrison.net/Mid2008AndX64IsStillADeadEnd.aspx</link>
      <pubDate>Wed, 30 Jul 2008 14:55:11 GMT</pubDate>
      <description>&lt;p&gt;
I am currently working on a Compact Framework project, and started development on
a different machine - where I successfully used the Cellular Emulator of the Windows
Mobile SDK. Today, on the other machine (the laptop), it didn't start but present
me with the following error message:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/sevenpairsofsomething.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
After some searching (on the G-word search engine), I came across this post:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3538593&amp;amp;SiteID=1"&gt;http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3538593&amp;amp;SiteID=1&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Sure enough I am using Vista x64, heck, we are living in 2008 with multicore CPUs
and 4GB+ of RAM!
&lt;/p&gt;
&lt;p&gt;
And here is the Catch 22: when moving development to a Virtual PC image, you don't
get USB ports which you need for connecting to a real device...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=f0d1f505-a9c2-4536-81b1-862c87c7e745" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,f0d1f505-a9c2-4536-81b1-862c87c7e745.aspx</comments>
      <category>.NET</category>
      <category>Smartphone and PocketPC</category>
      <category>Vista</category>
      <category>x64</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=9fbb839e-8b5a-4739-9d68-2f50f22f9114</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,9fbb839e-8b5a-4739-9d68-2f50f22f9114.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,9fbb839e-8b5a-4739-9d68-2f50f22f9114.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=9fbb839e-8b5a-4739-9d68-2f50f22f9114</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This is a bugfix release for the previously posted <a href="http://chrison.net/nGalleryUpdatedForASPNET20.aspx">port
of nGallery to ASP.NET 3.5</a>. The following changes are incorporated:
</p>
        <ul>
          <li>
Bugfix: slideshow had "photos/" hardcoded in nGalleryLib (for navigation buttons)</li>
          <li>
Bugfix: Event log exceptions, please see <a href="http://todotnet.com/archive/0001/01/01/7472.aspx">Get
GoogleBot to crash your .NET 2.0 site</a> (plus <a href="http://www.mattcutts.com/blog/asp-net-2-and-url-rewriting-sometimes-harmful/">ASP.NET
2 + url rewriting considered harmful in some cases</a>). <a href="http://blogs.developpeur.org/nix/">Nicolas
Sorel</a> was nice enough to provide me with his .browser definition files.</li>
          <li>
Bugfix: default_highlight_image.jpg no longer resided in /photos and therefore caused
an exception for galleries that had no highlighted image; moved it back to \photos</li>
          <li>
Change: AlbumHandler no longer implements IHttpHandler</li>
          <li>
Change: AssemblyInfo.cs changed version to 2.0 to differentiate from original 1.6.1</li>
        </ul>
        <p>
That's all the changes that happened, here are the source and deployment files:
</p>
        <p>
          <a href="http://chrison.net/content/binary/nGalleryTNG2_ProjectFiles.zip">nGalleryTNG2_ProjectFiles.zip
(2.95 MB)</a>
          <br />
          <a href="http://chrison.net/content/binary/nGalleryTNG2_WebFiles.zip">nGalleryTNG2_WebFiles.zip
(1.03 MB)</a>
        </p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=9fbb839e-8b5a-4739-9d68-2f50f22f9114" />
      </body>
      <title>nGallery TNG Update</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,9fbb839e-8b5a-4739-9d68-2f50f22f9114.aspx</guid>
      <link>http://chrison.net/nGalleryTNGUpdate.aspx</link>
      <pubDate>Thu, 13 Dec 2007 10:42:52 GMT</pubDate>
      <description>&lt;p&gt;
This is a bugfix release for the previously posted &lt;a href="http://chrison.net/nGalleryUpdatedForASPNET20.aspx"&gt;port
of nGallery to ASP.NET 3.5&lt;/a&gt;. The following changes are incorporated:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Bugfix: slideshow had "photos/" hardcoded in nGalleryLib (for navigation buttons)&lt;/li&gt;
&lt;li&gt;
Bugfix: Event log exceptions, please see&amp;nbsp;&lt;a href="http://todotnet.com/archive/0001/01/01/7472.aspx"&gt;Get
GoogleBot to crash your .NET 2.0 site&lt;/a&gt; (plus &lt;a href="http://www.mattcutts.com/blog/asp-net-2-and-url-rewriting-sometimes-harmful/"&gt;ASP.NET
2 + url rewriting considered harmful in some cases&lt;/a&gt;). &lt;a href="http://blogs.developpeur.org/nix/"&gt;Nicolas
Sorel&lt;/a&gt; was nice enough to provide me with his .browser definition files.&lt;/li&gt;
&lt;li&gt;
Bugfix: default_highlight_image.jpg no longer resided in /photos and therefore caused
an exception for galleries that had no highlighted image; moved it back to \photos&lt;/li&gt;
&lt;li&gt;
Change: AlbumHandler no longer implements IHttpHandler&lt;/li&gt;
&lt;li&gt;
Change: AssemblyInfo.cs changed version to 2.0 to differentiate from original 1.6.1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
That's all the changes that happened, here are the source and deployment files:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/nGalleryTNG2_ProjectFiles.zip"&gt;nGalleryTNG2_ProjectFiles.zip
(2.95 MB)&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://chrison.net/content/binary/nGalleryTNG2_WebFiles.zip"&gt;nGalleryTNG2_WebFiles.zip
(1.03 MB)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=9fbb839e-8b5a-4739-9d68-2f50f22f9114" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,9fbb839e-8b5a-4739-9d68-2f50f22f9114.aspx</comments>
      <category>.NET</category>
      <category>ASP.NET</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=93b1e18f-b3ad-4371-b06b-6cd580f46b62</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,93b1e18f-b3ad-4371-b06b-6cd580f46b62.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,93b1e18f-b3ad-4371-b06b-6cd580f46b62.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=93b1e18f-b3ad-4371-b06b-6cd580f46b62</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I posted a version of the <a href="http://chrison.net/ReallySimpleGuestbookWithXLinq.aspx">Really
Simple Guestbook - With XLinq</a> for Orcas Beta 2 earlier on this blog. Today, I
updated this small application for VS2008 RTM. The following changes are incorporated:
</p>
        <ul>
          <li>
It is now a Web project, no longer file system based 
</li>
          <li>
It includes <a href="http://codeplex.com/aip">AIP</a> for form spam protection (aka
captcha)</li>
        </ul>
        <p>
I decided to not include the <a href="http://www.microsoft.com/downloads/details.aspx?familyid=EFB9C819-53FF-4F82-BFAF-E11625130C25&amp;displaylang=en">Microsoft
Anti-Cross Site Scripting Library V1.5</a>, that is up to the reader if additional
security is required (note: you'd have to add this to AddEntry.aspx's logic of inserting
new guestbook entries).
</p>
        <p>
Download: <a href="http://chrison.net/content/binary/XlinqGuestbook.zip">XlinqGuestbook.zip
(165.53 KB)</a>, License: BSD
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=93b1e18f-b3ad-4371-b06b-6cd580f46b62" />
      </body>
      <title>Xlinq Guestbook for VS 2008 RTM</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,93b1e18f-b3ad-4371-b06b-6cd580f46b62.aspx</guid>
      <link>http://chrison.net/XlinqGuestbookForVS2008RTM.aspx</link>
      <pubDate>Fri, 30 Nov 2007 08:55:46 GMT</pubDate>
      <description>&lt;p&gt;
I posted a version of the&amp;nbsp;&lt;a href="http://chrison.net/ReallySimpleGuestbookWithXLinq.aspx"&gt;Really
Simple Guestbook - With XLinq&lt;/a&gt; for Orcas Beta 2 earlier on this blog. Today, I
updated this small application for VS2008 RTM. The following changes are incorporated:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
It is now a Web project, no longer file system based 
&lt;li&gt;
It includes &lt;a href="http://codeplex.com/aip"&gt;AIP&lt;/a&gt; for form spam protection (aka
captcha)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I decided&amp;nbsp;to not include&amp;nbsp;the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=EFB9C819-53FF-4F82-BFAF-E11625130C25&amp;amp;displaylang=en"&gt;Microsoft
Anti-Cross Site Scripting Library V1.5&lt;/a&gt;, that is up to the reader if additional
security is required (note: you'd have to add this to AddEntry.aspx's logic of inserting
new guestbook entries).
&lt;/p&gt;
&lt;p&gt;
Download: &lt;a href="http://chrison.net/content/binary/XlinqGuestbook.zip"&gt;XlinqGuestbook.zip
(165.53 KB)&lt;/a&gt;, License: BSD
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=93b1e18f-b3ad-4371-b06b-6cd580f46b62" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,93b1e18f-b3ad-4371-b06b-6cd580f46b62.aspx</comments>
      <category>.NET</category>
      <category>3.5</category>
      <category>ASP.NET</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=14b40c9f-d317-4204-861e-ded1262fac16</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,14b40c9f-d317-4204-861e-ded1262fac16.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,14b40c9f-d317-4204-861e-ded1262fac16.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=14b40c9f-d317-4204-861e-ded1262fac16</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I updated the <a href="http://www.codeplex.com/TFSCCPolicy">TFS Code Comment Checking
Policy</a> so that it works with VSTS 20008 RTM. The <a href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=TFSCCPolicy&amp;ReleaseId=8716">downloaded
labeled as Beta 1</a> comes with the well-known setup, the changes to the August test
version are only minimal: the parser has been updated (to better support C# 3.0),
and all projects now target .NET Framework 3.5.
</p>
        <p>
Please use the <a href="http://www.codeplex.com/TFSCCPolicy/Thread/List.aspx">discussions</a> to
report any issues you find.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=14b40c9f-d317-4204-861e-ded1262fac16" />
      </body>
      <title>CCCP 3 Beta 1 (VSTS 2008 RTM Compatible)</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,14b40c9f-d317-4204-861e-ded1262fac16.aspx</guid>
      <link>http://chrison.net/CCCP3Beta1VSTS2008RTMCompatible.aspx</link>
      <pubDate>Thu, 29 Nov 2007 10:44:23 GMT</pubDate>
      <description>&lt;p&gt;
I updated the &lt;a href="http://www.codeplex.com/TFSCCPolicy"&gt;TFS Code Comment Checking
Policy&lt;/a&gt; so that it works with VSTS 20008 RTM. The &lt;a href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=TFSCCPolicy&amp;amp;ReleaseId=8716"&gt;downloaded
labeled as Beta 1&lt;/a&gt; comes with the well-known setup, the changes to the August test
version are only minimal: the parser has been updated (to better support C# 3.0),
and all projects now target .NET Framework 3.5.
&lt;/p&gt;
&lt;p&gt;
Please use the &lt;a href="http://www.codeplex.com/TFSCCPolicy/Thread/List.aspx"&gt;discussions&lt;/a&gt; to
report any issues you find.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=14b40c9f-d317-4204-861e-ded1262fac16" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,14b40c9f-d317-4204-861e-ded1262fac16.aspx</comments>
      <category>.NET</category>
      <category>3.5</category>
      <category>Team System</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=467ea4bc-87ca-4791-9540-a793e8d428f2</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,467ea4bc-87ca-4791-9540-a793e8d428f2.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,467ea4bc-87ca-4791-9540-a793e8d428f2.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=467ea4bc-87ca-4791-9540-a793e8d428f2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
TechEd Developers 2007 is over, and before moving on (and flying back to snow in Austria),
here is the list of sessions I attended this year:
</p>
        <ul>
          <li>
TLA201 - A Tour of Visual Studio 2008 and the .NET Framework 3.5</li>
          <li>
OFF401 - .NET Developers Advanced Introduction to SharePoint 2007</li>
          <li>
TLA324 - What's New in Team System for Software Testers</li>
          <li>
SEC301 - CLR Security in .NET Framework 3.5</li>
          <li>
DAT201 - Entity Framework Introduction</li>
          <li>
WEB401 - Building Highly Scalable ASP.NET Web Sites by Exploiting Async Programming
Models</li>
          <li>
TLA304 - Building Services with the Service Factory: Modeling Edition</li>
          <li>
DAT303 - Entity Framework: Application Patterns</li>
          <li>
TLA305 - Continuous Integration With and Without Team System</li>
          <li>
TLA307 - Improving Code Performance with VSTS 2008 Team Edition for Software Developers</li>
          <li>
DAT304 - Managing Unstructured Data in SQL Server 2008: Introducing the FileStream
Datatype</li>
          <li>
TLA403 - Loose Coupling in Practice: CAB in the Real World</li>
          <li>
ARC401 - Designing High Performance, Persistent Domain Models</li>
          <li>
TLA407 - Dealing with Concurrency and Multi-Core CPUs with Today's Development Technologies</li>
          <li>
SBP307 - Modeling and Composition of Applications</li>
          <li>
TLA319 - The Joins Concurrency Library</li>
          <li>
TLA405 - Parallel and Async Functional Programming on .NET with F#</li>
          <li>
WEB403 - Securing your High-Risk ASP.NET Web Applications - A Case Study</li>
        </ul>
        <p>
Compared to <a href="http://chrison.net/TheWeekInReviewTechEdDevelopersSessions.aspx">last
year</a>, I managed to attend more sessions, however, there were also more duds. The
last session (WEB403) turned out to be the one that earned the raspberry this year
(a close runner-up: TLA403). Coming out on top I decided to nominate three: OFF401,
TLA307 and DAT303.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=467ea4bc-87ca-4791-9540-a793e8d428f2" />
      </body>
      <title>The Week in Review - TechEd Developers 2007 Sessions</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,467ea4bc-87ca-4791-9540-a793e8d428f2.aspx</guid>
      <link>http://chrison.net/TheWeekInReviewTechEdDevelopers2007Sessions.aspx</link>
      <pubDate>Fri, 09 Nov 2007 18:15:43 GMT</pubDate>
      <description>&lt;p&gt;
TechEd Developers 2007 is over, and before moving on (and flying back to snow in Austria),
here is the list of sessions I attended this year:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
TLA201 - A Tour of Visual Studio 2008 and the .NET Framework 3.5&lt;/li&gt;
&lt;li&gt;
OFF401 - .NET Developers Advanced Introduction to SharePoint 2007&lt;/li&gt;
&lt;li&gt;
TLA324 - What's New in Team System for Software Testers&lt;/li&gt;
&lt;li&gt;
SEC301 - CLR Security in .NET Framework 3.5&lt;/li&gt;
&lt;li&gt;
DAT201 - Entity Framework Introduction&lt;/li&gt;
&lt;li&gt;
WEB401 - Building Highly Scalable ASP.NET Web Sites by Exploiting Async Programming
Models&lt;/li&gt;
&lt;li&gt;
TLA304 - Building Services with the Service Factory: Modeling Edition&lt;/li&gt;
&lt;li&gt;
DAT303 - Entity Framework: Application Patterns&lt;/li&gt;
&lt;li&gt;
TLA305 - Continuous Integration With and Without Team System&lt;/li&gt;
&lt;li&gt;
TLA307 - Improving Code Performance with VSTS 2008 Team Edition for Software Developers&lt;/li&gt;
&lt;li&gt;
DAT304 - Managing Unstructured Data in SQL Server 2008: Introducing the FileStream
Datatype&lt;/li&gt;
&lt;li&gt;
TLA403 - Loose Coupling in Practice: CAB in the Real World&lt;/li&gt;
&lt;li&gt;
ARC401 - Designing High Performance, Persistent Domain Models&lt;/li&gt;
&lt;li&gt;
TLA407 - Dealing with Concurrency and Multi-Core CPUs with Today's Development Technologies&lt;/li&gt;
&lt;li&gt;
SBP307 - Modeling and Composition of Applications&lt;/li&gt;
&lt;li&gt;
TLA319 - The Joins Concurrency Library&lt;/li&gt;
&lt;li&gt;
TLA405 - Parallel and Async Functional Programming on .NET with F#&lt;/li&gt;
&lt;li&gt;
WEB403 - Securing your High-Risk ASP.NET Web Applications - A Case Study&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Compared to &lt;a href="http://chrison.net/TheWeekInReviewTechEdDevelopersSessions.aspx"&gt;last
year&lt;/a&gt;, I managed to attend more sessions, however, there were also more duds. The
last session (WEB403) turned out to be the one that earned the raspberry this year
(a close runner-up: TLA403). Coming out on top I decided to nominate&amp;nbsp;three: OFF401,
TLA307 and DAT303.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=467ea4bc-87ca-4791-9540-a793e8d428f2" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,467ea4bc-87ca-4791-9540-a793e8d428f2.aspx</comments>
      <category>.NET</category>
      <category>this</category>
      <category>Training and Conferences</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=4dba1166-1d1f-4d5d-aa83-e98e58649987</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,4dba1166-1d1f-4d5d-aa83-e98e58649987.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,4dba1166-1d1f-4d5d-aa83-e98e58649987.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=4dba1166-1d1f-4d5d-aa83-e98e58649987</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>XSSDetect is a static code analysis tool that helps identify Cross-Site Scripting
security flaws found within Web applications. It is able to scan compiled managed
assemblies (C#, Visual Basic .NET, J#) and analyze dataflow paths from sources of
user-controlled input to vulnerable outputs. It also detects whether proper encoding
or filtering has been applied to the data and will ignore such "sanitized" paths.</em>
          <a href="http://www.microsoft.com/downloads/details.aspx?familyid=19A9E348-BDB9-45B3-A1B7-44CCDCB7CFBE&amp;displaylang=en">Download</a>
        </p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=4dba1166-1d1f-4d5d-aa83-e98e58649987" />
      </body>
      <title>XSS Detect Beta Code Analysis Tool</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,4dba1166-1d1f-4d5d-aa83-e98e58649987.aspx</guid>
      <link>http://chrison.net/XSSDetectBetaCodeAnalysisTool.aspx</link>
      <pubDate>Fri, 02 Nov 2007 11:51:21 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;XSSDetect is a static code analysis tool that helps identify Cross-Site Scripting
security flaws found within Web applications. It is able to scan compiled managed
assemblies (C#, Visual Basic .NET, J#) and analyze dataflow paths from sources of
user-controlled input to vulnerable outputs. It also detects whether proper encoding
or filtering has been applied to the data and will ignore such "sanitized" paths.&lt;/em&gt; &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=19A9E348-BDB9-45B3-A1B7-44CCDCB7CFBE&amp;amp;displaylang=en"&gt;Download&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=4dba1166-1d1f-4d5d-aa83-e98e58649987" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,4dba1166-1d1f-4d5d-aa83-e98e58649987.aspx</comments>
      <category>.NET</category>
      <category>ASP.NET</category>
      <category>Security</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=bc6dc56c-3054-4ba8-b976-3f4890d8ca15</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,bc6dc56c-3054-4ba8-b976-3f4890d8ca15.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,bc6dc56c-3054-4ba8-b976-3f4890d8ca15.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=bc6dc56c-3054-4ba8-b976-3f4890d8ca15</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Article at The Register: <a href="http://www.regdeveloper.co.uk/2007/10/30/asp_net_java_project_cool/">How
ASP.NET began in Java</a>. Reminds me of the "C# is COOL" t-shirt I have...
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=bc6dc56c-3054-4ba8-b976-3f4890d8ca15" />
      </body>
      <title>How ASP.NET began in Java</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,bc6dc56c-3054-4ba8-b976-3f4890d8ca15.aspx</guid>
      <link>http://chrison.net/HowASPNETBeganInJava.aspx</link>
      <pubDate>Tue, 30 Oct 2007 16:12:41 GMT</pubDate>
      <description>&lt;p&gt;
Article at The Register: &lt;a href="http://www.regdeveloper.co.uk/2007/10/30/asp_net_java_project_cool/"&gt;How
ASP.NET began in Java&lt;/a&gt;. Reminds me of the "C# is COOL" t-shirt I have...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=bc6dc56c-3054-4ba8-b976-3f4890d8ca15" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,bc6dc56c-3054-4ba8-b976-3f4890d8ca15.aspx</comments>
      <category>.NET</category>
      <category>ASP.NET</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=e5341c27-7d29-4ecd-9122-cbf8ff704d28</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,e5341c27-7d29-4ecd-9122-cbf8ff704d28.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,e5341c27-7d29-4ecd-9122-cbf8ff704d28.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=e5341c27-7d29-4ecd-9122-cbf8ff704d28</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
If you are interested in <a href="http://www.codeplex.com/IronPython">IronPython</a>,
you should check out Matt's latest <a href="http://www.icsharpcode.net/opensource/sd/">SharpDevelop</a> addin: <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2007/10/21/IronPythonIntegrationInSharpDevelop22.aspx">IronPython
Integration In SharpDevelop 2.2</a>. His blog post details the status of code completion,
Windows Forms designer support, plus: converting code from C# or VB.NET to IronPython. 
</p>
        <p>
Please note that this is a work in progress, and that the official release of this
addin will be for SharpDevelop 3 and IronPython 2.0.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=e5341c27-7d29-4ecd-9122-cbf8ff704d28" />
      </body>
      <title>SharpDevelop Supports IronPython</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,e5341c27-7d29-4ecd-9122-cbf8ff704d28.aspx</guid>
      <link>http://chrison.net/SharpDevelopSupportsIronPython.aspx</link>
      <pubDate>Sun, 21 Oct 2007 17:36:15 GMT</pubDate>
      <description>&lt;p&gt;
If you are interested in &lt;a href="http://www.codeplex.com/IronPython"&gt;IronPython&lt;/a&gt;,
you should check out Matt's latest &lt;a href="http://www.icsharpcode.net/opensource/sd/"&gt;SharpDevelop&lt;/a&gt; addin: &lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2007/10/21/IronPythonIntegrationInSharpDevelop22.aspx"&gt;IronPython
Integration In SharpDevelop 2.2&lt;/a&gt;. His blog post details the status of code completion,
Windows Forms designer support, plus: converting code from C# or VB.NET to IronPython. 
&lt;/p&gt;
&lt;p&gt;
Please note that this is a work in progress, and that the official release of this
addin will be for SharpDevelop 3 and IronPython 2.0.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=e5341c27-7d29-4ecd-9122-cbf8ff704d28" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,e5341c27-7d29-4ecd-9122-cbf8ff704d28.aspx</comments>
      <category>.NET</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=4f7ed9fb-2d7e-4ed6-9bba-a12f739db5c2</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,4f7ed9fb-2d7e-4ed6-9bba-a12f739db5c2.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,4f7ed9fb-2d7e-4ed6-9bba-a12f739db5c2.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=4f7ed9fb-2d7e-4ed6-9bba-a12f739db5c2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The recently released version of <a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET">CruiseControl.NET</a> has
a small issue with MSBuild Output in the Web dashboard: <em>Unable to load transform:
c:\ccnet\webdashboard\xsl\msbuild.xsl</em>. A fix can be found in <a href="http://groups.google.com.ag/group/ccnet-user/browse_thread/thread/6ca4e259d91399ff">this
thread in the fourth post</a>. The reason to upgrade to 1.3? CC.NET now runs on .NET
2.0 (it has been ported), and it has a feature I want to try: <a href="http://confluence.public.thoughtworks.org/display/CCNET/Integration+Queues">integration
queues</a>.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=4f7ed9fb-2d7e-4ed6-9bba-a12f739db5c2" />
      </body>
      <title>CruiseControl.NET 1.3.0.2918 &amp; MSBuild Output</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,4f7ed9fb-2d7e-4ed6-9bba-a12f739db5c2.aspx</guid>
      <link>http://chrison.net/CruiseControlNET1302918MSBuildOutput.aspx</link>
      <pubDate>Sun, 24 Jun 2007 18:32:38 GMT</pubDate>
      <description>&lt;p&gt;
The recently released version of &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET"&gt;CruiseControl.NET&lt;/a&gt; has
a small issue with MSBuild Output in the Web dashboard: &lt;em&gt;Unable to load transform:
c:\ccnet\webdashboard\xsl\msbuild.xsl&lt;/em&gt;. A fix can be found in &lt;a href="http://groups.google.com.ag/group/ccnet-user/browse_thread/thread/6ca4e259d91399ff"&gt;this
thread in the fourth post&lt;/a&gt;. The reason to upgrade to 1.3? CC.NET now runs on .NET
2.0 (it has been ported), and it has a feature I want to try: &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Integration+Queues"&gt;integration
queues&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=4f7ed9fb-2d7e-4ed6-9bba-a12f739db5c2" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,4f7ed9fb-2d7e-4ed6-9bba-a12f739db5c2.aspx</comments>
      <category>.NET</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=406befc0-334e-4a9d-8812-d840d5869617</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,406befc0-334e-4a9d-8812-d840d5869617.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,406befc0-334e-4a9d-8812-d840d5869617.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=406befc0-334e-4a9d-8812-d840d5869617</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Microsoft <a href="http://www.microsoft.com/downloads/details.aspx?familyid=2cd92e43-6cda-478a-9e3b-4f831e899433&amp;displaylang=en&amp;tm">released
a UAC demo</a>. It is just basic process elevation (read: save the time by not downloading
it), which I described in more detail (with more reuseability) in <a href="http://chrison.net/UACElevationInManagedCodeStartingElevatedProcesses.aspx">UAC
Elevation in Managed Code: Starting Elevated Processes</a>.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=406befc0-334e-4a9d-8812-d840d5869617" />
      </body>
      <title>MS Sample for Starting Elevated Processes (UAC)</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,406befc0-334e-4a9d-8812-d840d5869617.aspx</guid>
      <link>http://chrison.net/MSSampleForStartingElevatedProcessesUAC.aspx</link>
      <pubDate>Mon, 04 Jun 2007 08:34:52 GMT</pubDate>
      <description>&lt;p&gt;
Microsoft &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=2cd92e43-6cda-478a-9e3b-4f831e899433&amp;amp;displaylang=en&amp;amp;tm"&gt;released
a UAC demo&lt;/a&gt;. It is just basic process elevation (read: save the time by not downloading
it), which I described in more detail (with more reuseability) in &lt;a href="http://chrison.net/UACElevationInManagedCodeStartingElevatedProcesses.aspx"&gt;UAC
Elevation in Managed Code: Starting Elevated Processes&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=406befc0-334e-4a9d-8812-d840d5869617" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,406befc0-334e-4a9d-8812-d840d5869617.aspx</comments>
      <category>.NET</category>
      <category>Vista</category>
      <category>UAC</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=828f4103-eab0-46d4-a143-9cafe03f0a95</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,828f4103-eab0-46d4-a143-9cafe03f0a95.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,828f4103-eab0-46d4-a143-9cafe03f0a95.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=828f4103-eab0-46d4-a143-9cafe03f0a95</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I have been patiently waiting for this one, quote from the download page: <em>“Acropolis”
builds on the rich capabilities of Microsoft Windows and the .NET Framework, including
Windows Presentation Foundation (WPF), by providing tools and pre-built components
that help developers quickly assemble applications from loosely-coupled parts and
services.</em></p>
        <p>
          <a href="http://www.microsoft.com/downloads/details.aspx?familyid=72386ce5-f206-4d5c-ab09-413b5f31f935&amp;displaylang=en&amp;tm">Download</a>
        </p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=828f4103-eab0-46d4-a143-9cafe03f0a95" />
      </body>
      <title>Microsoft Code Name "Acropolis" Community Technology Preview 1</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,828f4103-eab0-46d4-a143-9cafe03f0a95.aspx</guid>
      <link>http://chrison.net/MicrosoftCodeNameAcropolisCommunityTechnologyPreview1.aspx</link>
      <pubDate>Mon, 04 Jun 2007 06:26:40 GMT</pubDate>
      <description>&lt;p&gt;
I have been patiently waiting for this one, quote from the download page: &lt;em&gt;“Acropolis”
builds on the rich capabilities of Microsoft Windows and the .NET Framework, including
Windows Presentation Foundation (WPF), by providing tools and pre-built components
that help developers quickly assemble applications from loosely-coupled parts and
services.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=72386ce5-f206-4d5c-ab09-413b5f31f935&amp;amp;displaylang=en&amp;amp;tm"&gt;Download&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=828f4103-eab0-46d4-a143-9cafe03f0a95" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,828f4103-eab0-46d4-a143-9cafe03f0a95.aspx</comments>
      <category>.NET</category>
      <category>Cool Download</category>
      <category>Software Architecture</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=2e206d1c-b1ca-42e5-91c3-f3cb71bba2d7</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,2e206d1c-b1ca-42e5-91c3-f3cb71bba2d7.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,2e206d1c-b1ca-42e5-91c3-f3cb71bba2d7.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=2e206d1c-b1ca-42e5-91c3-f3cb71bba2d7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Bill Staples put together a post on <a href="http://blogs.iis.net/bills/archive/2007/04/25/what-s-new-in-iis7-beta-3.aspx">what's
new in IIS7 Beta 3</a>. He also talks about the all-new IIS7 FTP server (which I knew
about for a long time - I had hoped Beta 3 would be available for my MSDN Briefing
in Vienna last month, but no such luck). Also, he mentions the GoLive! license for
IIS7. 
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=2e206d1c-b1ca-42e5-91c3-f3cb71bba2d7" />
      </body>
      <title>What's New in IIS7 Beta 3?</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,2e206d1c-b1ca-42e5-91c3-f3cb71bba2d7.aspx</guid>
      <link>http://chrison.net/WhatsNewInIIS7Beta3.aspx</link>
      <pubDate>Thu, 26 Apr 2007 10:20:02 GMT</pubDate>
      <description>&lt;p&gt;
Bill Staples put together a post on &lt;a href="http://blogs.iis.net/bills/archive/2007/04/25/what-s-new-in-iis7-beta-3.aspx"&gt;what's
new in IIS7 Beta 3&lt;/a&gt;. He also talks about the all-new IIS7 FTP server (which I knew
about for a long time - I had hoped Beta 3 would be available for my MSDN Briefing
in Vienna last month, but no such luck). Also, he mentions the GoLive! license for
IIS7. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=2e206d1c-b1ca-42e5-91c3-f3cb71bba2d7" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,2e206d1c-b1ca-42e5-91c3-f3cb71bba2d7.aspx</comments>
      <category>.NET</category>
      <category>ASP.NET</category>
      <category>IIS</category>
      <category>Longhorn</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=882c78eb-1d78-412a-bb89-f4079fa7c174</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,882c78eb-1d78-412a-bb89-f4079fa7c174.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,882c78eb-1d78-412a-bb89-f4079fa7c174.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=882c78eb-1d78-412a-bb89-f4079fa7c174</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The <a href="http://fosdem.org/2007/media/video/">video recordings for the main tracks
of FOSDEM 2007</a> are online now. Of interest for .NET developers might be Miguel's
session on "Turbocharging Linux with <a href="http://www.mono-project.com/">Mono</a>".
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=882c78eb-1d78-412a-bb89-f4079fa7c174" />
      </body>
      <title>FOSDEM Video Recordings</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,882c78eb-1d78-412a-bb89-f4079fa7c174.aspx</guid>
      <link>http://chrison.net/FOSDEMVideoRecordings.aspx</link>
      <pubDate>Wed, 28 Feb 2007 08:20:15 GMT</pubDate>
      <description>&lt;p&gt;
The &lt;a href="http://fosdem.org/2007/media/video/"&gt;video recordings for the main tracks
of FOSDEM 2007&lt;/a&gt; are online now. Of interest for .NET developers might be Miguel's
session on "Turbocharging Linux with &lt;a href="http://www.mono-project.com/"&gt;Mono&lt;/a&gt;".
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=882c78eb-1d78-412a-bb89-f4079fa7c174" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,882c78eb-1d78-412a-bb89-f4079fa7c174.aspx</comments>
      <category>.NET</category>
      <category>Community</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=23178df4-4379-459e-af23-d4f7645caa47</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,23178df4-4379-459e-af23-d4f7645caa47.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,23178df4-4379-459e-af23-d4f7645caa47.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=23178df4-4379-459e-af23-d4f7645caa47</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
At long last at least a <a href="http://www.microsoft.com/downloads/details.aspx?familyid=75fef59f-1b5e-49bc-a21a-9ef4f34de6fc&amp;displaylang=en&amp;tm">CTP
is available</a>. Definitely worthwhile to check out.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=23178df4-4379-459e-af23-d4f7645caa47" />
      </body>
      <title>Microsoft Synchronization Services for ADO.NET CTP</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,23178df4-4379-459e-af23-d4f7645caa47.aspx</guid>
      <link>http://chrison.net/MicrosoftSynchronizationServicesForADONETCTP.aspx</link>
      <pubDate>Thu, 15 Feb 2007 09:46:14 GMT</pubDate>
      <description>&lt;p&gt;
At long last at least a &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=75fef59f-1b5e-49bc-a21a-9ef4f34de6fc&amp;amp;displaylang=en&amp;amp;tm"&gt;CTP
is available&lt;/a&gt;. Definitely worthwhile to check out.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=23178df4-4379-459e-af23-d4f7645caa47" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,23178df4-4379-459e-af23-d4f7645caa47.aspx</comments>
      <category>.NET</category>
      <category>SQL Server</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=1392e674-8b58-407b-b101-903d7e9d95a8</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,1392e674-8b58-407b-b101-903d7e9d95a8.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,1392e674-8b58-407b-b101-903d7e9d95a8.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=1392e674-8b58-407b-b101-903d7e9d95a8</wfw:commentRss>
      <slash:comments>7</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I admit it: <a href="http://chrison.net/UACElevationInManagedCodeTalkingToAnElevatedProcessViaWCF.aspx">UAC
Elevation in Managed Code: "Talking" to an Elevated Process via WCF</a> is a kludge.
The reason why I dabbled with this approach at all is that I failed to implement COM
elevation with managed code (not <a href="http://chrison.net/UACElevationInManagedCodeStartingElevatedCOMComponents.aspx">elevating
a COM component</a>, but the COM component itself). However, at long last, I succeeded
in that respect too: I now present you the all-managed code solution to UAC elevation!
</p>
        <p>
Once again I built myself a small demo frontend application:
</p>
        <p>
          <img src="http://chrison.net/content/binary/comelevationincsharp.png" border="0" />
        </p>
        <p>
As you can guess, the first button does plain vanilla COM InterOp without any UAC
elevation. Thus its code is rather simple:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">private</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> simpleCallButton_Click(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">object</span> sender,
EventArgs e)<br />
{<br />
  Type t <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> Type.GetTypeFromCLSID(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> Guid(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"71E050A7-AF7F-42dd-BE00-BF955DDD13D4"</span>));<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
object</span> o <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> Activator.CreateInstance(t);<br />
  t.InvokeMember(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"SayHello"</span>,
BindingFlags.InvokeMethod, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>,
o, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>);<br />
}</span>
        </p>
        <p>
Why this reflection magic? Well, the COM component I am calling here is implemented
in .NET - and <a href="http://chrison.net/AReferenceToCouldNotBeAdded.aspx">both
VS as well as tlbimp balk at reimporting the exported type library</a>.
</p>
        <p>
The COM component in question has been regasm'ed &amp; gacutil'ed (ManagedElevator
project in the download). Although the name implies that I am after elevation, it
is pretty much a standard COM component written using C#:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> TheGuids<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">const</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> IHelloWorld <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"B8CD5C09-9ACD-49b0-BF6F-C7B0F29795F9"</span>;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">const</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> ClassToElevate <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"71E050A7-AF7F-42dd-BE00-BF955DDD13D4"</span>;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">const</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> AppId <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"75AB90B0-8B9C-45c9-AC55-C53A9D718E1A"</span>;<br />
}<br /><br />
[Guid(TheGuids.IHelloWorld)]<br />
[InterfaceType(ComInterfaceType.InterfaceIsDual)]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">interface</span> IHelloWorld<br />
{<br />
  [ComVisible(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">true</span>)]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
void</span> SayHello();<br />
}<br /><br />
[Guid(TheGuids.ClassToElevate)]<br />
[ClassInterface(ClassInterfaceType.None)]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> ClassToElevate
: IHelloWorld<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> public</span> ClassToElevate()<br />
 {<br />
 }<br /><br />
 [ComVisible(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">true</span>)]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> SayHello()<br />
 {<br />
  MessageBox.Show(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Hello
World"</span>);<br />
 }<br />
}<br /></span>
        </p>
        <p>
So how do you go from "standard" "plain-vanilla" COM component to COM elevation? The
part that stumped me for so long was the ClassInterface attribute - if you forget
this guy, you'll end up with an InvalidCastException thrown by UACManager.LaunchElevatedCOMObject.
</p>
        <p>
But that's not quite all to get up and running with COM elevation: in addition, you
need to modify the default registration for this component - specifically, you need
to configure the DllSurrogate. This is where the AppId GUID comes into play: it isn't
used in code (kept there for documentation purposes only), but in registryadditions.reg.
It binds the various registry keys. And speaking of this .reg file, please take note
of the LocalizedString value: it contains the text for the UAC prompt (also check
out UACPrompts.rc, resource.h, compilerc.bat as well as the properties of the ManagedElevator
project where the compiled .res file is referenced). 
</p>
        <p>
          <strong>Note</strong> Before importing the .reg file into the registry make sure to
fix the file path contained in LocalizedString! And if you create your own elevated
COM component DO NOT reuse any of my three GUIDs - use guidgen.exe to create your
personal ones.
</p>
        <p>
From there, UAC elevation is smooth sailing. The Reflection version of COM elevation
looks very similar to non-elevated calls:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">private</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> managedElevation_Click(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">object</span> sender,
EventArgs e)<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
// CLSID</span><br />
  Guid classId <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> Guid(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"71E050A7-AF7F-42dd-BE00-BF955DDD13D4"</span>);<br /><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
// Interface ID</span><br />
  Guid interfaceId <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> Guid(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"B8CD5C09-9ACD-49b0-BF6F-C7B0F29795F9"</span>);<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
object</span> o <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> UACManager.LaunchElevatedCOMObject(classId,
interfaceId);<br /><br />
  Type t <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> o.GetType();<br />
  t.InvokeMember(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"SayHello"</span>,
BindingFlags.InvokeMethod, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>,
o, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>);<br /><br />
  Marshal.ReleaseComObject(o);<br />
}</span>
        </p>
        <p>
Of course this is not really a good solution (late binding). So instead I manually
imported the IHelloWorld interface:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">[<br />
ComImport(), 
<br />
Guid(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"B8CD5C09-9ACD-49b0-BF6F-C7B0F29795F9"</span>), 
<br />
InterfaceType(ComInterfaceType.InterfaceIsDual)<br />
]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
interface</span> IHelloWorld<br />
  {<br />
   [<br />
   MethodImpl(MethodImplOptions.InternalCall, MethodCodeType <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> MethodCodeType.Runtime),<br />
   PreserveSig<br />
   ]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   
void</span> SayHello();<br />
  }</span>
        </p>
        <p>
Which makes calls into the elevated COM object much easier and cleaner:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">private</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> managedElevationInterface_Click(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">object</span> sender,
EventArgs e)<br />
{<br />
  Guid classId <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> Guid(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"71E050A7-AF7F-42dd-BE00-BF955DDD13D4"</span>);<br />
  Guid interfaceId <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> Guid(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"B8CD5C09-9ACD-49b0-BF6F-C7B0F29795F9"</span>);<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
object</span> o <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> UACManager.LaunchElevatedCOMObject(classId,
interfaceId);<br /><br />
  IHelloWorld ihw <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> (IHelloWorld)o;<br />
  ihw.SayHello();<br /><br />
  Marshal.ReleaseComObject(o);<br />
}</span>
        </p>
        <p>
So why should you use the COM elevation solution instead of starting the process?
Well, there are a couple of reasons:
</p>
        <ul>
          <li>
You can package more than one component into a DLL and still have custom UAC prompts
thanks to LocalizedString 
</li>
          <li>
Your users don't get "an unidentified program..." warnings. Thank you COM registration 
</li>
          <li>
If you ever need to talk more extensively with the elevated process then this approach
can be adapted more easily</li>
        </ul>
        <p>
          <strong>The source code</strong>
        </p>
        <p>
          <a href="http://chrison.net/content/binary/ConsumeMyElevatedCOM.zip">ConsumeMyElevatedCOM.zip
(97.56 KB)</a>
        </p>
        <p>
You will find a file aptly named notes.txt in the ManagedElevator project that describes
all the necessary steps to get up and running. 
</p>
        <p>
I hope you find this sample useful and not have to spend as much time as I did. Cheers!
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=1392e674-8b58-407b-b101-903d7e9d95a8" />
      </body>
      <title>UAC Elevation in Managed Code: A .NET COM Component Elevated</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,1392e674-8b58-407b-b101-903d7e9d95a8.aspx</guid>
      <link>http://chrison.net/UACElevationInManagedCodeANETCOMComponentElevated.aspx</link>
      <pubDate>Mon, 05 Feb 2007 21:41:46 GMT</pubDate>
      <description>&lt;p&gt;
I admit it: &lt;a href="http://chrison.net/UACElevationInManagedCodeTalkingToAnElevatedProcessViaWCF.aspx"&gt;UAC
Elevation in Managed Code: "Talking" to an Elevated Process via WCF&lt;/a&gt; is a kludge.
The reason why I dabbled with this approach at all is that I failed to implement COM
elevation with managed code (not &lt;a href="http://chrison.net/UACElevationInManagedCodeStartingElevatedCOMComponents.aspx"&gt;elevating
a COM component&lt;/a&gt;, but the COM component itself). However, at long last, I succeeded
in that respect too: I now present you the all-managed code solution to UAC elevation!
&lt;/p&gt;
&lt;p&gt;
Once again I built myself a small demo frontend application:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/comelevationincsharp.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
As you can guess, the first button does plain vanilla COM InterOp without any UAC
elevation. Thus its code is rather simple:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; simpleCallButton_Click(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;object&lt;/span&gt; sender,
EventArgs e)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; Type t &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; Type.GetTypeFromCLSID(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; Guid(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"71E050A7-AF7F-42dd-BE00-BF955DDD13D4"&lt;/span&gt;));&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
object&lt;/span&gt; o &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; Activator.CreateInstance(t);&lt;br&gt;
&amp;nbsp; t.InvokeMember(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"SayHello"&lt;/span&gt;,
BindingFlags.InvokeMethod, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;,
o, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;);&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Why this reflection magic? Well, the COM component I am calling here is implemented
in .NET - and&amp;nbsp;&lt;a href="http://chrison.net/AReferenceToCouldNotBeAdded.aspx"&gt;both
VS&amp;nbsp;as well as&amp;nbsp;tlbimp balk at reimporting the exported type library&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
The COM component in question has been regasm'ed &amp;amp; gacutil'ed (ManagedElevator
project in the download). Although the name implies that I am after elevation, it
is pretty much a standard COM component written using C#:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; TheGuids&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;const&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; IHelloWorld &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"B8CD5C09-9ACD-49b0-BF6F-C7B0F29795F9"&lt;/span&gt;;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;const&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; ClassToElevate &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"71E050A7-AF7F-42dd-BE00-BF955DDD13D4"&lt;/span&gt;;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;const&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; AppId &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"75AB90B0-8B9C-45c9-AC55-C53A9D718E1A"&lt;/span&gt;;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
[Guid(TheGuids.IHelloWorld)]&lt;br&gt;
[InterfaceType(ComInterfaceType.InterfaceIsDual)]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;interface&lt;/span&gt; IHelloWorld&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; [ComVisible(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;true&lt;/span&gt;)]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
void&lt;/span&gt; SayHello();&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
[Guid(TheGuids.ClassToElevate)]&lt;br&gt;
[ClassInterface(ClassInterfaceType.None)]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; ClassToElevate
: IHelloWorld&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;public&lt;/span&gt; ClassToElevate()&lt;br&gt;
&amp;nbsp;{&lt;br&gt;
&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;[ComVisible(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;true&lt;/span&gt;)]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; SayHello()&lt;br&gt;
&amp;nbsp;{&lt;br&gt;
&amp;nbsp; MessageBox.Show(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Hello
World"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;}&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
So how do you go from "standard" "plain-vanilla" COM component to COM elevation? The
part that stumped me for so long was the ClassInterface attribute - if you forget
this guy, you'll end up with an InvalidCastException thrown by UACManager.LaunchElevatedCOMObject.
&lt;/p&gt;
&lt;p&gt;
But that's not quite all to get up and running with COM elevation: in addition, you
need to modify the default registration for this component - specifically, you need
to configure the DllSurrogate. This is where the AppId GUID comes into play: it isn't
used in code (kept there for documentation purposes only), but in registryadditions.reg.
It binds the various registry keys. And speaking of this .reg file, please take note
of the LocalizedString value: it contains the text for the UAC prompt (also check
out UACPrompts.rc, resource.h, compilerc.bat as well as the properties of the ManagedElevator
project where the compiled .res file is referenced). 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Note&lt;/strong&gt; Before importing the .reg file into the registry make sure to
fix the file path contained in LocalizedString! And if you create your own elevated
COM component DO NOT reuse any of my three GUIDs - use guidgen.exe to create your
personal ones.
&lt;/p&gt;
&lt;p&gt;
From there, UAC elevation is smooth sailing. The Reflection version of COM elevation
looks very similar to non-elevated calls:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; managedElevation_Click(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;object&lt;/span&gt; sender,
EventArgs e)&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
// CLSID&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; Guid classId &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; Guid(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"71E050A7-AF7F-42dd-BE00-BF955DDD13D4"&lt;/span&gt;);&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
// Interface ID&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; Guid interfaceId &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; Guid(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"B8CD5C09-9ACD-49b0-BF6F-C7B0F29795F9"&lt;/span&gt;);&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
object&lt;/span&gt; o &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; UACManager.LaunchElevatedCOMObject(classId,
interfaceId);&lt;br&gt;
&lt;br&gt;
&amp;nbsp; Type t &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; o.GetType();&lt;br&gt;
&amp;nbsp; t.InvokeMember(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"SayHello"&lt;/span&gt;,
BindingFlags.InvokeMethod, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;,
o, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;);&lt;br&gt;
&lt;br&gt;
&amp;nbsp; Marshal.ReleaseComObject(o);&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Of course this is not really a good solution (late binding). So instead I manually
imported the IHelloWorld interface:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;[&lt;br&gt;
ComImport(), 
&lt;br&gt;
Guid(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"B8CD5C09-9ACD-49b0-BF6F-C7B0F29795F9"&lt;/span&gt;), 
&lt;br&gt;
InterfaceType(ComInterfaceType.InterfaceIsDual)&lt;br&gt;
]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
interface&lt;/span&gt; IHelloWorld&lt;br&gt;
&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp; [&lt;br&gt;
&amp;nbsp;&amp;nbsp; MethodImpl(MethodImplOptions.InternalCall, MethodCodeType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; MethodCodeType.Runtime),&lt;br&gt;
&amp;nbsp;&amp;nbsp; PreserveSig&lt;br&gt;
&amp;nbsp; &amp;nbsp;]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
void&lt;/span&gt; SayHello();&lt;br&gt;
&amp;nbsp; }&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Which makes calls into the elevated COM object much easier and cleaner:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; managedElevationInterface_Click(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;object&lt;/span&gt; sender,
EventArgs e)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; Guid classId &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; Guid(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"71E050A7-AF7F-42dd-BE00-BF955DDD13D4"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp; Guid interfaceId &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; Guid(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"B8CD5C09-9ACD-49b0-BF6F-C7B0F29795F9"&lt;/span&gt;);&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
object&lt;/span&gt; o &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; UACManager.LaunchElevatedCOMObject(classId,
interfaceId);&lt;br&gt;
&lt;br&gt;
&amp;nbsp; IHelloWorld ihw &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; (IHelloWorld)o;&lt;br&gt;
&amp;nbsp; ihw.SayHello();&lt;br&gt;
&lt;br&gt;
&amp;nbsp; Marshal.ReleaseComObject(o);&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
So why should you use the COM elevation solution instead of starting the process?
Well, there are a couple of reasons:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
You can package more than one component into a DLL and still have custom UAC prompts
thanks to LocalizedString 
&lt;li&gt;
Your users don't get "an unidentified program..." warnings. Thank you COM registration 
&lt;li&gt;
If you ever need to talk more extensively with the elevated process then this approach
can be adapted more easily&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;The source code&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/ConsumeMyElevatedCOM.zip"&gt;ConsumeMyElevatedCOM.zip
(97.56 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
You will find a file aptly named notes.txt in the ManagedElevator project that describes
all the necessary steps to get up and running. 
&lt;/p&gt;
&lt;p&gt;
I hope you find this sample useful and not have to spend as much time as I did. Cheers!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=1392e674-8b58-407b-b101-903d7e9d95a8" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,1392e674-8b58-407b-b101-903d7e9d95a8.aspx</comments>
      <category>.NET</category>
      <category>Security</category>
      <category>UAC</category>
      <category>Vista</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=a860d58a-d4c5-4073-9fee-b3e5fab629bf</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,a860d58a-d4c5-4073-9fee-b3e5fab629bf.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,a860d58a-d4c5-4073-9fee-b3e5fab629bf.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=a860d58a-d4c5-4073-9fee-b3e5fab629bf</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In the blog post <a href="http://chrison.net/UACElevationInManagedCodeStartingElevatedProcesses.aspx">UAC
Elevation in Managed Code: Starting Elevated Processes</a> I talked about how to start
an elevated process. However, just starting a process might not cut the mustard, for
example if you need to hand over data to the elevated process. You could achieve this
by passing, let's say, some data as command line arguments to ProcessInfo before starting
the elevated process. But that seriously limits communication.
</p>
        <p>
So how can you perform communication with an elevated process? My first idea was to
use .NET Remoting. Once I thought through the multi-instance scenario, I quickly realized
that this meant the server had to be running in the non-elevated application, because
only it could properly choose a port. And because I am not a fan of Remoting anyways,
I decided to give WCF (Windows Communication Foundation, a pillar of .NET 3.0) a try.
</p>
        <p>
It looked like smooth sailing at first, but then I realized that with WCF too I needed
to implement the service inside the non-elevated application. This time, however,
the reason was "How do I know when the elevated application has initialized before
I can actually start communicating with it?". Back to the drawing board.
</p>
        <p>
The final solution now looks like this: the non-elevated application starts a service.
The operations contract specifies a callback, which, once the elevated application
has signalled its readiness, can be used by the non-elevated application to "talk"
with the elevated application. I didn't intend to go duplex, but hey, if there's no
other way I am willing to take plunge. Speaking of tricks of the trade: I am using
imperative binding to a named pipe. Reason? Well, WS bindings won't work (see <a href="http://dotnet.org.za/armand/archive/2006/06/14/53390.aspx">here</a> and <a href="http://blogs.msdn.com/drnick/archive/2006/10/16/configuring-http-for-windows-vista.aspx">here</a>),
and the TCP channel would pop up a firewall warning. That's why.
</p>
        <p>
Let's look at the applications - first the non-elevated one:
</p>
        <p>
          <img src="http://chrison.net/content/binary/uacwcfpoc1.png" border="0" />
        </p>
        <p>
This time I forfeited eye candy (the shield button). Same (missing eye candy) goes
for the elevated application as it is a console application only:
</p>
        <p>
          <img src="http://chrison.net/content/binary/uacwcfpoc3.png" border="0" />
        </p>
        <p>
Solution-wise, this simple two-application scenario is split into four projects:
</p>
        <p>
          <img src="http://chrison.net/content/binary/uacwcfpoc2.png" border="0" />
        </p>
        <p>
So where do we start? With the easy part inside ElevationContract:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">[ServiceContract(Namespace <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"http://Christoph.Wille.Samples"</span>,<br />
CallbackContract <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">typeof</span>(IElevatedProcess))]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">interface</span> IWaitForElevatedProcess<br />
{<br />
  [OperationContract(IsOneWay <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">false</span>)]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
void</span> ElevatedProcessStarted();<br />
}<br /><br />
[ServiceContract(Namespace <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"http://Christoph.Wille.Samples"</span>)]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">interface</span> IElevatedProcess<br />
{<br />
  [OperationContract(IsOneWay <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">false</span>)]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
void</span> SayHello(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> message);<br />
}</span>
        </p>
        <p>
The interface IWaitForElevatedProcess is implemented in StandardUserApp. It is the
service endpoint that is initialized before the elevated process is started - and
once the elevated application is up and running, it calls into ElevatedProcessStarted.
And we are in business for using the IElevatedProcess callback that is implemented
in the ElevatedProcess console application.
</p>
        <p>
So how is the service endpoint intialized - let's take a look inside:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">private</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">const</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> theProcess <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">@"..\..\..\ElevatedProcess\bin\Debug\ElevatedProcess.exe"</span>;<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">private</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> tryitButton_Click(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">object</span> sender,
EventArgs e)<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
string</span> channelIdentifier <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> MiscHelpers.CreateRandomString(64);<br />
  MyUACServiceHost.StartService(channelIdentifier);<br /><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
// starting it modal doesn't work (obviously - unless we have more threads, of course)</span><br />
  ElevatedProcess.Start(theProcess, channelIdentifier);<br />
}</span>
        </p>
        <p>
Interesting tidbit #1 is CreateRandomString: it creates a random string to use for
the address. Why? Well, if multiple instances of our application are running and trying
to elevate a process, we are in trouble. Which brings me to StartService:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">internal</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">static</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> StartService(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> pipeEndPoint)<br />
{<br />
  NetNamedPipeBinding binding <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> NetNamedPipeBinding();<br />
  binding.Name <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"uacbinding"</span>;<br />
  binding.Security.Mode <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> NetNamedPipeSecurityMode.Transport;<br /><br />
  Uri baseAddress <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> Uri(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"net.pipe://localhost/uac/"</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> pipeEndPoint);<br /><br />
  myServiceHost <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> ServiceHost(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">typeof</span>(SampleService),
baseAddress);<br />
  myServiceHost.AddServiceEndpoint(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">typeof</span>(IWaitForElevatedProcess),
binding, baseAddress);<br />
  myServiceHost.Open();<br />
}</span>
        </p>
        <p>
As I said before, I am doing it imperatively (no configuration in app.config necessary).
That's all there is to getting the service up and running.
</p>
        <p>
Now let's switch to the console application's Main method:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">static</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> Main(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span>[]
args)<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
if</span> (args.Length !<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> 1)<br />
  {<br />
    Console.WriteLine(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"One
argument expected - the channel identifier"</span>);<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
 return</span>;<br />
  } 
<br /><br />
  NetNamedPipeBinding binding <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> NetNamedPipeBinding();<br />
  binding.Name <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"uacbinding"</span>;<br />
  binding.Security.Mode <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> NetNamedPipeSecurityMode.Transport;<br /><br />
  String url <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"net.pipe://localhost/uac/"</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> args[0];<br />
  EndpointAddress address <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> EndpointAddress(url);<br /><br />
  WaitForElevatedProcess client <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> WaitForElevatedProcess(<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">     
new</span> InstanceContext(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> SampleCallback()),<br />
      binding,<br />
      address);<br /><br />
  client.ElevatedProcessStarted();<br /><br />
  Console.WriteLine(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"The
elevated process is now ready"</span>);<br />
  Console.ReadLine();<br /><br />
  client.Close();<br />
}</span>
        </p>
        <p>
Similar to normal client WCF code, however, with the duplex twist hidden inside WaitForElevatedProcess:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> WaitForElevatedProcess
: DuplexClientBase&lt;IWaitForElevatedProcess&gt;, IWaitForElevatedProcess<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
public</span> WaitForElevatedProcess(System.ServiceModel.InstanceContext callbackInstance,</span>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> <br />
    System.ServiceModel.Channels.Binding binding, 
<br />
    System.ServiceModel.EndpointAddress remoteAddress)<br />
       : <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">base</span>(callbackInstance,
binding, remoteAddress)<br />
  {<br />
  }<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> ElevatedProcessStarted()<br />
  {<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   
base</span>.Channel.ElevatedProcessStarted();<br />
  }<br />
}</span>
        </p>
        <p>
Once the channel is connected, this elevated process calls back into the service piece
which lives in the non-elevated application, namely SampleService:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">[ServiceBehavior(ConcurrencyMode <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> ConcurrencyMode.Reentrant, 
<br />
      InstanceContextMode <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> InstanceContextMode.PerSession)]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> SampleService
: IWaitForElevatedProcess<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> ElevatedProcessStarted()<br />
  {<br />
    OperationContext.Current.GetCallbackChannel&lt;IElevatedProcess&gt;().SayHello(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Chris"</span>);<br />
  }<br />
}</span>
        </p>
        <p>
This method is the workhorse where I can talk to the elevated process - if only my
callback interface had more as well as more serious methods ;-) 
</p>
        <p>
Speaking of talking, I owe you the code for the callee in the console application:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">[CallbackBehavior(ConcurrencyMode <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> ConcurrencyMode.Reentrant)]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> SampleCallback
: IElevatedProcess<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> SayHello(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> message)<br />
  {<br />
    Console.WriteLine(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Hello
world "</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> message);<br />
  }<br />
}</span>
        </p>
        <p>
That's it - to recap: first, we initialize the WCF service. Then elevate a process.
This process, once initialized, calls into our service and leaves a callback. And
then we are in business talking to the elevated process (setting data, being notified
when the elevated application quits and why, ...).
</p>
        <p>
Sample warnings before you download: MyUACServiceHost definitely should be instance
instead of static. And, more restricting - starting the elevated process modal won't
allow communication <strong>unless</strong> you start the service on a separate thread.
For simplicity reasons I didn't do this for the POC.
</p>
        <p>
          <a href="http://chrison.net/content/binary/ElevateProcessTalkWCF.zip">ElevateProcessTalkWCF.zip
(27 KB)</a>
        </p>
        <p>
Before concluding I wanted to add a few words: my ideal implementation for UAC would
be COM elevation. That way, one can put more than one component into a single DLL,
and still get a meaningful UAC prompt thanks to the LocalizedString registry key -
which is per component, and not per executable (which is the case for this solution
if you add multiple actions). If you need differing prompts for each administrative
action, there is only one course of action you can take with processes: create multiple
executables. Not very pretty, but I failed with writing an elevatable (not a word,
I am sure) managed (C#) COM component.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=a860d58a-d4c5-4073-9fee-b3e5fab629bf" />
      </body>
      <title>UAC Elevation in Managed Code: "Talking" to an Elevated Process via WCF</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,a860d58a-d4c5-4073-9fee-b3e5fab629bf.aspx</guid>
      <link>http://chrison.net/UACElevationInManagedCodeTalkingToAnElevatedProcessViaWCF.aspx</link>
      <pubDate>Sun, 04 Feb 2007 21:23:45 GMT</pubDate>
      <description>&lt;p&gt;
In the blog post &lt;a href="http://chrison.net/UACElevationInManagedCodeStartingElevatedProcesses.aspx"&gt;UAC
Elevation in Managed Code: Starting Elevated Processes&lt;/a&gt; I talked about how to start
an elevated process. However, just starting a process might not cut the mustard, for
example if you need to hand over data to the elevated process. You could achieve this
by passing, let's say, some data as command line arguments to ProcessInfo before starting
the elevated process. But that seriously limits communication.
&lt;/p&gt;
&lt;p&gt;
So how can you perform communication with an elevated process? My first idea was to
use .NET Remoting. Once I thought through the multi-instance scenario, I quickly realized
that this meant the server had to be running in the non-elevated application, because
only it could properly choose a port. And because I am not a fan of Remoting anyways,
I decided to give WCF (Windows Communication Foundation, a pillar of .NET 3.0) a try.
&lt;/p&gt;
&lt;p&gt;
It looked like smooth sailing at first, but then I realized that with WCF too I needed
to implement the service inside the non-elevated application. This time, however,
the reason was "How do I know when the elevated application has initialized before
I can actually start communicating with it?". Back to the drawing board.
&lt;/p&gt;
&lt;p&gt;
The final solution now looks like this: the non-elevated application starts a service.
The operations contract specifies a callback, which, once the elevated application
has signalled its readiness, can be used by the non-elevated application to "talk"
with the elevated application. I didn't intend to go duplex, but hey, if there's no
other way I am willing to take plunge. Speaking of tricks of the trade: I am using
imperative binding to a named pipe. Reason? Well, WS bindings won't work (see &lt;a href="http://dotnet.org.za/armand/archive/2006/06/14/53390.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/drnick/archive/2006/10/16/configuring-http-for-windows-vista.aspx"&gt;here&lt;/a&gt;),
and the TCP channel would pop up a firewall warning. That's why.
&lt;/p&gt;
&lt;p&gt;
Let's look at the applications - first the non-elevated one:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/uacwcfpoc1.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
This time I forfeited eye candy (the shield button). Same (missing eye candy) goes
for the elevated application as it is a console application only:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/uacwcfpoc3.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Solution-wise, this simple two-application scenario is split into four projects:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/uacwcfpoc2.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
So where do we start? With the easy part inside ElevationContract:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;[ServiceContract(Namespace &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"http://Christoph.Wille.Samples"&lt;/span&gt;,&lt;br&gt;
CallbackContract &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;typeof&lt;/span&gt;(IElevatedProcess))]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;interface&lt;/span&gt; IWaitForElevatedProcess&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; [OperationContract(IsOneWay &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;false&lt;/span&gt;)]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
void&lt;/span&gt; ElevatedProcessStarted();&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
[ServiceContract(Namespace &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"http://Christoph.Wille.Samples"&lt;/span&gt;)]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;interface&lt;/span&gt; IElevatedProcess&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; [OperationContract(IsOneWay &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;false&lt;/span&gt;)]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
void&lt;/span&gt; SayHello(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; message);&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
The interface IWaitForElevatedProcess is implemented in StandardUserApp. It is the
service endpoint that is initialized before the elevated process is started - and
once the elevated application is up and running, it calls into ElevatedProcessStarted.
And we are in business for using the IElevatedProcess callback that is implemented
in the ElevatedProcess console application.
&lt;/p&gt;
&lt;p&gt;
So how is the service endpoint intialized - let's take a look inside:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;const&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; theProcess &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;@"..\..\..\ElevatedProcess\bin\Debug\ElevatedProcess.exe"&lt;/span&gt;;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; tryitButton_Click(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;object&lt;/span&gt; sender,
EventArgs e)&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
string&lt;/span&gt; channelIdentifier &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; MiscHelpers.CreateRandomString(64);&lt;br&gt;
&amp;nbsp; MyUACServiceHost.StartService(channelIdentifier);&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
// starting it modal doesn't work (obviously - unless we have more threads, of course)&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; ElevatedProcess.Start(theProcess, channelIdentifier);&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Interesting tidbit #1 is CreateRandomString: it creates a random string to use for
the address. Why? Well, if multiple instances of our application are running and trying
to elevate a process, we are in trouble. Which brings me to StartService:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;internal&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; StartService(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; pipeEndPoint)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; NetNamedPipeBinding binding &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; NetNamedPipeBinding();&lt;br&gt;
&amp;nbsp; binding.Name &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"uacbinding"&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; binding.Security.Mode &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; NetNamedPipeSecurityMode.Transport;&lt;br&gt;
&lt;br&gt;
&amp;nbsp; Uri baseAddress &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; Uri(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"net.pipe://localhost/uac/"&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; pipeEndPoint);&lt;br&gt;
&lt;br&gt;
&amp;nbsp; myServiceHost &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; ServiceHost(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;typeof&lt;/span&gt;(SampleService),
baseAddress);&lt;br&gt;
&amp;nbsp; myServiceHost.AddServiceEndpoint(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;typeof&lt;/span&gt;(IWaitForElevatedProcess),
binding, baseAddress);&lt;br&gt;
&amp;nbsp; myServiceHost.Open();&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
As I said before, I am doing it imperatively (no configuration in app.config necessary).
That's all there is to getting the service up and running.
&lt;/p&gt;
&lt;p&gt;
Now let's switch to the console application's Main method:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; Main(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt;[]
args)&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
if&lt;/span&gt; (args.Length !&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; 1)&lt;br&gt;
&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"One
argument expected - the channel identifier"&lt;/span&gt;);&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
&amp;nbsp;return&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; } 
&lt;br&gt;
&lt;br&gt;
&amp;nbsp; NetNamedPipeBinding binding &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; NetNamedPipeBinding();&lt;br&gt;
&amp;nbsp; binding.Name &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"uacbinding"&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; binding.Security.Mode &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; NetNamedPipeSecurityMode.Transport;&lt;br&gt;
&lt;br&gt;
&amp;nbsp; String url &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"net.pipe://localhost/uac/"&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; args[0];&lt;br&gt;
&amp;nbsp; EndpointAddress address &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; EndpointAddress(url);&lt;br&gt;
&lt;br&gt;
&amp;nbsp; WaitForElevatedProcess client &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; WaitForElevatedProcess(&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
new&lt;/span&gt; InstanceContext(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; SampleCallback()),&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; binding,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; address);&lt;br&gt;
&lt;br&gt;
&amp;nbsp; client.ElevatedProcessStarted();&lt;br&gt;
&lt;br&gt;
&amp;nbsp; Console.WriteLine(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"The
elevated process is now ready"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp; Console.ReadLine();&lt;br&gt;
&lt;br&gt;
&amp;nbsp; client.Close();&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Similar to normal client WCF code, however, with the duplex twist hidden inside WaitForElevatedProcess:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; WaitForElevatedProcess
: DuplexClientBase&amp;lt;IWaitForElevatedProcess&amp;gt;, IWaitForElevatedProcess&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
public&lt;/span&gt; WaitForElevatedProcess(System.ServiceModel.InstanceContext callbackInstance,&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; System.ServiceModel.Channels.Binding binding, 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; System.ServiceModel.EndpointAddress remoteAddress)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;base&lt;/span&gt;(callbackInstance,
binding, remoteAddress)&lt;br&gt;
&amp;nbsp; {&lt;br&gt;
&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; ElevatedProcessStarted()&lt;br&gt;
&amp;nbsp; {&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
base&lt;/span&gt;.Channel.ElevatedProcessStarted();&lt;br&gt;
&amp;nbsp; }&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Once the channel is connected, this elevated process calls back into the service piece
which lives in the non-elevated application, namely SampleService:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;[ServiceBehavior(ConcurrencyMode &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; ConcurrencyMode.Reentrant, 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InstanceContextMode &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; InstanceContextMode.PerSession)]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; SampleService
: IWaitForElevatedProcess&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; ElevatedProcessStarted()&lt;br&gt;
&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; OperationContext.Current.GetCallbackChannel&amp;lt;IElevatedProcess&amp;gt;().SayHello(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Chris"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp; }&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
This method is the workhorse where I can talk to the elevated process - if only my
callback interface had more as well as more serious methods ;-) 
&lt;/p&gt;
&lt;p&gt;
Speaking of talking, I owe you the code for the callee in the console application:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;[CallbackBehavior(ConcurrencyMode &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; ConcurrencyMode.Reentrant)]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; SampleCallback
: IElevatedProcess&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; SayHello(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; message)&lt;br&gt;
&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Hello
world "&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; message);&lt;br&gt;
&amp;nbsp; }&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
That's it - to recap: first, we initialize the WCF service. Then elevate a process.
This process, once initialized, calls into our service and leaves a callback. And
then we are in business talking to the elevated process (setting data, being notified
when the elevated application quits and why, ...).
&lt;/p&gt;
&lt;p&gt;
Sample warnings before you download: MyUACServiceHost definitely should be instance
instead of static. And, more restricting - starting the elevated process modal won't
allow communication &lt;strong&gt;unless&lt;/strong&gt; you start the service on a separate thread.
For simplicity reasons I didn't do this for the POC.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/ElevateProcessTalkWCF.zip"&gt;ElevateProcessTalkWCF.zip
(27 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Before concluding I wanted to add a few words: my ideal implementation for UAC would
be COM elevation. That way, one can put more than one component into a single DLL,
and still get a meaningful UAC prompt thanks to the LocalizedString registry key -
which is per component, and not per executable (which is the case for this solution
if you add multiple actions). If you need differing prompts for each administrative
action, there is only one course of action you can take with processes: create multiple
executables. Not very pretty, but I failed with writing an elevatable (not a word,
I am sure) managed (C#) COM component.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=a860d58a-d4c5-4073-9fee-b3e5fab629bf" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,a860d58a-d4c5-4073-9fee-b3e5fab629bf.aspx</comments>
      <category>.NET</category>
      <category>3.0</category>
      <category>Security</category>
      <category>UAC</category>
      <category>Vista</category>
      <category>WCF</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=0b4c5137-0b5c-475b-9f6b-e013dc9c7d5f</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,0b4c5137-0b5c-475b-9f6b-e013dc9c7d5f.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,0b4c5137-0b5c-475b-9f6b-e013dc9c7d5f.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=0b4c5137-0b5c-475b-9f6b-e013dc9c7d5f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The previous installment <a href="http://chrison.net/UACElevationInManagedCodeStartingElevatedProcesses.aspx">UAC
Elevation in Managed Code: Starting Elevated Processes</a> dealt with starting executables
with the "real" administrative token. In this blog post, we deal with starting a COM
component with elevated privileges. For in-depth background information, please consult
Kenny Kerr's absolutely excellent post on <a href="http://weblogs.asp.net/kennykerr/archive/2006/09/29/Windows-Vista-for-Developers-_1320_-Part-4-_1320_-User-Account-Control.aspx">Windows
Vista for Developers – Part 4 – User Account Control</a>.
</p>
        <p>
To start with, we need a COM component. Instead of writing an ATL C++ COM component
from scratch, I took the MyElevateCom sample from <a href="http://blogs.msdn.com/vistacompatteam/archive/2006/09/28/CoCreateInstanceAsAdmin-or-CreateElevatedComObject-sample.aspx">CoCreateInstanceAsAdmin
or CreateElevatedComObject sample</a> from the <a href="http://blogs.msdn.com/vistacompatteam/">Vista
Compatibility Team Blog</a>. Note that for building it, check out my post <a href="http://chrison.net/VisualStudioOnVistaNotSoFast.aspx">Visual
Studio on Vista: Not so Fast!</a></p>
        <p>
Assuming that you built and successfully registered the COM component (it is built
to the instuctions from Kenny's post), you can go about and write the managed caller.
First, we need a reference to the component:
</p>
        <p>
          <img src="http://chrison.net/content/binary/atladdcomreference.png" border="0" />
        </p>
        <p>
Then comes the tricky part - actually instantiating the COM component. When you take
a look at the C++ example, you see that quite some "moniker magic" is involved that
cannot be replicated by simply newing up the component. So how to mimic this behavior
in managed code? The <a href="http://www.microsoft.com/downloads/details.aspx?familyid=c2b1e300-f358-4523-b479-f53d234cdccf&amp;displaylang=en">Microsoft®
Windows® Software Development Kit for Windows Vista™ and .NET Framework 3.0 Runtime
Components</a> comes to the rescue: inside, you find C:\Program Files\Microsoft SDKs\Windows\v6.0\Samples\CrossTechnologySamples.zip,
which contains the VistaBridge sample. 
</p>
        <p>
From that, I took the VistaBridgeLibary, and modified the static UACManager.LaunchElevatedCOMObject
method a bit:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">[<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span>:
MarshalAs(UnmanagedType.Interface)]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">static</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">object</span> LaunchElevatedCOMObject(Guid
Clsid, Guid InterfaceID)<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
string</span> CLSID <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> Clsid.ToString(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"B"</span>); 
<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
string</span> monikerName <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Elevation:Administrator!new:"</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> CLSID;<br /><br />
  NativeMethods.BIND_OPTS3 bo <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> NativeMethods.BIND_OPTS3();<br />
  bo.cbStruct <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> (<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">uint</span>)Marshal.SizeOf(bo);<br />
  bo.hwnd <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> IntPtr.Zero;<br />
  bo.dwClassContext <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> (<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span>)NativeMethods.CLSCTX.CLSCTX_LOCAL_SERVER;<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
object</span> retVal <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> UnsafeNativeMethods.CoGetObject(monikerName, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">ref</span> bo,
InterfaceID);<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  return</span> (retVal);<br />
}</span>
        </p>
        <p>
Modifications: the method is now public instead of internal, and CLSCTX changed to
local server (otherwise it wouldn't work).
</p>
        <p>
Next, we need a UI:
</p>
        <p>
          <img src="http://chrison.net/content/binary/uacstartatlcomponent.png" border="0" />
        </p>
        <p>
This button is the CommandLinkWinForms control from VistaBridgeLibary, with the ShieldIcon
property set to true. 
</p>
        <p>
Let's hook up the event code:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">private</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> tryItButton_Click(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">object</span> sender,
EventArgs e)<br />
{<br />
 Guid IID_ITheElevated <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
new</span> Guid(0x5EFC3EFB, 0xC7D3, 0x4D00, 0xB7, 0x2E, 0x2F, 0x86, 0x4A, 0x1E, 0xAD,
0x06);<br /><br />
 Guid CLSID_TheElevated <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
new</span> Guid(0x253E7696, 0xA524, 0x4E49, 0x9E, 0x50, 0xBF, 0xCC, 0x29, 0x91, 0x31,
0x23);<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> object</span> o <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> UACManager.LaunchElevatedCOMObject(CLSID_TheElevated,
IID_ITheElevated);<br /><br />
 ITheElevated iface <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> (ITheElevated)o;<br /><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> //
Call the method on the interface just like in the C++ example</span><br />
 iface.ShowMe();<br /><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> //
Release the object</span><br />
 Marshal.ReleaseComObject(o);<br />
}</span>
        </p>
        <p>
The interface ID as well as class ID guids come directly from the C++ project (it
is always a good idea to "speak" more than one language), but you could obtain those
from the type library or registry as well if you don't have the source code of the
component handy.
</p>
        <p>
Object creation is handled via LaunchElevatedCOMObject, and the resultant object is
cast to the interface from the imported type library. Noteable (and important) is
the last line: because the object wasn't created by the runtime, we have to take care
of its destruction (the created interface doesn't have a Release() method, so we use
Marshal.ReleaseComObject).
</p>
        <p>
That's it - your managed code is now instantiating an elevated COM object that has
full reign over the system.
</p>
        <p>
          <a href="http://chrison.net/content/binary/ElevateCOMComponentSample.zip">ElevateCOMComponentSample.zip
(117.07 KB)</a>
        </p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=0b4c5137-0b5c-475b-9f6b-e013dc9c7d5f" />
      </body>
      <title>UAC Elevation in Managed Code: Starting Elevated COM Components</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,0b4c5137-0b5c-475b-9f6b-e013dc9c7d5f.aspx</guid>
      <link>http://chrison.net/UACElevationInManagedCodeStartingElevatedCOMComponents.aspx</link>
      <pubDate>Tue, 30 Jan 2007 09:14:50 GMT</pubDate>
      <description>&lt;p&gt;
The previous installment &lt;a href="http://chrison.net/UACElevationInManagedCodeStartingElevatedProcesses.aspx"&gt;UAC
Elevation in Managed Code: Starting Elevated Processes&lt;/a&gt; dealt with starting executables
with the "real" administrative token. In this blog post, we deal with starting a COM
component with elevated privileges. For in-depth background information, please consult
Kenny Kerr's absolutely excellent post on &lt;a href="http://weblogs.asp.net/kennykerr/archive/2006/09/29/Windows-Vista-for-Developers-_1320_-Part-4-_1320_-User-Account-Control.aspx"&gt;Windows
Vista for Developers – Part 4 – User Account Control&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
To start with, we need a COM component. Instead of writing an ATL C++ COM component
from scratch, I took the MyElevateCom sample from &lt;a href="http://blogs.msdn.com/vistacompatteam/archive/2006/09/28/CoCreateInstanceAsAdmin-or-CreateElevatedComObject-sample.aspx"&gt;CoCreateInstanceAsAdmin
or CreateElevatedComObject sample&lt;/a&gt; from the &lt;a href="http://blogs.msdn.com/vistacompatteam/"&gt;Vista
Compatibility Team Blog&lt;/a&gt;. Note that for building it, check out my post &lt;a href="http://chrison.net/VisualStudioOnVistaNotSoFast.aspx"&gt;Visual
Studio on Vista: Not so Fast!&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Assuming that you built and successfully registered the COM component (it is built
to the instuctions from Kenny's post), you can go about and write the managed caller.
First, we need a reference to the component:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/atladdcomreference.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Then comes the tricky part - actually instantiating the COM component. When you take
a look at the C++ example, you see that quite some "moniker magic" is involved that
cannot be replicated by simply newing up the component. So how to mimic this behavior
in managed code? The &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=c2b1e300-f358-4523-b479-f53d234cdccf&amp;amp;displaylang=en"&gt;Microsoft®
Windows® Software Development Kit for Windows Vista™ and .NET Framework 3.0 Runtime
Components&lt;/a&gt; comes to the rescue: inside, you find C:\Program Files\Microsoft SDKs\Windows\v6.0\Samples\CrossTechnologySamples.zip,
which contains the VistaBridge sample. 
&lt;/p&gt;
&lt;p&gt;
From that, I took the VistaBridgeLibary, and modified the static UACManager.LaunchElevatedCOMObject
method a bit:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;[&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt;:
MarshalAs(UnmanagedType.Interface)]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;object&lt;/span&gt; LaunchElevatedCOMObject(Guid
Clsid, Guid InterfaceID)&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
string&lt;/span&gt; CLSID &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; Clsid.ToString(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"B"&lt;/span&gt;); 
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
string&lt;/span&gt; monikerName &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Elevation:Administrator!new:"&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; CLSID;&lt;br&gt;
&lt;br&gt;
&amp;nbsp; NativeMethods.BIND_OPTS3 bo &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; NativeMethods.BIND_OPTS3();&lt;br&gt;
&amp;nbsp; bo.cbStruct &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; (&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;uint&lt;/span&gt;)Marshal.SizeOf(bo);&lt;br&gt;
&amp;nbsp; bo.hwnd &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; IntPtr.Zero;&lt;br&gt;
&amp;nbsp; bo.dwClassContext &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; (&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt;)NativeMethods.CLSCTX.CLSCTX_LOCAL_SERVER;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
object&lt;/span&gt; retVal &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; UnsafeNativeMethods.CoGetObject(monikerName, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;ref&lt;/span&gt; bo,
InterfaceID);&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;return&lt;/span&gt; (retVal);&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Modifications: the method is now public instead of internal, and CLSCTX changed to
local server (otherwise it wouldn't work).
&lt;/p&gt;
&lt;p&gt;
Next, we need a UI:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/uacstartatlcomponent.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
This button is the CommandLinkWinForms control from VistaBridgeLibary, with the ShieldIcon
property set to true. 
&lt;/p&gt;
&lt;p&gt;
Let's hook up the event code:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; tryItButton_Click(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;object&lt;/span&gt; sender,
EventArgs e)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;Guid IID_ITheElevated &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
new&lt;/span&gt; Guid(0x5EFC3EFB, 0xC7D3, 0x4D00, 0xB7, 0x2E, 0x2F, 0x86, 0x4A, 0x1E, 0xAD,
0x06);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;Guid CLSID_TheElevated &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; 
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
new&lt;/span&gt; Guid(0x253E7696, 0xA524, 0x4E49, 0x9E, 0x50, 0xBF, 0xCC, 0x29, 0x91, 0x31,
0x23);&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;object&lt;/span&gt; o &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; UACManager.LaunchElevatedCOMObject(CLSID_TheElevated,
IID_ITheElevated);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;ITheElevated iface &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; (ITheElevated)o;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;//
Call the method on the interface just like in the C++ example&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;iface.ShowMe();&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;//
Release the object&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;Marshal.ReleaseComObject(o);&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
The interface ID as well as class ID guids come directly from the C++ project (it
is always a good idea to "speak" more than one language), but you could obtain those
from the type library or registry as well if you don't have the source code of the
component handy.
&lt;/p&gt;
&lt;p&gt;
Object creation is handled via LaunchElevatedCOMObject, and the resultant object is
cast to the interface from the imported type library. Noteable (and important) is
the last line: because the object wasn't created by the runtime, we have to take care
of its destruction (the created interface doesn't have a Release() method, so we use
Marshal.ReleaseComObject).
&lt;/p&gt;
&lt;p&gt;
That's it - your managed code is now instantiating an elevated COM object that has
full reign over the system.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/ElevateCOMComponentSample.zip"&gt;ElevateCOMComponentSample.zip
(117.07 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=0b4c5137-0b5c-475b-9f6b-e013dc9c7d5f" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,0b4c5137-0b5c-475b-9f6b-e013dc9c7d5f.aspx</comments>
      <category>.NET</category>
      <category>Security</category>
      <category>UAC</category>
      <category>Use the source Luke</category>
      <category>Vista</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=ab8b0cbe-fc40-4b80-9b02-a33f968541d9</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,ab8b0cbe-fc40-4b80-9b02-a33f968541d9.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,ab8b0cbe-fc40-4b80-9b02-a33f968541d9.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=ab8b0cbe-fc40-4b80-9b02-a33f968541d9</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
          <img src="http://chrison.net/content/binary/areferencecouldnotbeadded.png" border="0" />
        </p>
        <p>
I would agree that this is indeed a sensible error message when I were about to add
a COM reference to an inproc (DLL) server. However, this is an out of process server,
an EXE. This guy (callee) does load in a separate process space from the caller, with
a separate instance of the .NET runtime. Someone care to enlighten me why this restriction
is in place?
</p>
        <p>
By the way, tlbimp behaves the same way (just to make sure...):
</p>
        <p>
TlbImp : error TI0000 : System.Runtime.InteropServices.COMException - Type library
'OutOfProcServer' was exported from a CLR assembly and cannot be re-imported as a
CLR assembly.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=ab8b0cbe-fc40-4b80-9b02-a33f968541d9" />
      </body>
      <title>A reference to ... could not be added</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,ab8b0cbe-fc40-4b80-9b02-a33f968541d9.aspx</guid>
      <link>http://chrison.net/AReferenceToCouldNotBeAdded.aspx</link>
      <pubDate>Tue, 30 Jan 2007 08:45:30 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/areferencecouldnotbeadded.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
I would agree that this is indeed a sensible error message when I were about to add
a COM reference to an inproc (DLL) server. However, this is an out of process server,
an EXE. This guy (callee) does load in a separate process space from the caller, with
a separate instance of the .NET runtime. Someone care to enlighten me why this restriction
is in place?
&lt;/p&gt;
&lt;p&gt;
By the way, tlbimp behaves the same way (just to make sure...):
&lt;/p&gt;
&lt;p&gt;
TlbImp : error TI0000 : System.Runtime.InteropServices.COMException - Type library
'OutOfProcServer' was exported from a CLR assembly and cannot be re-imported as a
CLR assembly.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=ab8b0cbe-fc40-4b80-9b02-a33f968541d9" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,ab8b0cbe-fc40-4b80-9b02-a33f968541d9.aspx</comments>
      <category>.NET</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=5523fa67-d5b0-4d39-b459-8019146e6391</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,5523fa67-d5b0-4d39-b459-8019146e6391.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,5523fa67-d5b0-4d39-b459-8019146e6391.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=5523fa67-d5b0-4d39-b459-8019146e6391</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
From the "What could possibly go wrong?" department: starting a WPF application (verified
offenders are MsbuildG and VistaBridge from the Windows Vista SDK) crashes Vista.
Or the graphics driver to be more precise. The result is nonetheless a perfectly reproducible
BSOD on my IBM X31 laptop. The funny part? This ATI Mobility driver (6.14.10.6546)
came from the Windows Vista Update Service and is MS HW Compat signed!
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=5523fa67-d5b0-4d39-b459-8019146e6391" />
      </body>
      <title>Crashing Vista With WPF Applications</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,5523fa67-d5b0-4d39-b459-8019146e6391.aspx</guid>
      <link>http://chrison.net/CrashingVistaWithWPFApplications.aspx</link>
      <pubDate>Mon, 29 Jan 2007 09:20:11 GMT</pubDate>
      <description>&lt;p&gt;
From the "What could possibly go wrong?" department: starting a WPF application (verified
offenders are MsbuildG and VistaBridge from the Windows Vista SDK)&amp;nbsp;crashes Vista.
Or the graphics driver to be more precise. The result is nonetheless a perfectly reproducible
BSOD on my IBM X31 laptop. The funny part? This ATI Mobility driver (6.14.10.6546)
came from the Windows Vista Update Service and is MS HW Compat signed!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=5523fa67-d5b0-4d39-b459-8019146e6391" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,5523fa67-d5b0-4d39-b459-8019146e6391.aspx</comments>
      <category>.NET</category>
      <category>Tri 0</category>
      <category>Vista</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=b9fcfe7a-a1fd-4c03-9213-f60fccc89241</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,b9fcfe7a-a1fd-4c03-9213-f60fccc89241.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,b9fcfe7a-a1fd-4c03-9213-f60fccc89241.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=b9fcfe7a-a1fd-4c03-9213-f60fccc89241</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.MattWard">Matt</a> followed
through with his promise (see <a href="http://chrison.net/CCCP12AvailableWithSetup.aspx">CCCP
1.2 Available With Setup</a>) to write a tutorial on how to create a WiX-based installer
with SharpDevelop: <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2007/01/08/CreatingAnInstallerWithSharpDevelop.aspx">Creating
an Installer with SharpDevelop</a></p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=b9fcfe7a-a1fd-4c03-9213-f60fccc89241" />
      </body>
      <title>Creating a WiX-Based Installer with SharpDevelop</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,b9fcfe7a-a1fd-4c03-9213-f60fccc89241.aspx</guid>
      <link>http://chrison.net/CreatingAWiXBasedInstallerWithSharpDevelop.aspx</link>
      <pubDate>Tue, 09 Jan 2007 07:16:16 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.MattWard"&gt;Matt&lt;/a&gt; followed
through with his promise (see &lt;a href="http://chrison.net/CCCP12AvailableWithSetup.aspx"&gt;CCCP
1.2 Available With Setup&lt;/a&gt;) to write a tutorial on how to create a WiX-based installer
with SharpDevelop: &lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2007/01/08/CreatingAnInstallerWithSharpDevelop.aspx"&gt;Creating
an Installer with SharpDevelop&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=b9fcfe7a-a1fd-4c03-9213-f60fccc89241" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,b9fcfe7a-a1fd-4c03-9213-f60fccc89241.aspx</comments>
      <category>.NET</category>
      <category>Cool Download</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=6b9ff465-cd0b-4140-8bc7-acc89a13aace</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,6b9ff465-cd0b-4140-8bc7-acc89a13aace.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,6b9ff465-cd0b-4140-8bc7-acc89a13aace.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=6b9ff465-cd0b-4140-8bc7-acc89a13aace</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today I got around to trying <a href="http://www.codeplex.com/ccnetconfig">CCNetConfig</a>,
which provides a UI for editing <a href="http://ccnet.thoughtworks.com/">CruiseControl.NET</a>'s
ccnet.config file. Thanks to the <a href="http://www.icsharpcode.net/opensource/sd/">SharpDevelop</a> project,
I have a rather good test case with a couple of continuous integration plus nightly
builds:
</p>
        <p>
          <img src="http://chrison.net/content/binary/ccnetconfig0251.png" border="0" />
        </p>
        <p>
Our ccnet.config file is maintained by using Notepad (yes, you read that right). As
such, I added a few &lt;!-- --&gt; comments here and there, mostly for pointing me
to documentation, blog articles or just disabling a feature temporarily. Therefore,
you can already guess my biggest gripe: on saving the file, it is auto-reformatted
and all my comments are gone. 
</p>
        <p>
Other than that, it is a really good way of editing ccnet.config especially because
all properties are easy to edit and you are presented the documentation automatically,
no more searching around for tag / attribute help on the Web.  Overall: very
useful if you don't spend all day being release manager.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=6b9ff465-cd0b-4140-8bc7-acc89a13aace" />
      </body>
      <title>CCNetConfig - A GUI for Editing CruiseControl.NET Configuration</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,6b9ff465-cd0b-4140-8bc7-acc89a13aace.aspx</guid>
      <link>http://chrison.net/CCNetConfigAGUIForEditingCruiseControlNETConfiguration.aspx</link>
      <pubDate>Fri, 22 Dec 2006 17:00:24 GMT</pubDate>
      <description>&lt;p&gt;
Today I got around to trying &lt;a href="http://www.codeplex.com/ccnetconfig"&gt;CCNetConfig&lt;/a&gt;,
which provides a UI for editing &lt;a href="http://ccnet.thoughtworks.com/"&gt;CruiseControl.NET&lt;/a&gt;'s
ccnet.config file. Thanks to the &lt;a href="http://www.icsharpcode.net/opensource/sd/"&gt;SharpDevelop&lt;/a&gt; project,
I have a rather good test case with a couple of continuous integration plus nightly
builds:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/ccnetconfig0251.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Our ccnet.config file is maintained by using Notepad (yes, you read that right). As
such, I added a few &amp;lt;!-- --&amp;gt; comments here and there, mostly for pointing me
to documentation, blog articles or just disabling a feature temporarily. Therefore,
you can already guess my biggest gripe: on saving the file, it is auto-reformatted
and all my comments are gone. 
&lt;/p&gt;
&lt;p&gt;
Other than that, it is a really good way of editing ccnet.config especially because
all properties are easy to edit and you are presented the documentation automatically,
no more searching around for tag / attribute help on the Web.&amp;nbsp; Overall: very
useful if you don't spend all day being release manager.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=6b9ff465-cd0b-4140-8bc7-acc89a13aace" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,6b9ff465-cd0b-4140-8bc7-acc89a13aace.aspx</comments>
      <category>.NET</category>
      <category>Cool Download</category>
      <category>Project Management</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=7ae883a7-6aef-419e-9a75-30d322a2671d</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,7ae883a7-6aef-419e-9a75-30d322a2671d.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,7ae883a7-6aef-419e-9a75-30d322a2671d.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=7ae883a7-6aef-419e-9a75-30d322a2671d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Michael Howard has all the links in this blog entry <a href="http://blogs.msdn.com/michael_howard/archive/2006/12/21/online-security-sessions-from-teched-it-forum-available.aspx">Online
Security Sessions from TechEd IT Forum Available</a>. Topics include: malware cleaning,
UAC internals, social engineering, Vista kernel changes, Vista firewall and IPSec
enhancements. Which reminds me that the post-conference DVDs should tip up in my mailbox
rsn.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=7ae883a7-6aef-419e-9a75-30d322a2671d" />
      </body>
      <title>Passing the News: Online Security Sessions from TechEd IT Forum Available</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,7ae883a7-6aef-419e-9a75-30d322a2671d.aspx</guid>
      <link>http://chrison.net/PassingTheNewsOnlineSecuritySessionsFromTechEdITForumAvailable.aspx</link>
      <pubDate>Fri, 22 Dec 2006 15:46:01 GMT</pubDate>
      <description>&lt;p&gt;
Michael Howard has all the links in this blog entry &lt;a href="http://blogs.msdn.com/michael_howard/archive/2006/12/21/online-security-sessions-from-teched-it-forum-available.aspx"&gt;Online
Security Sessions from TechEd IT Forum Available&lt;/a&gt;. Topics include: malware cleaning,
UAC internals, social engineering, Vista kernel changes, Vista firewall and IPSec
enhancements. Which reminds me that the post-conference DVDs should tip up in my mailbox
rsn.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=7ae883a7-6aef-419e-9a75-30d322a2671d" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,7ae883a7-6aef-419e-9a75-30d322a2671d.aspx</comments>
      <category>.NET</category>
      <category>Security</category>
      <category>Training and Conferences</category>
      <category>Vista</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=a0a62372-1488-4d98-b714-173ce90996a4</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,a0a62372-1488-4d98-b714-173ce90996a4.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,a0a62372-1488-4d98-b714-173ce90996a4.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=a0a62372-1488-4d98-b714-173ce90996a4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This Q&amp;A item is part of the <a href="http://msdn.microsoft.com/msdnmag/issues/06/11/SecurityBriefs/default.aspx">current
MSDN magazine's Security Brief's column</a> by <a href="http://www.pluralsight.com/blogs/keith/default.aspx">Keith
Brown</a>. I am pretty sure that this problem will rear its head sooner or later on
every developers machine, that's why I am 'pinning' the link in my blog for my own
reference too.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=a0a62372-1488-4d98-b714-173ce90996a4" />
      </body>
      <title>Security Brief: Why won't my simple WCF service start when I run it as a non-administrator?</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,a0a62372-1488-4d98-b714-173ce90996a4.aspx</guid>
      <link>http://chrison.net/SecurityBriefWhyWontMySimpleWCFServiceStartWhenIRunItAsANonadministrator.aspx</link>
      <pubDate>Sun, 12 Nov 2006 15:41:26 GMT</pubDate>
      <description>&lt;p&gt;
This Q&amp;amp;A item is part of the &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/11/SecurityBriefs/default.aspx"&gt;current
MSDN magazine's Security Brief's column&lt;/a&gt; by &lt;a href="http://www.pluralsight.com/blogs/keith/default.aspx"&gt;Keith
Brown&lt;/a&gt;. I am pretty sure that this problem will rear its head sooner or later on
every developers machine, that's why I am 'pinning' the link in my blog for my own
reference too.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=a0a62372-1488-4d98-b714-173ce90996a4" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,a0a62372-1488-4d98-b714-173ce90996a4.aspx</comments>
      <category>.NET</category>
      <category>IIS</category>
      <category>Security</category>
      <category>3.0</category>
      <category>WCF</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=12cc87b1-a461-442f-8a49-7eff8aea58dd</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,12cc87b1-a461-442f-8a49-7eff8aea58dd.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,12cc87b1-a461-442f-8a49-7eff8aea58dd.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=12cc87b1-a461-442f-8a49-7eff8aea58dd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
From the <a href="http://www.microsoft.com/uk/msdn/events/nuggets.aspx">nuggets page</a>: <em>Don't
have the time to read a 10-page how-to article or watch a full length webcast? Try
an MSDN Nugget, a webcast that takes you step-by-step to discovering new functionality
or exploring a hot developer topic, all in 10-15 minutes.</em> If you haven't seen
this yet, check it out!
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=12cc87b1-a461-442f-8a49-7eff8aea58dd" />
      </body>
      <title>MSDN Nuggets</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,12cc87b1-a461-442f-8a49-7eff8aea58dd.aspx</guid>
      <link>http://chrison.net/MSDNNuggets.aspx</link>
      <pubDate>Wed, 08 Nov 2006 14:04:26 GMT</pubDate>
      <description>&lt;p&gt;
From the &lt;a href="http://www.microsoft.com/uk/msdn/events/nuggets.aspx"&gt;nuggets page&lt;/a&gt;: &lt;em&gt;Don't
have the time to read a 10-page how-to article or watch a full length webcast? Try
an MSDN Nugget, a webcast that takes you step-by-step to discovering new functionality
or exploring a hot developer topic, all in 10-15 minutes.&lt;/em&gt; If you haven't seen
this yet, check it out!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=12cc87b1-a461-442f-8a49-7eff8aea58dd" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,12cc87b1-a461-442f-8a49-7eff8aea58dd.aspx</comments>
      <category>.NET</category>
      <category>ASP.NET</category>
      <category>BCL</category>
      <category>Training and Conferences</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=928122fb-5683-4a1d-96d3-7670e05cb46e</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,928122fb-5683-4a1d-96d3-7670e05cb46e.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,928122fb-5683-4a1d-96d3-7670e05cb46e.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=928122fb-5683-4a1d-96d3-7670e05cb46e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Read the post from Miguel <a href="http://tirania.org/blog/archive/2006/Nov-02.html">Microsoft
and Novell Collaborate</a>. Good news for Mono, OpenOffice and Samba.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=928122fb-5683-4a1d-96d3-7670e05cb46e" />
      </body>
      <title>Open Source (.NET) News</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,928122fb-5683-4a1d-96d3-7670e05cb46e.aspx</guid>
      <link>http://chrison.net/OpenSourceNETNews.aspx</link>
      <pubDate>Fri, 03 Nov 2006 09:56:43 GMT</pubDate>
      <description>&lt;p&gt;
Read the post from Miguel &lt;a href="http://tirania.org/blog/archive/2006/Nov-02.html"&gt;Microsoft
and Novell Collaborate&lt;/a&gt;. Good news for Mono, OpenOffice and Samba.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=928122fb-5683-4a1d-96d3-7670e05cb46e" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,928122fb-5683-4a1d-96d3-7670e05cb46e.aspx</comments>
      <category>.NET</category>
      <category>Newsbites</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=0217cbb0-cdcc-4afa-b055-c4d99112d907</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,0217cbb0-cdcc-4afa-b055-c4d99112d907.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,0217cbb0-cdcc-4afa-b055-c4d99112d907.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=0217cbb0-cdcc-4afa-b055-c4d99112d907</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today, we shipped Beta 2 of SharpDevelop 2.1 (<a href="http://community.sharpdevelop.net/forums/thread/11710.aspx">release
information</a>). Usually, we only ship two betas (followed by release candidates),
but last weekend we decided to add a third one to this release cycle - to build a
rock-solid foundation for the releases coming after version 2.1.
</p>
        <p>
Speaking of last weekend: three of us met for the annual #develop developer days (#d^3
2006, a four day event) - way short of the original invitation list. But this turned
out to be an advantage for discussing architecture and componentization. A lot of
improvements already made it into Beta 2, a few more are yet to come in Beta 3. 
<br /></p>
        <p>
Part of this effort was the creation of a <a href="http://laputa.sharpdevelop.net/SharpDevelopPresentation.aspx">presentation
on SharpDevelop</a>, which includes an area of interest to all .NET developers out
there: a list of our components that can be reused outside the context of SharpDevelop
plus the documentation and samples for those components. Remember: SharpDevelop is
LGPL, so feel free to use our components!
</p>
        <p>
In addition to this "general" slide deck, Daniel (SharpDevelop technical lead) also
created a "Level 600" introduction to NRefactory, which can be found <a href="http://laputa.sharpdevelop.net/NRefactoryInternalsPresentation.aspx">here</a>.
Definitely interesting for those of you that want to <a href="http://laputa.sharpdevelop.net/CompletionDemo.aspx">use
code completion in our text editor control</a>.
</p>
        <p>
Finally, <a href="http://laputa.sharpdevelop.net/SharpReportStandalone.aspx">SharpReport
now is a project in its own respect</a>. The reason(s)? Well, SharpDevelop and SharpReport
are developed on different schedules, so now we are customers of each other and no
longer intertwined. Cool stuff coming on this front: export to various formats, allowing
you to use SharpReport - yes - for generating reports in ASP.NET sites!<br /></p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=0217cbb0-cdcc-4afa-b055-c4d99112d907" />
      </body>
      <title>Another Beta of SharpDevelop 2.1 Has Arrived</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,0217cbb0-cdcc-4afa-b055-c4d99112d907.aspx</guid>
      <link>http://chrison.net/AnotherBetaOfSharpDevelop21HasArrived.aspx</link>
      <pubDate>Thu, 02 Nov 2006 16:15:38 GMT</pubDate>
      <description>&lt;p&gt;
Today, we shipped Beta 2 of SharpDevelop 2.1 (&lt;a href="http://community.sharpdevelop.net/forums/thread/11710.aspx"&gt;release
information&lt;/a&gt;). Usually, we only ship two betas (followed by release candidates),
but last weekend we decided to add a third one to this release cycle - to build a
rock-solid foundation for the releases coming after version 2.1.
&lt;/p&gt;
&lt;p&gt;
Speaking of last weekend: three of us met for the annual #develop developer days (#d^3
2006, a four day event) - way short of the original invitation list. But this turned
out to be an advantage for discussing architecture and componentization. A lot of
improvements already made it into Beta 2, a few more are yet to come in Beta 3. 
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
Part of this effort was the creation of a &lt;a href="http://laputa.sharpdevelop.net/SharpDevelopPresentation.aspx"&gt;presentation
on SharpDevelop&lt;/a&gt;, which includes an area of interest to all .NET developers out
there: a list of our components that can be reused outside the context of SharpDevelop
plus the documentation and samples for those components. Remember: SharpDevelop is
LGPL, so feel free to use our components!
&lt;/p&gt;
&lt;p&gt;
In addition to this "general" slide deck, Daniel (SharpDevelop technical lead) also
created a "Level 600" introduction to NRefactory, which can be found &lt;a href="http://laputa.sharpdevelop.net/NRefactoryInternalsPresentation.aspx"&gt;here&lt;/a&gt;.
Definitely interesting for those of you that want to &lt;a href="http://laputa.sharpdevelop.net/CompletionDemo.aspx"&gt;use
code completion in our text editor control&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Finally, &lt;a href="http://laputa.sharpdevelop.net/SharpReportStandalone.aspx"&gt;SharpReport
now is a project in its own respect&lt;/a&gt;. The reason(s)? Well, SharpDevelop and SharpReport
are developed on different schedules, so now we are customers of each other and no
longer intertwined. Cool stuff coming on this front: export to various formats, allowing
you to use SharpReport - yes - for generating reports in ASP.NET sites!&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=0217cbb0-cdcc-4afa-b055-c4d99112d907" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,0217cbb0-cdcc-4afa-b055-c4d99112d907.aspx</comments>
      <category>.NET</category>
      <category>Cool Download</category>
      <category>this</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=767750a1-d605-4b74-992a-e0282878ec06</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,767750a1-d605-4b74-992a-e0282878ec06.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,767750a1-d605-4b74-992a-e0282878ec06.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=767750a1-d605-4b74-992a-e0282878ec06</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The <a href="http://msdn.microsoft.com/msdnmag/issues/06/11/default.aspx">November
2006</a> issue has lots of good security articles, which are available online too.
Check out <a href="http://msdn.microsoft.com/msdnmag/issues/06/11/SecureHabits/default.aspx">Security
Habits</a>, <a href="http://msdn.microsoft.com/msdnmag/issues/06/11/ThreatModeling/default.aspx">Threat
Modeling (STRIDE approach)</a>, <a href="http://msdn.microsoft.com/msdnmag/issues/06/11/ExtendingSDL/default.aspx">Extending
SDL</a> or <a href="http://msdn.microsoft.com/msdnmag/issues/06/11/SQLSecurity/default.aspx">SQL
Security</a> to name a few.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=767750a1-d605-4b74-992a-e0282878ec06" />
      </body>
      <title>The Yearly MSDN Magazine Security Issue Has Landed</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,767750a1-d605-4b74-992a-e0282878ec06.aspx</guid>
      <link>http://chrison.net/TheYearlyMSDNMagazineSecurityIssueHasLanded.aspx</link>
      <pubDate>Wed, 01 Nov 2006 12:56:55 GMT</pubDate>
      <description>&lt;p&gt;
The &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/11/default.aspx"&gt;November
2006&lt;/a&gt; issue has lots of good security articles, which are available online too.
Check out &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/11/SecureHabits/default.aspx"&gt;Security
Habits&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/11/ThreatModeling/default.aspx"&gt;Threat
Modeling (STRIDE approach)&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/11/ExtendingSDL/default.aspx"&gt;Extending
SDL&lt;/a&gt; or &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/11/SQLSecurity/default.aspx"&gt;SQL
Security&lt;/a&gt; to name a few.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=767750a1-d605-4b74-992a-e0282878ec06" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,767750a1-d605-4b74-992a-e0282878ec06.aspx</comments>
      <category>.NET</category>
      <category>Security</category>
      <category>SQL Server</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=5598e23e-647a-4ac8-8196-d180569fee67</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,5598e23e-647a-4ac8-8196-d180569fee67.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,5598e23e-647a-4ac8-8196-d180569fee67.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=5598e23e-647a-4ac8-8196-d180569fee67</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last Tuesday, I held the talk "Advanced Code Access Security" at UG Styria in Graz.
This talk was originally part of the MSDN Security Briefings held in Austria earlier
this year, for which MS Austria had asked MVPs to help create and deliver security
content. Advanced CAS seemed an interesting enough developer topic to re-run at user
groups, and <a href="http://blogs.msdn.com/mszcool/">Mario</a> (the author of this
session) has allowed me to publish the slide deck and demos for the general public.
</p>
        <p>
          <a href="http://chrison.net/content/binary/AdvancedCodeAccessSecurity.pdf">AdvancedCodeAccessSecurity.pdf
(4542 KB)</a>
        </p>
        <p>
          <a href="http://chrison.net/content/binary/AdvancedCAS.zip">AdvancedCAS.zip (599.6
KB)</a>
        </p>
        <p>
Please note that I have published only demos four (setting CAS via setup) and
six (using CAS in addin application) - those are the "completed" versions of
the demos.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=5598e23e-647a-4ac8-8196-d180569fee67" />
      </body>
      <title>Advanced Code Access Security</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,5598e23e-647a-4ac8-8196-d180569fee67.aspx</guid>
      <link>http://chrison.net/AdvancedCodeAccessSecurity.aspx</link>
      <pubDate>Mon, 30 Oct 2006 08:10:54 GMT</pubDate>
      <description>&lt;p&gt;
Last Tuesday, I held the talk "Advanced Code Access Security" at UG Styria in Graz.
This talk was originally part of the MSDN Security Briefings held in Austria earlier
this year, for which MS Austria had asked MVPs to help create and deliver security
content. Advanced CAS seemed an interesting enough developer topic to re-run at user
groups, and &lt;a href="http://blogs.msdn.com/mszcool/"&gt;Mario&lt;/a&gt; (the author of this
session) has allowed me to publish the slide deck and demos for the general public.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/AdvancedCodeAccessSecurity.pdf"&gt;AdvancedCodeAccessSecurity.pdf
(4542 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/AdvancedCAS.zip"&gt;AdvancedCAS.zip (599.6
KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Please note that I have published only demos four (setting CAS via setup)&amp;nbsp;and
six (using CAS in addin application)&amp;nbsp;- those are the "completed" versions of
the demos.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=5598e23e-647a-4ac8-8196-d180569fee67" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,5598e23e-647a-4ac8-8196-d180569fee67.aspx</comments>
      <category>.NET</category>
      <category>2 Ohhhh</category>
      <category>Community</category>
      <category>Cool Download</category>
      <category>Security</category>
      <category>this</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=a93ea6f3-32b6-4350-888d-94395ffcc9ed</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,a93ea6f3-32b6-4350-888d-94395ffcc9ed.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,a93ea6f3-32b6-4350-888d-94395ffcc9ed.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=a93ea6f3-32b6-4350-888d-94395ffcc9ed</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today, I was asked whether there was a "real" difference between debug and release
builds of a C# project - other than the PDB files. I didn't know for sure, so I set
out on a search for more information, which turned up the blog entry <a href="http://blogs.msdn.com/jaybaz_ms/archive/2004/06/28/168314.aspx">debug
vs. release in C#. </a>The interesting part is the first comment by <a href="http://blogs.msdn.com/joshwil/">Josh
Williams</a>: "...the /debug[+|-] switch controls JIT optimizations &lt;snip /&gt;.
Disabling JIT optimizations is very useful for debugging purposes but will very much
affect the runtime perf of an app as much of the optmization of your code is done
by the JIT, not CSC..."
</p>
        <p>
Now that definitely turns shipping a debug build to customers into a non-starter.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=a93ea6f3-32b6-4350-888d-94395ffcc9ed" />
      </body>
      <title>What does the /debug+ switch really do?</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,a93ea6f3-32b6-4350-888d-94395ffcc9ed.aspx</guid>
      <link>http://chrison.net/WhatDoesTheDebugSwitchReallyDo.aspx</link>
      <pubDate>Tue, 10 Oct 2006 18:28:09 GMT</pubDate>
      <description>&lt;p&gt;
Today, I was asked whether there was a "real" difference between debug and release
builds of a C# project - other than the PDB files. I didn't know for sure, so I set
out on a search for more information, which turned up the blog entry &lt;a href="http://blogs.msdn.com/jaybaz_ms/archive/2004/06/28/168314.aspx"&gt;debug
vs. release in C#. &lt;/a&gt;The interesting part is the first comment by &lt;a href="http://blogs.msdn.com/joshwil/"&gt;Josh
Williams&lt;/a&gt;: "...the /debug[+|-] switch controls JIT optimizations &amp;lt;snip /&amp;gt;.
Disabling JIT optimizations is very useful for debugging purposes but will very much
affect the runtime perf of an app as much of the optmization of your code is done
by the JIT, not CSC..."
&lt;/p&gt;
&lt;p&gt;
Now that definitely turns shipping a debug build to customers into a non-starter.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=a93ea6f3-32b6-4350-888d-94395ffcc9ed" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,a93ea6f3-32b6-4350-888d-94395ffcc9ed.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=964f5235-28ee-444f-b61e-17ac54251529</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,964f5235-28ee-444f-b61e-17ac54251529.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,964f5235-28ee-444f-b61e-17ac54251529.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=964f5235-28ee-444f-b61e-17ac54251529</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Beta 1 of SharpDevelop2 2.1 is <a href="http://www.icsharpcode.net/OpenSource/SD/Download/#SharpDevelop221">available
for download</a>. While I was putting together the <a href="http://community.sharpdevelop.net/forums/thread/11710.aspx">annoucement
for v2.1</a> yesterday, I realized that for a point release, we really managed to
put in a lot of new cool features:
</p>
        <ul>
          <li>
            <a href="http://laputa.sharpdevelop.net/FxCopSupportInSharpDevelop221Serralongue.aspx">FxCop
Support</a>
          </li>
          <li>
            <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/06/20/UsingTheComponentInspector.aspx">Component
Inspector</a>
          </li>
          <li>
            <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/17/WixIntegration.aspx">WiX
Support</a>
          </li>
          <li>
            <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/09/IncrementalSearchInSharpDevelop21.aspx">Incremental
Search</a>
          </li>
          <li>
            <a href="http://community.sharpdevelop.net/blogs/davidalpert/archive/2006/09/18/Code-Navigation-History.aspx">Code
Navigation History</a>
          </li>
          <li>
            <a href="http://laputa.sharpdevelop.net/AnnouncingSupportForListDataSourcesInSharpReport.aspx">List
Data Sources in SharpReport</a>
          </li>
          <li>
            <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/05/TestingXPathQueriesInSharpDevelop.aspx">XPath
Queries</a>
          </li>
          <li>
            <a href="http://laputa.sharpdevelop.net/CodeCompletionSupportForNET1011AndCompactFramework20.aspx">Code
Completion for Different Frameworks</a>
          </li>
          <li>
            <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/09/GoToXmlSchemaDefinition.aspx">GoTo
XML Schema Definition</a>
          </li>
          <li>
            <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/02/18/TargetingDifferentFrameworksWithVBNet.aspx">Targeting
Different Frameworks</a>
          </li>
          <li>
            <a href="http://laputa.sharpdevelop.net/AnnouncingSharpDevelopForApplicationsSDA.aspx">Hosting
of SharpDevelop in 3rd Party Applications</a>
          </li>
        </ul>
        <p>
A couple of WOW features (for me, at least): Not only can you compile an application
for different versions of .NET, you also get version-specific code completion support.
Another cool one is that you can host SharpDevelop in your application, providing
your application a "macro editor" (on steroids I might add) with full .NET support.
And to pick a third, code analysis rounds out our professional offering in addition
to code coverage as well as unit testing.
</p>
        <p>
Two features did not make it for the Beta 1 announcement as they don't yet cover all
the scenarios we are hoping for: integrated Subversion support (yeah!) and targetting
the Compact Framework for Windows CE devices. Those slipped silently into this release.
</p>
        <p>
As you can see, SharpDevelop is ever growing and the developers working on it can
be rightly proud of their achievements!
</p>
        <p>
Finally, a kind of "call to action": let us know what you think! Not only in <a href="http://community.sharpdevelop.net/forums/">our
forums</a>, but also in your blogs, communities, et cetera. We need your feedback
regarding feature set, stability, and much more.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=964f5235-28ee-444f-b61e-17ac54251529" />
      </body>
      <title>SharpDevelop2 2.1 Beta 1</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,964f5235-28ee-444f-b61e-17ac54251529.aspx</guid>
      <link>http://chrison.net/SharpDevelop221Beta1.aspx</link>
      <pubDate>Tue, 19 Sep 2006 10:10:55 GMT</pubDate>
      <description>&lt;p&gt;
Beta 1 of SharpDevelop2 2.1 is &lt;a href="http://www.icsharpcode.net/OpenSource/SD/Download/#SharpDevelop221"&gt;available
for download&lt;/a&gt;. While I was putting together the &lt;a href="http://community.sharpdevelop.net/forums/thread/11710.aspx"&gt;annoucement
for v2.1&lt;/a&gt; yesterday, I realized that for a point release, we really managed to
put in a lot of new cool features:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://laputa.sharpdevelop.net/FxCopSupportInSharpDevelop221Serralongue.aspx"&gt;FxCop
Support&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/06/20/UsingTheComponentInspector.aspx"&gt;Component
Inspector&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/17/WixIntegration.aspx"&gt;WiX
Support&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/09/IncrementalSearchInSharpDevelop21.aspx"&gt;Incremental
Search&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://community.sharpdevelop.net/blogs/davidalpert/archive/2006/09/18/Code-Navigation-History.aspx"&gt;Code
Navigation History&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://laputa.sharpdevelop.net/AnnouncingSupportForListDataSourcesInSharpReport.aspx"&gt;List
Data Sources in SharpReport&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/05/TestingXPathQueriesInSharpDevelop.aspx"&gt;XPath
Queries&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://laputa.sharpdevelop.net/CodeCompletionSupportForNET1011AndCompactFramework20.aspx"&gt;Code
Completion for Different Frameworks&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/09/GoToXmlSchemaDefinition.aspx"&gt;GoTo
XML Schema Definition&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/02/18/TargetingDifferentFrameworksWithVBNet.aspx"&gt;Targeting
Different Frameworks&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://laputa.sharpdevelop.net/AnnouncingSharpDevelopForApplicationsSDA.aspx"&gt;Hosting
of SharpDevelop in 3rd Party Applications&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
A couple of WOW features (for me, at least): Not only can you compile an application
for different versions of .NET, you also get version-specific code completion support.
Another cool one is that you can host SharpDevelop in your application, providing
your application a "macro editor" (on steroids I might add)&amp;nbsp;with full .NET support.
And to pick a third, code analysis rounds out our professional offering in addition
to code coverage as well as unit testing.
&lt;/p&gt;
&lt;p&gt;
Two features did not make it for the Beta 1 announcement as they don't yet cover all
the scenarios we are hoping for: integrated Subversion support (yeah!) and targetting
the Compact Framework for Windows CE devices. Those slipped silently into this release.
&lt;/p&gt;
&lt;p&gt;
As you can see, SharpDevelop is ever growing and the developers working on it can
be rightly proud of their achievements!
&lt;/p&gt;
&lt;p&gt;
Finally,&amp;nbsp;a kind of "call to action": let us know what you think! Not only in &lt;a href="http://community.sharpdevelop.net/forums/"&gt;our
forums&lt;/a&gt;, but also in your blogs, communities, et cetera. We need your feedback
regarding feature set, stability, and much more.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=964f5235-28ee-444f-b61e-17ac54251529" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,964f5235-28ee-444f-b61e-17ac54251529.aspx</comments>
      <category>.NET</category>
      <category>2 Ohhhh</category>
      <category>C#</category>
      <category>Cool Download</category>
      <category>Subversion</category>
      <category>this</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=0221444a-3391-4d88-b356-62ce7b196be7</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,0221444a-3391-4d88-b356-62ce7b196be7.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,0221444a-3391-4d88-b356-62ce7b196be7.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=0221444a-3391-4d88-b356-62ce7b196be7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Disclaimer: I am the PM for the #develop project.
</p>
        <p>
After almost two years in development, the #develop team has shipped version 2.0 of
its open source integrated development environment (IDE) <a href="http://www.icsharpcode.net/OpenSource/SD/Default.aspx">SharpDevelop2</a>.
The new version supports the .sln / .*proj project file formats of Visual Studio 2005,
therefore you can open and edit existing projects inside SharpDevelop2. The team however
does not view SharpDevelop2 as a competitor for the Express line of products (<a href="http://community.sharpdevelop.net/blogs/mattward/articles/VisualStudioExpressComparison.aspx">comparison</a>) from
Microsoft, but it aims at software developers that need best of breed tools for
their software development process - like unit testing, code coverage, documentation
generation and more. In the same vein, <a href="http://wiki.icsharpcode.net/default.aspx/SharpDevelop.SharpDevelop21Features">version
2.1</a> will complement those existing features with integrated source code control,
code analysis tools as well component testing.
</p>
        <p>
SharpDevelop2 is especially well-suited for <a href="http://community.sharpdevelop.net/blogs/mattward/articles/FeatureTourCreatingBooApplications.aspx">developers
that chose the Boo</a> language, because SharpDevelop2 offers first-class support
for code completion as well as the Windows Forms designer. Aside from this unique
selling point there a couple of smaller but nonetheless <a href="http://community.sharpdevelop.net/blogs/mattward/articles/FeatureTour.aspx">productivity-enhancing
features in version 2.0</a>: code conversion (eg VB.NET to C#, <a href="http://developer.sharpdevelop.net/codeconvert.net/">but
see for yourself</a>), support for Mono, documentation preview, RegEx compilation
und quite a few more.
</p>
        <p>
A lot of the features are owed to the ease of integration and extensibility provided
by the addin system found in SharpDevelop2. This <a href="http://www.codeproject.com/csharp/ICSharpCodeCore.asp">addin
system can be used by developers in their own application</a> - this being the reason
for the rather unconventional license choice for SharpDevelop2: <a href="http://laputa.sharpdevelop.net/SharpDevelop2LicenseChangedToLGPL.aspx">LGPL
instead of GPL</a>, which is much more common for development tools such as #develop.
Re-use by third parties has been the driving factor to change the license.
</p>
        <p>
Thanks to <a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.Contributors">all
the contributors</a> that made SharpDevelop2 a reality, especially the technical lead
on the 2.x effort, Daniel Grunwald.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=0221444a-3391-4d88-b356-62ce7b196be7" />
      </body>
      <title>SharpDevelop2 2.0 Final Hits the (Virtual) Streets</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,0221444a-3391-4d88-b356-62ce7b196be7.aspx</guid>
      <link>http://chrison.net/SharpDevelop220FinalHitsTheVirtualStreets.aspx</link>
      <pubDate>Mon, 17 Jul 2006 13:07:33 GMT</pubDate>
      <description>&lt;p&gt;
Disclaimer: I am the PM for the #develop project.
&lt;/p&gt;
&lt;p&gt;
After almost two years in development, the #develop team has shipped version 2.0 of
its open source integrated development environment (IDE)&amp;nbsp;&lt;a href="http://www.icsharpcode.net/OpenSource/SD/Default.aspx"&gt;SharpDevelop2&lt;/a&gt;.
The new version supports the .sln / .*proj project file formats of Visual Studio 2005,
therefore you can open and edit existing projects inside SharpDevelop2. The team however
does not view SharpDevelop2 as a competitor for the Express line of products (&lt;a href="http://community.sharpdevelop.net/blogs/mattward/articles/VisualStudioExpressComparison.aspx"&gt;comparison&lt;/a&gt;)&amp;nbsp;from
Microsoft, but it aims at software developers that need best&amp;nbsp;of breed tools for
their software development process - like unit testing, code coverage, documentation
generation and more. In the same vein, &lt;a href="http://wiki.icsharpcode.net/default.aspx/SharpDevelop.SharpDevelop21Features"&gt;version
2.1&lt;/a&gt; will complement those existing features with integrated source code control,
code analysis tools as well component testing.
&lt;/p&gt;
&lt;p&gt;
SharpDevelop2 is especially well-suited for &lt;a href="http://community.sharpdevelop.net/blogs/mattward/articles/FeatureTourCreatingBooApplications.aspx"&gt;developers
that chose the Boo&lt;/a&gt; language, because SharpDevelop2 offers first-class support
for code completion as well as the Windows Forms designer. Aside from this unique
selling point there a couple of smaller but nonetheless &lt;a href="http://community.sharpdevelop.net/blogs/mattward/articles/FeatureTour.aspx"&gt;productivity-enhancing
features in version 2.0&lt;/a&gt;: code conversion (eg VB.NET to C#, &lt;a href="http://developer.sharpdevelop.net/codeconvert.net/"&gt;but
see for yourself&lt;/a&gt;), support for Mono, documentation preview, RegEx compilation
und quite a few more.
&lt;/p&gt;
&lt;p&gt;
A lot of the features are owed to the ease of integration and extensibility provided
by the addin system found in SharpDevelop2. This &lt;a href="http://www.codeproject.com/csharp/ICSharpCodeCore.asp"&gt;addin
system can be used by developers in their own application&lt;/a&gt; - this being the reason
for the rather unconventional license choice for SharpDevelop2: &lt;a href="http://laputa.sharpdevelop.net/SharpDevelop2LicenseChangedToLGPL.aspx"&gt;LGPL
instead of GPL&lt;/a&gt;, which is much more common for development tools such as #develop.
Re-use by third parties has been the driving factor to change the license.
&lt;/p&gt;
&lt;p&gt;
Thanks to &lt;a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.Contributors"&gt;all
the contributors&lt;/a&gt; that made SharpDevelop2 a reality, especially the technical lead
on the 2.x effort, Daniel Grunwald.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=0221444a-3391-4d88-b356-62ce7b196be7" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,0221444a-3391-4d88-b356-62ce7b196be7.aspx</comments>
      <category>.NET</category>
      <category>2 Ohhhh</category>
      <category>Cool Download</category>
      <category>Newsbites</category>
      <category>this</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=29b709fa-f725-49d5-84b7-29c30db32bd4</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,29b709fa-f725-49d5-84b7-29c30db32bd4.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,29b709fa-f725-49d5-84b7-29c30db32bd4.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=29b709fa-f725-49d5-84b7-29c30db32bd4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.microsoft.com/downloads/details.aspx?familyid=c5d2a236-9e4b-46d6-9ef4-12edbe08968e&amp;displaylang=en">Get
it here</a>
        </p>
        <p>
Currently reading: <a href="http://www.microsoft.com/MSPress/books/8753.asp">The Security
Development Lifecycle</a></p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=29b709fa-f725-49d5-84b7-29c30db32bd4" />
      </body>
      <title>Microsoft Threat Analysis &amp; Modeling v2.0 RC2</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,29b709fa-f725-49d5-84b7-29c30db32bd4.aspx</guid>
      <link>http://chrison.net/MicrosoftThreatAnalysisModelingV20RC2.aspx</link>
      <pubDate>Thu, 29 Jun 2006 05:47:25 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=c5d2a236-9e4b-46d6-9ef4-12edbe08968e&amp;amp;displaylang=en"&gt;Get
it here&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Currently reading: &lt;a href="http://www.microsoft.com/MSPress/books/8753.asp"&gt;The Security
Development Lifecycle&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=29b709fa-f725-49d5-84b7-29c30db32bd4" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,29b709fa-f725-49d5-84b7-29c30db32bd4.aspx</comments>
      <category>.NET</category>
      <category>Project Management</category>
      <category>Security</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=42695a47-8126-4d20-8526-c936bc03f1cc</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,42695a47-8126-4d20-8526-c936bc03f1cc.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,42695a47-8126-4d20-8526-c936bc03f1cc.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=42695a47-8126-4d20-8526-c936bc03f1cc</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <ul>
          <li>
            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=8d09697e-4868-4d8d-a4cf-9b82a2ae542d&amp;displaylang=en">Microsoft
Pre-Release Software Microsoft .NET Framework 3.0 - June 2006 CTP</a> (Note: on Vista,
only build 5456 is supported!)</li>
          <li>
            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=1a994549-94cb-4f61-903d-a8c8e453eef4&amp;displaylang=en">Microsoft
Visual Studio Code Name “Orcas” Community Technology Preview – Development Tools for
.NET Framework 3.0</a>
          </li>
          <li>
            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=63a80a4b-bd27-4124-a2a5-61786adb626e&amp;displaylang=en">Microsoft®
Visual Studio® 2005 Extensions for Windows® Workflow Foundation Release Candidate
2</a>
          </li>
          <li>
            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=2e575633-e357-4ee7-aaff-34138f00e830&amp;displaylang=en">Hands-on
Labs for Windows® Workflow Foundation Release Candidates</a>
            <br />
          </li>
        </ul>
        <p>
And if you still haven't had time to take a closer look at WinWF, check out Karsten's <a href="http://blogs.msdn.com/karstenj/archive/2006/06/15/632639.aspx">My
Five Day Course For Hitting the WPF Curve/Cliff</a>.
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=42695a47-8126-4d20-8526-c936bc03f1cc" />
      </body>
      <title>Assorted .NET Framework 3.0 Downloads</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,42695a47-8126-4d20-8526-c936bc03f1cc.aspx</guid>
      <link>http://chrison.net/AssortedNETFramework30Downloads.aspx</link>
      <pubDate>Mon, 26 Jun 2006 12:10:48 GMT</pubDate>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=8d09697e-4868-4d8d-a4cf-9b82a2ae542d&amp;amp;displaylang=en"&gt;Microsoft
Pre-Release Software Microsoft .NET Framework 3.0 - June 2006 CTP&lt;/a&gt; (Note: on Vista,
only build 5456 is supported!)&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=1a994549-94cb-4f61-903d-a8c8e453eef4&amp;amp;displaylang=en"&gt;Microsoft
Visual Studio Code Name “Orcas” Community Technology Preview – Development Tools for
.NET Framework 3.0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=63a80a4b-bd27-4124-a2a5-61786adb626e&amp;amp;displaylang=en"&gt;Microsoft®
Visual Studio® 2005 Extensions for Windows® Workflow Foundation Release Candidate
2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=2e575633-e357-4ee7-aaff-34138f00e830&amp;amp;displaylang=en"&gt;Hands-on
Labs for Windows® Workflow Foundation Release Candidates&lt;/a&gt;
&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
And if you still haven't had time to take a closer look at WinWF, check out Karsten's &lt;a href="http://blogs.msdn.com/karstenj/archive/2006/06/15/632639.aspx"&gt;My
Five Day Course For Hitting the WPF Curve/Cliff&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=42695a47-8126-4d20-8526-c936bc03f1cc" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,42695a47-8126-4d20-8526-c936bc03f1cc.aspx</comments>
      <category>.NET</category>
      <category>Tri 0</category>
      <category>Vista</category>
      <category>Visual Studio</category>
      <category>Workflow Foundation</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=5fabf4ed-6d79-4289-bac1-6905540aadc4</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,5fabf4ed-6d79-4289-bac1-6905540aadc4.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,5fabf4ed-6d79-4289-bac1-6905540aadc4.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=5fabf4ed-6d79-4289-bac1-6905540aadc4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The blog post <a href="http://blogs.msdn.com/dataaccess/archive/2006/06/20/638378.aspx">ADO.NET
vNext: The Entity Framework, LINQ and more</a> on the <a href="http://blogs.msdn.com/dataaccess/">Data
Access Blog</a> has links to all relevant articles on the next version of ADO.NET
and the Entity Data Model (EDM). Make sure to read at least the vision document.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=5fabf4ed-6d79-4289-bac1-6905540aadc4" />
      </body>
      <title>ADO.NET vNext: The Entity Framework, LINQ and more</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,5fabf4ed-6d79-4289-bac1-6905540aadc4.aspx</guid>
      <link>http://chrison.net/ADONETVNextTheEntityFrameworkLINQAndMore.aspx</link>
      <pubDate>Tue, 20 Jun 2006 12:06:47 GMT</pubDate>
      <description>&lt;p&gt;
The blog post &lt;a href="http://blogs.msdn.com/dataaccess/archive/2006/06/20/638378.aspx"&gt;ADO.NET
vNext: The Entity Framework, LINQ and more&lt;/a&gt; on the &lt;a href="http://blogs.msdn.com/dataaccess/"&gt;Data
Access Blog&lt;/a&gt; has links to all relevant articles on the next version of ADO.NET
and the Entity Data Model (EDM). Make sure to read at least the vision document.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=5fabf4ed-6d79-4289-bac1-6905540aadc4" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,5fabf4ed-6d79-4289-bac1-6905540aadc4.aspx</comments>
      <category>.NET</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=6ee03559-ed16-421a-9df5-42f36b9d77a2</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,6ee03559-ed16-421a-9df5-42f36b9d77a2.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,6ee03559-ed16-421a-9df5-42f36b9d77a2.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=6ee03559-ed16-421a-9df5-42f36b9d77a2</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Half an hour ago, I completed my talk "Windows Workflow Foundation &amp; ASP.NET 2.0".
As promised, here is the list of links to sites / documents that I used to prepare
this talk &amp; accompanying samples.
</p>
        <ul>
          <li>
            <a href="http://blogs.msdn.com/pandrew/archive/2006/04/28/586181.aspx">Coming improvements
to ASP.NET hosting of Windows Workflow Foundation after WF Beta 2.2</a>
          </li>
          <li>
Cutting Edge, Windows Workflow Foundation <a href="http://msdn.microsoft.com/msdnmag/issues/06/03/CuttingEdge/">Part
1</a>, <a href="http://msdn.microsoft.com/msdnmag/issues/06/04/CuttingEdge/">Part
2</a></li>
          <li>
            <a href="http://blogs.msdn.com/tomlake/archive/2006/05/17/600143.aspx">Examples of
using Persistence and Tracking in ASP.NET</a>
          </li>
          <li>
            <a href="http://www.masteringbiztalk.com/blogs/jon/PermaLink,guid,0fae3e73-7801-4cf6-a5a5-9370b0f99973.aspx">Using
WF to run a page-flow</a>
          </li>
          <li>
Of course, <a href="http://wf.netfx3.com/">http://wf.netfx3.com/</a> (Webcasts
et al)</li>
        </ul>
        <p>
Also, see <a href="http://chrison.net/ASPNETWindowsWorkflowFoundationVNext.aspx">my
last post on ASP.NET PageFlow CTP</a>. This was the last part on "future technologies".
</p>
        <p>
          <strong>Update</strong> A foto from my talk on Monday (debugging a workflow in ASP.NET):
</p>
        <p>
          <img src="http://chrison.net/content/binary/wftalkfoto_courtesyaspkonferenz2006.jpg" border="0" />
        </p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=6ee03559-ed16-421a-9df5-42f36b9d77a2" />
      </body>
      <title>Talk Resources: WF &amp; ASP.NET</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,6ee03559-ed16-421a-9df5-42f36b9d77a2.aspx</guid>
      <link>http://chrison.net/TalkResourcesWFASPNET.aspx</link>
      <pubDate>Mon, 19 Jun 2006 09:39:07 GMT</pubDate>
      <description>&lt;p&gt;
Half an hour ago, I completed my talk "Windows Workflow Foundation &amp;amp; ASP.NET 2.0".
As promised, here is the list of links to sites / documents that I used to prepare
this talk &amp;amp; accompanying samples.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://blogs.msdn.com/pandrew/archive/2006/04/28/586181.aspx"&gt;Coming improvements
to ASP.NET hosting of Windows Workflow Foundation after WF Beta 2.2&lt;/a&gt; 
&lt;li&gt;
Cutting Edge,&amp;nbsp;Windows Workflow Foundation &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/03/CuttingEdge/"&gt;Part
1&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/04/CuttingEdge/"&gt;Part
2&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://blogs.msdn.com/tomlake/archive/2006/05/17/600143.aspx"&gt;Examples of
using Persistence and Tracking in ASP.NET&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.masteringbiztalk.com/blogs/jon/PermaLink,guid,0fae3e73-7801-4cf6-a5a5-9370b0f99973.aspx"&gt;Using
WF to run a page-flow&lt;/a&gt; 
&lt;li&gt;
Of course, &lt;a href="http://wf.netfx3.com/"&gt;http://wf.netfx3.com/&lt;/a&gt;&amp;nbsp;(Webcasts
et al)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Also, see &lt;a href="http://chrison.net/ASPNETWindowsWorkflowFoundationVNext.aspx"&gt;my
last post on ASP.NET PageFlow CTP&lt;/a&gt;. This was the last part on "future technologies".
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update&lt;/strong&gt; A foto from my talk on Monday (debugging a workflow in ASP.NET):
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/wftalkfoto_courtesyaspkonferenz2006.jpg" border=0&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=6ee03559-ed16-421a-9df5-42f36b9d77a2" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,6ee03559-ed16-421a-9df5-42f36b9d77a2.aspx</comments>
      <category>.NET</category>
      <category>ASP.NET</category>
      <category>this</category>
      <category>Training and Conferences</category>
      <category>Tri 0</category>
      <category>Workflow Foundation</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=478b2644-93cc-43ab-86e3-30f29b9c45c5</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,478b2644-93cc-43ab-86e3-30f29b9c45c5.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,478b2644-93cc-43ab-86e3-30f29b9c45c5.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=478b2644-93cc-43ab-86e3-30f29b9c45c5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Yesterday night, I watched a WebCast from TechEd Boston - "An Overview of ASP.NET
and Windows Workflow Foundation". What this innocuous title hid was the fact that
Kashif Alam (PM in the Developer Division) was presenting vNext features for ASP.NET
workflow integration: Page flow (PageFlow) as well as UI flow (UIFlow), plus the accompanying
extensibility model.
</p>
        <p>
What do those two separate approaches provide? Well, you get MVC (model-view-controller) support
for same-page (UIFlow) as well as cross-page (PageFlow) scenarios. Pretty
neat was the included "Choosing the right solution" slide to get an idea what's in
store:
</p>
        <table border="1">
          <tbody>
            <tr>
              <th>
Task</th>
              <th>
&lt;asp:wizard...&gt;</th>
              <th>
PageFlow</th>
              <th>
UIFlow</th>
            </tr>
            <tr>
              <td>
Single page</td>
              <td>
x</td>
              <td>
              </td>
              <td>
x</td>
            </tr>
            <tr>
              <td>
Multiple pages</td>
              <td>
              </td>
              <td>
x</td>
              <td>
              </td>
            </tr>
            <tr>
              <td>
State when close browser</td>
              <td>
              </td>
              <td>
x</td>
              <td>
x</td>
            </tr>
            <tr>
              <td>
Integrate with Enterprise WF</td>
              <td>
              </td>
              <td>
x</td>
              <td>
x</td>
            </tr>
            <tr>
              <td>
Client support</td>
              <td>
              </td>
              <td>
x</td>
              <td>
x</td>
            </tr>
            <tr>
              <td>
Built-in navigation UI</td>
              <td>
x</td>
              <td>
              </td>
              <td>
              </td>
            </tr>
            <tr>
              <td>
Extensibility to other controllers</td>
              <td>
              </td>
              <td>
x</td>
              <td>
x</td>
            </tr>
          </tbody>
        </table>
        <p>
As developers, we will get our hands on this later this year in the form of the "ASP.NET
PageFlow CTP" (at least that's the current name), and it will be deployed with Orcas.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=478b2644-93cc-43ab-86e3-30f29b9c45c5" />
      </body>
      <title>ASP.NET &amp; Windows Workflow Foundation vNext</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,478b2644-93cc-43ab-86e3-30f29b9c45c5.aspx</guid>
      <link>http://chrison.net/ASPNETWindowsWorkflowFoundationVNext.aspx</link>
      <pubDate>Tue, 13 Jun 2006 06:28:38 GMT</pubDate>
      <description>&lt;p&gt;
Yesterday night, I watched a WebCast from TechEd Boston - "An Overview of ASP.NET
and Windows Workflow Foundation". What this innocuous title hid was the fact that
Kashif Alam (PM in the Developer Division) was presenting vNext features for ASP.NET
workflow integration: Page flow (PageFlow) as well as UI flow (UIFlow), plus the accompanying
extensibility model.
&lt;/p&gt;
&lt;p&gt;
What do those two separate approaches provide? Well, you get MVC (model-view-controller)&amp;nbsp;support
for same-page (UIFlow)&amp;nbsp;as well as cross-page (PageFlow)&amp;nbsp;scenarios. Pretty
neat was the included "Choosing the right solution" slide to get an idea what's in
store:
&lt;/p&gt;
&lt;table border=1&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;
Task&lt;/th&gt;
&lt;th&gt;
&amp;lt;asp:wizard...&amp;gt;&lt;/th&gt;
&lt;th&gt;
PageFlow&lt;/th&gt;
&lt;th&gt;
UIFlow&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Single page&lt;/td&gt;
&lt;td&gt;
x&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Multiple pages&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
x&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
State when close browser&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
x&lt;/td&gt;
&lt;td&gt;
x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Integrate with Enterprise WF&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
x&lt;/td&gt;
&lt;td&gt;
x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Client support&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
x&lt;/td&gt;
&lt;td&gt;
x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Built-in navigation UI&lt;/td&gt;
&lt;td&gt;
x&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Extensibility to other controllers&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
x&lt;/td&gt;
&lt;td&gt;
x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
As developers, we will get our hands on this later this year in the form of the "ASP.NET
PageFlow CTP" (at least that's the current name), and it will be deployed with Orcas.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=478b2644-93cc-43ab-86e3-30f29b9c45c5" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,478b2644-93cc-43ab-86e3-30f29b9c45c5.aspx</comments>
      <category>.NET</category>
      <category>ASP.NET</category>
      <category>Tri 0</category>
      <category>Workflow Foundation</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=3011dc32-a787-4670-95eb-c2b012a2e10b</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,3011dc32-a787-4670-95eb-c2b012a2e10b.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,3011dc32-a787-4670-95eb-c2b012a2e10b.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=3011dc32-a787-4670-95eb-c2b012a2e10b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.netfx3.com/">NetFx3</a> is the new community site that focuses
on the four .Net Framework 3.0 technologies Windows Communication Foundation, Windows
Presentation Foundation, Windows Workflow Foundation and Windows CardSpace.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=3011dc32-a787-4670-95eb-c2b012a2e10b" />
      </body>
      <title>Microsoft .NET Framework 3.0 Community (NetFx3)</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,3011dc32-a787-4670-95eb-c2b012a2e10b.aspx</guid>
      <link>http://chrison.net/MicrosoftNETFramework30CommunityNetFx3.aspx</link>
      <pubDate>Mon, 12 Jun 2006 22:03:11 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.netfx3.com/"&gt;NetFx3&lt;/a&gt; is the new community site that focuses
on the four .Net Framework 3.0 technologies Windows Communication Foundation, Windows
Presentation Foundation, Windows Workflow Foundation and Windows CardSpace.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=3011dc32-a787-4670-95eb-c2b012a2e10b" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,3011dc32-a787-4670-95eb-c2b012a2e10b.aspx</comments>
      <category>.NET</category>
      <category>Tri 0</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=430eda5a-077b-4b78-a0ed-8b3a7a60b067</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,430eda5a-077b-4b78-a0ed-8b3a7a60b067.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,430eda5a-077b-4b78-a0ed-8b3a7a60b067.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=430eda5a-077b-4b78-a0ed-8b3a7a60b067</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
When working with a team, it is always a good idea to have dependencies in a separate
folder so everyone can reference them using relative paths:
</p>
        <p>
          <img src="http://chrison.net/content/binary/dependencies.png" border="0" />
        </p>
        <p>
References from this dependencies folder then look as follows in the MyWinApp.csproj
file:
</p>
        <pre>  &lt;ItemGroup&gt;<br />
    &lt;Reference Include="Boo.Lang, Version=1.0.0.0, ..."&gt;<br />
      &lt;SpecificVersion&gt;False&lt;/SpecificVersion&gt;<br />
      &lt;HintPath&gt;..\Dependencies\\Boo.Lang.dll&lt;/HintPath&gt;<br />
    &lt;/Reference&gt;<br />
...<br />
    &lt;Reference Include="System" /&gt;<br />
...<br />
    &lt;Reference Include="System.Xml" /&gt;<br />
  &lt;/ItemGroup&gt;</pre>
        <p>
So every team member that checks out the project will be able to work in their workspace,
as well as the build server will have all the proper references. Great.
</p>
        <p>
But what about the following scenario: depending on Release or Debug, you need different
references - how can you solve this problem? The first step is to go and create a
directory for each configuration below the Dependencies folder:
</p>
        <p>
          <img src="http://chrison.net/content/binary/dependencies_splitbyconfiguration.png" border="0" />
        </p>
        <p>
Next, copy the assemblies to the respective directories. Plus, you have to modify
the .csproj file and add <strong>$(Configuration)</strong> to the external reference's
hint path:
</p>
        <pre>  &lt;ItemGroup&gt;<br />
    &lt;Reference Include="Boo.Lang, Version=1.0.0.0, ..."&gt;<br />
      &lt;SpecificVersion&gt;False&lt;/SpecificVersion&gt;<br />
      &lt;HintPath&gt;..\Dependencies<strong>\$(Configuration)</strong>\\Boo.Lang.dll&lt;/HintPath&gt;<br />
    &lt;/Reference&gt;</pre>
        <p>
That's it - even Visual Studio will honor this change and still provide you with IntelliSense.
</p>
        <p>
Before closing, I want to mention a new tool - even though it doesn't (yet) support
editing the hint path, you should check out Attrice's <a href="http://www.attrice.info/msbuild/index.htm">Microsoft
Build Sidekick</a>. It allows you to graphically edit .*proj files:
</p>
        <p>
          <img src="http://chrison.net/content/binary/buildsidekick.png" border="0" />
        </p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=430eda5a-077b-4b78-a0ed-8b3a7a60b067" />
      </body>
      <title>Configuration-Based Dependencies</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,430eda5a-077b-4b78-a0ed-8b3a7a60b067.aspx</guid>
      <link>http://chrison.net/ConfigurationBasedDependencies.aspx</link>
      <pubDate>Fri, 09 Jun 2006 06:07:18 GMT</pubDate>
      <description>&lt;p&gt;
When working with a team, it is always a good idea to have dependencies in a separate
folder so everyone can reference them using relative paths:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/dependencies.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
References from this dependencies folder then&amp;nbsp;look as follows in the MyWinApp.csproj
file:
&lt;/p&gt;
&lt;pre&gt;&amp;nbsp; &amp;lt;ItemGroup&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Reference Include="Boo.Lang, Version=1.0.0.0, ..."&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;SpecificVersion&amp;gt;False&amp;lt;/SpecificVersion&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;HintPath&amp;gt;..\Dependencies\\Boo.Lang.dll&amp;lt;/HintPath&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Reference&amp;gt;&lt;br&gt;
...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Reference Include="System" /&amp;gt;&lt;br&gt;
...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Reference Include="System.Xml" /&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;/ItemGroup&amp;gt;&lt;/pre&gt;
&lt;p&gt;
So every team member that checks out the project will be able to work in their workspace,
as well as the build server will have all the proper references. Great.
&lt;/p&gt;
&lt;p&gt;
But what about the following scenario: depending on Release or Debug, you need different
references - how can you solve this problem? The first step is to go and create a
directory for each configuration below the Dependencies folder:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/dependencies_splitbyconfiguration.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Next, copy the assemblies to the respective directories. Plus, you have to modify
the .csproj file and add &lt;strong&gt;$(Configuration)&lt;/strong&gt; to the external reference's
hint path:
&lt;/p&gt;
&lt;pre&gt;&amp;nbsp; &amp;lt;ItemGroup&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Reference Include="Boo.Lang, Version=1.0.0.0, ..."&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;SpecificVersion&amp;gt;False&amp;lt;/SpecificVersion&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;HintPath&amp;gt;..\Dependencies&lt;strong&gt;\$(Configuration)&lt;/strong&gt;\\Boo.Lang.dll&amp;lt;/HintPath&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Reference&amp;gt;&lt;/pre&gt;
&lt;p&gt;
That's it - even Visual Studio will honor this change and still provide you with IntelliSense.
&lt;/p&gt;
&lt;p&gt;
Before closing, I want to mention a new tool - even though it doesn't (yet) support
editing the hint path, you should check out Attrice's &lt;a href="http://www.attrice.info/msbuild/index.htm"&gt;Microsoft
Build Sidekick&lt;/a&gt;. It allows you to graphically edit .*proj files:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/buildsidekick.png" border=0&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=430eda5a-077b-4b78-a0ed-8b3a7a60b067" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,430eda5a-077b-4b78-a0ed-8b3a7a60b067.aspx</comments>
      <category>.NET</category>
      <category>Cool Download</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=cd0e4362-88f8-4e89-b5ff-edc25bb06fbf</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,cd0e4362-88f8-4e89-b5ff-edc25bb06fbf.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,cd0e4362-88f8-4e89-b5ff-edc25bb06fbf.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=cd0e4362-88f8-4e89-b5ff-edc25bb06fbf</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Disclaimer: I am the Senior Project Wrangler for <a href="http://www.icsharpcode.net/OpenSource/SD/Default.aspx">#develop</a>.
Therefore I am biased as well as knowledgeable.
</p>
        <p>
Today, we shipped RC2 of SharpDevelop2. For those of you who haven't heard of it before,
it is an Integrated Development Environment (IDE) for .NET. I will get to the features
in just a second. First, I want to thank all developers that spent time on making
v2 a reality. <a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.DanielGrunwald">Daniel</a>,
the lead developer on v2, actually implemented a nice little tool for showing the
project statistics, you can read more and download the utility in his blog <a href="http://laputa.sharpdevelop.net/AnalyzingTheCodeInSharpDevelop.aspx">Analyzing
the code in SharpDevelop</a>. Wow, we started quite a long ago on this baby.
</p>
        <p>
I promised to get back to the feature set. Let's tackle it with more than a grain
of blog posts and feature videos:
</p>
        <p>
          <strong>Supported Programming Languages</strong>
        </p>
        <p>
My definition of support is as follows: full code completion (aka IntelliSense) and
a working Windows forms designer. Therefore, three languages qualify: C#, VB.NET and <a href="http://boo.codehaus.org/">Boo</a>.
Aside from those fully supported languages, you get syntax highlighting for many more.
</p>
        <p>
Speaking of syntax highlighting and code completion: both features are supported for
XML files. You can check it out in the <a href="http://laputa.sharpdevelop.net/DemoXMLEditingFeaturesOfDevelop11.aspx">xml
editing experience feature video</a> (yes, this is available since v1.1!) You get
this <a href="http://laputa.sharpdevelop.net/VideoCodeCompletionForMSBuild.aspx">for
MSBuild files</a> too!
</p>
        <p>
          <strong>Features You Would Expect</strong>
        </p>
        <p>
Let's start with the integrated debugger. This has been our achilles heel since the
very beginning, as implementing a debugger isn't exactly a piece of cake. However,
thanks to <a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.DavidSrbecky">David</a>,
v2 sports a debugger and you can <a href="http://laputa.sharpdevelop.net/VideoIntegratedDebugger.aspx">watch
a demo</a>.
</p>
        <p>
Let's continue with a simple list: Search &amp; Replace, code folding, code templates
(just try Ctrl+J in the editor), a toolbox and more.
</p>
        <p>
          <strong>Cool Features</strong>
        </p>
        <p>
Ahhh. At last. Let's see what we got: 
</p>
        <ul>
          <li>
Unit testing (since 1.1, NUnit-based) 
</li>
          <li>
Code Coverage (2.0, based on NCover - <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/01/31/CodeCoverageWithNCover.aspx">read
more in Matt's blog post</a>) 
</li>
          <li>
Documentation generation (since 1.1, based on NDoc) 
</li>
          <li>
Quick XML Doc (since 1.1, just try Ctrl+Q to get a preview of the HTML help that will
be generated for your XML comments) 
</li>
          <li>
Auto code generation (since 1.1, just try Alt+Ins) 
</li>
          <li>
Code converter - convert your projects from C# to VB.NET and vice versa (since 1.1).
New in 2.0: three way with Boo. 
</li>
          <li>
Reports. Yes, SharpDevelop ships with a free-to-use report engine, #report. It was
added late in 1.x, now improved for 2.0. <a href="http://laputa.sharpdevelop.net/DemoReport.aspx">Watch
the demo</a></li>
          <li>
            <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2005/10/15/TargetingDifferentFrameworksWithSharpDevelop.aspx">Support
for multiple frameworks</a> - although 2.0 is the default, SharpDevelop can target
1.1 as well as Mono. Even <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2005/10/20/CreatingAGtkSharpAppWithSharpDevelop.aspx">Gtk#
is supported</a>. 
</li>
          <li>
Ctrl+Mousewheel zooming. You will like it. I do.</li>
        </ul>
        <p>
          <strong>What's Not There</strong>
        </p>
        <p>
We ain't a big software company, so we have to tackle features in order. Therefore,
you won't find <a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.ASPNetSupport">ASP.NET
support in SharpDevelop</a>, as well as others: CF support (planned for 2.1), version
control (planned for 2.1), ClickOnce (planned for 2.1)... 
</p>
        <p>
Even if you don't plan on using SharpDevelop for your daily work, give it a try and
let us know what you like and what not on <a href="http://community.sharpdevelop.net/forums/">our
forums</a>. You might even learn about a cool new feature like <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/05/21/ComponentInspector.aspx">Component
Inspector</a> that is coming with 2.1, code-named Serralongue. And we'd be more than
happy to <a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.HowCanIHelp">welcome
additional developers, testers, writers and translators</a>.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=cd0e4362-88f8-4e89-b5ff-edc25bb06fbf" />
      </body>
      <title>SharpDevelop2 Release Candidate 2 Available</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,cd0e4362-88f8-4e89-b5ff-edc25bb06fbf.aspx</guid>
      <link>http://chrison.net/SharpDevelop2ReleaseCandidate2Available.aspx</link>
      <pubDate>Mon, 05 Jun 2006 21:29:57 GMT</pubDate>
      <description>&lt;p&gt;
Disclaimer: I am the Senior Project Wrangler for &lt;a href="http://www.icsharpcode.net/OpenSource/SD/Default.aspx"&gt;#develop&lt;/a&gt;.
Therefore I am biased as well as knowledgeable.
&lt;/p&gt;
&lt;p&gt;
Today, we shipped RC2 of SharpDevelop2. For those of you who haven't heard of it before,
it is an Integrated Development Environment (IDE) for .NET. I will get to the features
in just a second. First, I want to thank all developers that spent time on making
v2 a reality. &lt;a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.DanielGrunwald"&gt;Daniel&lt;/a&gt;,
the lead developer on v2, actually implemented a nice little tool for showing the
project statistics, you can read more and download the utility in his blog&amp;nbsp;&lt;a href="http://laputa.sharpdevelop.net/AnalyzingTheCodeInSharpDevelop.aspx"&gt;Analyzing
the code in SharpDevelop&lt;/a&gt;. Wow, we started quite a long ago on this baby.
&lt;/p&gt;
&lt;p&gt;
I promised to get back to the feature set. Let's tackle it with more than a grain
of blog posts and feature videos:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Supported Programming Languages&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
My definition of support is as follows: full code completion (aka IntelliSense) and
a working Windows forms designer. Therefore, three languages qualify: C#, VB.NET and &lt;a href="http://boo.codehaus.org/"&gt;Boo&lt;/a&gt;.
Aside from those fully supported languages, you get syntax highlighting for many more.
&lt;/p&gt;
&lt;p&gt;
Speaking of syntax highlighting and code completion: both features are supported for
XML files. You can check it out in the &lt;a href="http://laputa.sharpdevelop.net/DemoXMLEditingFeaturesOfDevelop11.aspx"&gt;xml
editing experience feature video&lt;/a&gt; (yes, this is available since v1.1!) You get
this &lt;a href="http://laputa.sharpdevelop.net/VideoCodeCompletionForMSBuild.aspx"&gt;for
MSBuild files&lt;/a&gt; too!
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Features You Would Expect&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Let's start with the integrated debugger. This has been our achilles heel since the
very beginning, as implementing a debugger isn't exactly a piece of cake. However,
thanks to &lt;a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.DavidSrbecky"&gt;David&lt;/a&gt;,
v2 sports a debugger and you can &lt;a href="http://laputa.sharpdevelop.net/VideoIntegratedDebugger.aspx"&gt;watch
a demo&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Let's continue with a simple list: Search &amp;amp; Replace, code folding, code templates
(just try Ctrl+J in the editor), a toolbox and more.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Cool Features&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Ahhh. At last. Let's see what we got: 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Unit testing (since 1.1, NUnit-based) 
&lt;li&gt;
Code Coverage (2.0, based on NCover - &lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/01/31/CodeCoverageWithNCover.aspx"&gt;read
more in Matt's blog post&lt;/a&gt;) 
&lt;li&gt;
Documentation generation (since 1.1, based on NDoc) 
&lt;li&gt;
Quick XML Doc (since 1.1, just try Ctrl+Q to get a preview of the HTML help that will
be generated for your XML comments) 
&lt;li&gt;
Auto code generation (since 1.1, just try Alt+Ins) 
&lt;li&gt;
Code converter - convert your projects from C# to VB.NET and vice versa (since 1.1).
New in 2.0: three way with Boo. 
&lt;li&gt;
Reports. Yes, SharpDevelop ships with a free-to-use report engine, #report. It was
added late in 1.x, now improved for 2.0. &lt;a href="http://laputa.sharpdevelop.net/DemoReport.aspx"&gt;Watch
the demo&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2005/10/15/TargetingDifferentFrameworksWithSharpDevelop.aspx"&gt;Support
for multiple frameworks&lt;/a&gt; - although 2.0 is the default, SharpDevelop can target
1.1 as well as Mono. Even &lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2005/10/20/CreatingAGtkSharpAppWithSharpDevelop.aspx"&gt;Gtk#
is supported&lt;/a&gt;. 
&lt;li&gt;
Ctrl+Mousewheel zooming. You will like it. I do.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;What's Not There&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
We ain't a big software company, so we have to tackle features in order. Therefore,
you won't find &lt;a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.ASPNetSupport"&gt;ASP.NET
support in SharpDevelop&lt;/a&gt;, as well as others: CF support (planned for 2.1), version
control (planned for 2.1), ClickOnce (planned for 2.1)... 
&lt;/p&gt;
&lt;p&gt;
Even if you don't plan on using SharpDevelop for your daily work, give it a try and
let us know what you like and what not on &lt;a href="http://community.sharpdevelop.net/forums/"&gt;our
forums&lt;/a&gt;. You might even learn about a cool new feature like &lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/05/21/ComponentInspector.aspx"&gt;Component
Inspector&lt;/a&gt; that is coming with 2.1, code-named Serralongue. And we'd be more than
happy to &lt;a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.HowCanIHelp"&gt;welcome
additional developers, testers, writers and translators&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=cd0e4362-88f8-4e89-b5ff-edc25bb06fbf" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,cd0e4362-88f8-4e89-b5ff-edc25bb06fbf.aspx</comments>
      <category>.NET</category>
      <category>Cool Download</category>
      <category>this</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=f82a3e5e-6bbc-497b-9264-b50fc6266da9</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,f82a3e5e-6bbc-497b-9264-b50fc6266da9.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,f82a3e5e-6bbc-497b-9264-b50fc6266da9.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=f82a3e5e-6bbc-497b-9264-b50fc6266da9</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Six labs, both available in C# and VB.NET. <a href="http://www.microsoft.com/downloads/details.aspx?familyid=c8ca14d0-05ea-4a44-ae78-f5e4df6208af&amp;displaylang=en">Download</a> (nuff
said)
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=f82a3e5e-6bbc-497b-9264-b50fc6266da9" />
      </body>
      <title>Enterprise Library 2.0 Hands On Labs</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,f82a3e5e-6bbc-497b-9264-b50fc6266da9.aspx</guid>
      <link>http://chrison.net/EnterpriseLibrary20HandsOnLabs.aspx</link>
      <pubDate>Thu, 04 May 2006 08:20:36 GMT</pubDate>
      <description>&lt;p&gt;
Six labs, both available in C# and VB.NET. &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=c8ca14d0-05ea-4a44-ae78-f5e4df6208af&amp;amp;displaylang=en"&gt;Download&lt;/a&gt; (nuff
said)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=f82a3e5e-6bbc-497b-9264-b50fc6266da9" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,f82a3e5e-6bbc-497b-9264-b50fc6266da9.aspx</comments>
      <category>.NET</category>
      <category>2 Ohhhh</category>
      <category>Cool Download</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=99c87d1a-7307-40bb-a06b-de6f52f420c7</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,99c87d1a-7307-40bb-a06b-de6f52f420c7.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,99c87d1a-7307-40bb-a06b-de6f52f420c7.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=99c87d1a-7307-40bb-a06b-de6f52f420c7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Found this on <a href="http://blogs.dotnetgerman.com/alexonasp.net/">Alex'</a> blog
(he <a href="http://blogs.dotnetgerman.com/alexonasp.net/PermaLink,guid,f557153a-6b9b-4391-b3ec-069adbb5a345.aspx">posted
it in German</a> last week): Microsoft UK has released a document (PDF) titled
"<a href="http://download.microsoft.com/documents/uk/msdn/devdave/mic472_dev_highway_all.pdf">The
Developer Highway Code</a>" (The drive for safer coding), which covers the following
topics:
</p>
        <ul>
          <li>
Integrating Security into the Lifecycle 
</li>
          <li>
Security Objectives 
</li>
          <li>
Web Application Security Design Guidelines  
</li>
          <li>
Threat Modelling 
</li>
          <li>
Security Architecture and Design 
</li>
          <li>
Security Code Review 
</li>
          <li>
Security Deployment Review 
</li>
        </ul>
        <p>
The document covers v1 and v2 of the .NET Framework, and it does contain useful checklists.
Be sure to grab it!
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=99c87d1a-7307-40bb-a06b-de6f52f420c7" />
      </body>
      <title>The Developer Highway Code</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,99c87d1a-7307-40bb-a06b-de6f52f420c7.aspx</guid>
      <link>http://chrison.net/TheDeveloperHighwayCode.aspx</link>
      <pubDate>Tue, 02 May 2006 13:17:31 GMT</pubDate>
      <description>&lt;p&gt;
Found this on &lt;a href="http://blogs.dotnetgerman.com/alexonasp.net/"&gt;Alex'&lt;/a&gt; blog
(he &lt;a href="http://blogs.dotnetgerman.com/alexonasp.net/PermaLink,guid,f557153a-6b9b-4391-b3ec-069adbb5a345.aspx"&gt;posted
it in German&lt;/a&gt;&amp;nbsp;last week): Microsoft UK has released a document (PDF) titled
"&lt;a href="http://download.microsoft.com/documents/uk/msdn/devdave/mic472_dev_highway_all.pdf"&gt;The
Developer Highway Code&lt;/a&gt;" (The drive for safer coding), which covers the following
topics:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Integrating Security into the Lifecycle 
&lt;li&gt;
Security Objectives 
&lt;li&gt;
Web Application Security Design Guidelines&amp;nbsp; 
&lt;li&gt;
Threat Modelling 
&lt;li&gt;
Security Architecture and Design 
&lt;li&gt;
Security Code Review 
&lt;li&gt;
Security Deployment Review 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The document covers v1 and v2 of the .NET Framework, and it does contain useful checklists.
Be sure to grab it!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=99c87d1a-7307-40bb-a06b-de6f52f420c7" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,99c87d1a-7307-40bb-a06b-de6f52f420c7.aspx</comments>
      <category>.NET</category>
      <category>Security</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=a8a55662-6414-47fb-9e9c-41866cfab1db</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,a8a55662-6414-47fb-9e9c-41866cfab1db.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,a8a55662-6414-47fb-9e9c-41866cfab1db.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=a8a55662-6414-47fb-9e9c-41866cfab1db</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
If you ever consider using NGen with your .NET applications, then you simply MUST
read the article <a href="http://msdn.microsoft.com/msdnmag/issues/06/05/CLRInsideOut/default.aspx">The
Performance Benefits of NGen</a> in the current issue of MSDN Magazine. It can't get
any more authoritative than that (the author Surupa Biswas works on the runtime's
back-end compiler and focuses primarily on pre-compilation technologies).
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=a8a55662-6414-47fb-9e9c-41866cfab1db" />
      </body>
      <title>THE Authoritative Article on NGen</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,a8a55662-6414-47fb-9e9c-41866cfab1db.aspx</guid>
      <link>http://chrison.net/THEAuthoritativeArticleOnNGen.aspx</link>
      <pubDate>Thu, 13 Apr 2006 14:17:29 GMT</pubDate>
      <description>&lt;p&gt;
If you ever consider using NGen with your .NET applications, then you simply MUST
read the article &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/05/CLRInsideOut/default.aspx"&gt;The
Performance Benefits of NGen&lt;/a&gt; in the current issue of MSDN Magazine. It can't get
any more authoritative than that (the author Surupa Biswas works on the runtime's
back-end compiler and focuses primarily on pre-compilation technologies).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=a8a55662-6414-47fb-9e9c-41866cfab1db" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,a8a55662-6414-47fb-9e9c-41866cfab1db.aspx</comments>
      <category>.NET</category>
      <category>2 Ohhhh</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=edf362a3-ff2c-4d36-9b06-29c4bab6b4d1</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,edf362a3-ff2c-4d36-9b06-29c4bab6b4d1.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,edf362a3-ff2c-4d36-9b06-29c4bab6b4d1.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=edf362a3-ff2c-4d36-9b06-29c4bab6b4d1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
On my flight to Seattle today (or yesterday, depending on the time zone) I started
to read <a href="http://www.wrox.com/WileyCDA/WroxTitle/productCd-0764596985.html">Professional
ASP.NET 2.0 Security, Membership, and Role Management</a> by Stefan Schackow. The
book definitely is a must-have for every ASP.NET developer, even if you decide to
read one chapter only: A Matter of Trust (#3). This one will save you loads of time
when you have to deploy an application into non-full trust environments. However,
the other chapters are worthwhile too, like #2 which details exactly which identity
is used when by what part of the engine. Bottomline: highly recommended reading.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=edf362a3-ff2c-4d36-9b06-29c4bab6b4d1" />
      </body>
      <title>Professional ASP.NET 2.0 Security, Membership, and Role Management</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,edf362a3-ff2c-4d36-9b06-29c4bab6b4d1.aspx</guid>
      <link>http://chrison.net/ProfessionalASPNET20SecurityMembershipAndRoleManagement.aspx</link>
      <pubDate>Sun, 19 Feb 2006 08:21:00 GMT</pubDate>
      <description>&lt;p&gt;
On my flight to Seattle today (or yesterday, depending on the time zone) I started
to read &lt;a href="http://www.wrox.com/WileyCDA/WroxTitle/productCd-0764596985.html"&gt;Professional
ASP.NET 2.0 Security, Membership, and Role Management&lt;/a&gt; by Stefan Schackow. The
book definitely is a must-have for every ASP.NET developer, even if you decide to
read one chapter only: A Matter of Trust (#3). This one will save you loads of time
when you have to deploy an application into non-full trust environments. However,
the other chapters are worthwhile too, like #2 which details exactly which identity
is used when by what part of the engine. Bottomline: highly recommended reading.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=edf362a3-ff2c-4d36-9b06-29c4bab6b4d1" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,edf362a3-ff2c-4d36-9b06-29c4bab6b4d1.aspx</comments>
      <category>.NET</category>
      <category>2 Ohhhh</category>
      <category>ASP.NET</category>
      <category>Books</category>
      <category>Security</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=1cd515c2-eab9-4ad8-af5a-67aebe831047</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,1cd515c2-eab9-4ad8-af5a-67aebe831047.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,1cd515c2-eab9-4ad8-af5a-67aebe831047.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=1cd515c2-eab9-4ad8-af5a-67aebe831047</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
          <a href="http://www.sie-sind-da.de/">
            <img src="http://chrison.net/content/binary/RTL-Logo.jpg" border="0" />
          </a>
        </p>
        <p>
Will be there Wednesday &amp; Thursday as ATE (Ask the Experts), so drop by in the
experts zone and say hello!
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=1cd515c2-eab9-4ad8-af5a-67aebe831047" />
      </body>
      <title>Ready to Rock the Launch</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,1cd515c2-eab9-4ad8-af5a-67aebe831047.aspx</guid>
      <link>http://chrison.net/ReadyToRockTheLaunch.aspx</link>
      <pubDate>Mon, 06 Feb 2006 13:56:39 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.sie-sind-da.de/"&gt;&lt;img src="http://chrison.net/content/binary/RTL-Logo.jpg" border=0&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Will be there Wednesday &amp;amp; Thursday as ATE (Ask the Experts), so drop by in the
experts zone and say hello!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=1cd515c2-eab9-4ad8-af5a-67aebe831047" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,1cd515c2-eab9-4ad8-af5a-67aebe831047.aspx</comments>
      <category>.NET</category>
      <category>2 Ohhhh</category>
      <category>SQL Server</category>
      <category>this</category>
      <category>Training and Conferences</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=b6f33c00-3cc2-41e3-a761-45ce46a93d3a</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,b6f33c00-3cc2-41e3-a761-45ce46a93d3a.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,b6f33c00-3cc2-41e3-a761-45ce46a93d3a.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=b6f33c00-3cc2-41e3-a761-45ce46a93d3a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Yesterday, I picked up on an old code piece of mine - sending images to the client
via an HttpHandler. Why in the world would you implement that with a handler when
there is http.sys kernel mode caching? Well, I had a few unique constraints:
</p>
        <ul>
          <li>
the images had to live outside the Web root and any of its vroots 
</li>
          <li>
the image names had to be concealed because the naming would give away information,
and renaming the images prior to publishing on the Web was out of the question</li>
        </ul>
        <p>
Now, a common approach to sending images from a certain directory (leaving requirement
#2 by the wayside for the moment) would be this:
</p>
        <pre>image.aspx?image=iamthebest.jpg</pre>
        <p>
So what is wrong with this approach? First and foremost using an ASP.NET page. The
page lifecycle is a drain on performance and throughput, because you simply don't
need it. That sorts out why I chose to go with an HTTP handler.
</p>
        <p>
Secondly, somebody could DOS your server. You heard me right. For the background,
check the article <a href="http://www.aspheute.com/english/20020131.asp">Trap Alert:
Files that aren't</a>. A .NET version (managed C++) of this checker can be found
in <a href="http://www.aspheute.com/Code/20020201.zip">this download</a> (the
article <a href="http://www.aspheute.com/artikel/20020201.htm">Dateityp-Ermittlung
in Managed C++</a> is only available in German). 
</p>
        <p>
How do you get around this issue? Well, how about reading the directory up front,
and instead of having the filename in the URL, send the hash! When the image is requested,
take the hash and look up the corresponding file, presto. In addition you get one
security feature for free: no directory traversals can be hidden in your code.
</p>
        <p>
When I uncovered the code yesterday, I decided to rewrite it for more general use.
So what do you get? 
</p>
        <ul>
          <li>
The ImageCacheControls project: it contains the ImageCache class, which does most
of the heavy lifting. In addition, you get an ImageCacheControl server control, as
well as the implementation of the HTTP handler. (Don't forget to check out the Readme.txt
for the latest on feature set and known issues) 
</li>
          <li>
The Web project: a rather simple Web site with demo files in it. The file I want to
direct your attention to is Image.ashx. This is the one file - aside from the control
project binaries - that needs to be copied to your projects to get started with ImageCache.
Note that I made it easy to work with C# (default) or VB.NET.</li>
        </ul>
        <p>
Usage of ImageCache is demonstrated in default.aspx.cs plus the source code of default.aspx
(design time of the control does not work, known issue). 
</p>
        <p>
The code behind looks like this (<em>CreateMapping</em> loads the directory contents,
initializes the hash to file name map, stores it into the cache):
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> ChrisOnNET.ImageCache;<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span> partial <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> _Default
: System.Web.UI.Page 
<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
protected</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> Page_Load(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">object</span> sender,
EventArgs e)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   </span>{<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   </span></span>//
normally, this would be done in global.asax</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   </span></span>ImageCache.CreateMapping(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"demo"</span>,
Server.MapPath(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"~/TestImages/"</span>));<br /><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   </span></span>//
the DIY approach to rendering the image tag</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   </span></span>string</span> testHash <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> ImageCache.GetHashForFile(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"026.jpg"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"demo"</span>);<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   </span></span>Response.Write(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;image
src=\"Image.ashx?bucket="</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span><br /><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   </span></span></span>"demo"</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span><br /><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   </span></span></span>"&amp;image="</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   </span></span></span>Server.UrlEncode(testHash) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span><br /><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   </span></span></span>"\"
/&gt;"</span>);<br /><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   </span></span>//
the elegant approach to rendering the image tag</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   </span></span>Response.Write(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;image
src=\""</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> ImageCache.GenerateUrl(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"036.jpg"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"demo"</span>) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span><br /><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   </span></span>"\"
/&gt;"</span>);<br /><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   </span></span>//
see HTML source for server control approach (Design time not working, known issue)</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   </span>}<br />
}</span>
        </p>
        <p>
Rendering Image tags in Page_Load isn't nice, but after all it is only intended to
show the functionality. Most likely you are going to use the declarative <em>ImageCacheControl</em> anyways:
</p>
        <pre>&lt;%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %&gt;<br />
&lt;%@ Register Assembly="ImageCacheControls" Namespace="ChrisOnNET.ImageCache" TagPrefix="cc1"
%&gt;</pre>
        <pre>&lt;html xmlns="<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>"
&gt;<br />
&lt;head runat="server"&gt;<br />
    &lt;title&gt;Untitled Page&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
    &lt;form id="form1" runat="server"&gt;<br />
    &lt;div&gt;<br />
        &lt;br /&gt;Using the ImageCacheControl:&amp;nbsp;<br />
        &lt;cc1:ImageCacheControl ID="ImageCacheControl1" 
<br />
            Bucket="demo"<br />
            FileName="026.jpg"<br />
            runat="server"
/&gt;<br />
    &lt;/div&gt;<br />
    &lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</pre>
        <p>
That's basically it. Let me know what you think.
</p>
        <p>
          <a href="http://chrison.net/content/binary/ImageCacheTakeOne.zip">ImageCacheTakeOne.zip
(59.55 KB)</a>
        </p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=b6f33c00-3cc2-41e3-a761-45ce46a93d3a" />
      </body>
      <title>ImageCache, Take One</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,b6f33c00-3cc2-41e3-a761-45ce46a93d3a.aspx</guid>
      <link>http://chrison.net/ImageCacheTakeOne.aspx</link>
      <pubDate>Wed, 18 Jan 2006 10:21:05 GMT</pubDate>
      <description>&lt;p&gt;
Yesterday, I picked up on an old code piece of mine - sending images to the client
via an HttpHandler. Why in the world would you implement that with a handler when
there is http.sys kernel mode caching? Well, I had a few unique constraints:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
the images had to live outside the Web root and any of its vroots 
&lt;li&gt;
the image names had to be concealed because the naming would give away information,
and renaming the images prior to publishing on the Web was out of the question&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Now, a common approach to sending images from a certain directory (leaving requirement
#2 by the wayside for the moment) would be this:
&lt;/p&gt;
&lt;pre&gt;image.aspx?image=iamthebest.jpg&lt;/pre&gt;
&lt;p&gt;
So what is wrong with this approach? First and foremost using an ASP.NET page. The
page lifecycle is a drain on performance and throughput, because you simply don't
need it. That sorts out why I chose to go with an HTTP handler.
&lt;/p&gt;
&lt;p&gt;
Secondly, somebody could DOS your server. You heard me right. For the background,
check the article &lt;a href="http://www.aspheute.com/english/20020131.asp"&gt;Trap Alert:
Files that aren't&lt;/a&gt;. A .NET version (managed C++)&amp;nbsp;of this checker can be found
in &lt;a href="http://www.aspheute.com/Code/20020201.zip"&gt;this download&lt;/a&gt;&amp;nbsp;(the
article &lt;a href="http://www.aspheute.com/artikel/20020201.htm"&gt;Dateityp-Ermittlung
in Managed C++&lt;/a&gt; is only available in German). 
&lt;/p&gt;
&lt;p&gt;
How do you get around this issue? Well, how about reading the directory up front,
and instead of having the filename in the URL, send the hash! When the image is requested,
take the hash and look up the corresponding file, presto. In addition you get one
security feature for free: no directory traversals can be hidden in your code.
&lt;/p&gt;
&lt;p&gt;
When I uncovered the code yesterday, I decided to rewrite it for more general use.
So what do you get? 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
The ImageCacheControls project: it contains the ImageCache class, which does most
of the heavy lifting. In addition, you get an ImageCacheControl server control, as
well as the implementation of the HTTP handler. (Don't forget to check out the Readme.txt
for the latest on feature set and known issues) 
&lt;li&gt;
The Web project: a rather simple Web site with demo files in it. The file I want to
direct your attention to is Image.ashx. This is the one file - aside from the control
project binaries - that needs to be copied to your projects to get started with ImageCache.
Note that I made it easy to work with C# (default) or VB.NET.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Usage of ImageCache is demonstrated in default.aspx.cs plus the source code of default.aspx
(design time of the control does not work, known issue). 
&lt;/p&gt;
&lt;p&gt;
The code behind looks like this (&lt;em&gt;CreateMapping&lt;/em&gt; loads the directory contents,
initializes the hash to file name map, stores it into the cache):
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; ChrisOnNET.ImageCache;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; partial &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; _Default
: System.Web.UI.Page 
&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
protected&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; Page_Load(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;object&lt;/span&gt; sender,
EventArgs e)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;//
normally, this would be done in global.asax&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;ImageCache.CreateMapping(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"demo"&lt;/span&gt;,
Server.MapPath(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"~/TestImages/"&lt;/span&gt;));&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;//
the DIY approach to rendering the image tag&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;string&lt;/span&gt; testHash &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; ImageCache.GetHashForFile(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"026.jpg"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"demo"&lt;/span&gt;);&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Response.Write(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;image
src=\"Image.ashx?bucket="&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;"demo"&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;"&amp;amp;image="&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Server.UrlEncode(testHash) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;"\"
/&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;//
the elegant approach to rendering the image tag&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Response.Write(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;image
src=\""&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; ImageCache.GenerateUrl(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"036.jpg"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"demo"&lt;/span&gt;) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;"\"
/&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;//
see HTML source for server control approach (Design time not working, known issue)&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Rendering Image tags in Page_Load isn't nice, but after all it is only intended to
show the functionality. Most likely you are going to use the declarative &lt;em&gt;ImageCacheControl&lt;/em&gt; anyways:
&lt;/p&gt;
&lt;pre&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true"&amp;nbsp; CodeFile="Default.aspx.cs" Inherits="_Default" %&amp;gt;&lt;br&gt;
&amp;lt;%@ Register Assembly="ImageCacheControls" Namespace="ChrisOnNET.ImageCache" TagPrefix="cc1"
%&amp;gt;&lt;/pre&gt;&lt;pre&gt;&amp;lt;html xmlns="&lt;a href="http://www.w3.org/1999/xhtml"&gt;http://www.w3.org/1999/xhtml&lt;/a&gt;"
&amp;gt;&lt;br&gt;
&amp;lt;head runat="server"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Untitled Page&amp;lt;/title&amp;gt;&lt;br&gt;
&amp;lt;/head&amp;gt;&lt;br&gt;
&amp;lt;body&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;form id="form1" runat="server"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br /&amp;gt;Using the ImageCacheControl:&amp;amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;cc1:ImageCacheControl ID="ImageCacheControl1" 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bucket="demo"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileName="026.jpg"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; runat="server"
/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/form&amp;gt;&lt;br&gt;
&amp;lt;/body&amp;gt;&lt;br&gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;
&lt;p&gt;
That's basically it. Let me know what you think.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/ImageCacheTakeOne.zip"&gt;ImageCacheTakeOne.zip
(59.55 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=b6f33c00-3cc2-41e3-a761-45ce46a93d3a" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,b6f33c00-3cc2-41e3-a761-45ce46a93d3a.aspx</comments>
      <category>.NET</category>
      <category>2 Ohhhh</category>
      <category>ASP.NET</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=113ce3d3-3f7f-492e-b4ce-c00be3272d78</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,113ce3d3-3f7f-492e-b4ce-c00be3272d78.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,113ce3d3-3f7f-492e-b4ce-c00be3272d78.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=113ce3d3-3f7f-492e-b4ce-c00be3272d78</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.microsoft.com/downloads/details.aspx?familyid=e27aa8dc-a029-4836-ac59-6b4805df42fa&amp;displaylang=en">New
runtime components</a> are available which are compatible with the release versions
of .NET Framework 2.0, Visual Studio 2005, as well as Office "12" Beta 1 (which I
don't have anyways).
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=113ce3d3-3f7f-492e-b4ce-c00be3272d78" />
      </body>
      <title>Windows Workflow Foundation Beta 1.2</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,113ce3d3-3f7f-492e-b4ce-c00be3272d78.aspx</guid>
      <link>http://chrison.net/WindowsWorkflowFoundationBeta12.aspx</link>
      <pubDate>Sat, 14 Jan 2006 09:31:23 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=e27aa8dc-a029-4836-ac59-6b4805df42fa&amp;amp;displaylang=en"&gt;New
runtime components&lt;/a&gt; are available which are compatible with the release versions
of .NET Framework 2.0, Visual Studio 2005, as well as Office "12" Beta 1 (which I
don't have anyways).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=113ce3d3-3f7f-492e-b4ce-c00be3272d78" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,113ce3d3-3f7f-492e-b4ce-c00be3272d78.aspx</comments>
      <category>.NET</category>
      <category>2 Ohhhh</category>
      <category>Cool Download</category>
      <category>Visual Studio</category>
    </item>
  </channel>
</rss>