<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8304622315377858621</id><updated>2012-01-28T11:20:45.961+13:00</updated><category term='C#'/><category term='motivation open source oss'/><category term='WCF'/><category term='pivot scratch games'/><category term='Sql 2005'/><category term='VSMDI'/><category term='DSL'/><category term='testmetadata'/><category term='Aderant'/><category term='NHibernate'/><category term='Rant'/><category term='General Development'/><category term='WPF'/><category term='phone'/><category term='MS Test'/><category term='Sql'/><title type='text'>IAmUnknown</title><subtitle type='html'>Stuff I think is worth sharing.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>51</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-1372613614490231288</id><published>2011-10-13T02:47:00.001+13:00</published><updated>2011-10-13T02:54:29.985+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='phone'/><title type='text'>Goodbye windows phone 7</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;After having played with a WP7 device for about 8 months, I now have to say it's not for me. There are two reasons.&lt;br /&gt;&lt;br /&gt;Firstly my current phone was lent to me, and now has to be returned. But this is not the show stopper. I'd buy a new one tomorrow if it wasn't for the second reason. The main reason I'm giving up on the Windows Phone 7 is that I cannot find a way (that works for me) to back up my telephony data. My text (SMS) messages and calling data are important to me and in order to continue using these devices I need to have a way to record and back up this information.&lt;br /&gt;&lt;br /&gt;Because Microsoft has made it incredibly difficult to back up this data via their API's I cannot buy or&amp;nbsp;even&amp;nbsp;write an app that will let me back up this data easily or in fact at all. So finally I gave up trying.&lt;br /&gt;&lt;br /&gt;It's a sad day because for all of it's flaws, the Windows Phone 7 is one of the most ergonomic phones I've ever used. It was mostly&amp;nbsp;intuitive&amp;nbsp;and in the main just works. And looking at the future of Windows Phone and Windows 8 - the metro paradigm (the one on the Phone) look like it's the future of Windows.&lt;br /&gt;&lt;br /&gt;I'm now looking at either an iPhone (deep sucky in breath) or and Android Phone (slightly less sucky in breath).&lt;br /&gt;&lt;br /&gt;:-(&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-1372613614490231288?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/1372613614490231288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=1372613614490231288' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/1372613614490231288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/1372613614490231288'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2011/10/goodbye-windows-phone-7.html' title='Goodbye windows phone 7'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-2544852662700495428</id><published>2011-02-07T08:47:00.000+13:00</published><updated>2011-02-07T08:47:32.736+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='motivation open source oss'/><title type='text'>The Suprising Truth about Motivation</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I found this this morning via&amp;nbsp;&lt;a href="http://www.reddit.com/r/programming/comments/fg9le/the_surprising_truth_about_what_motivates_us/"&gt;reddit&lt;/a&gt;&amp;nbsp;and I think it sums up what's being playing on &amp;nbsp;my mind for years. What motivates us as people who make machines do 'stuff'.&lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/u6XAPnuFjJc" title="YouTube video player" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;For reference:&amp;nbsp;&lt;a href="http://www.thersa.org/events/vision/animate/rsa-animate-drive"&gt;original link to the Royal Society of Arts in the UK&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-2544852662700495428?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/2544852662700495428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=2544852662700495428' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/2544852662700495428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/2544852662700495428'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2011/02/suprising-truth-about-motivation.html' title='The Suprising Truth about Motivation'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/u6XAPnuFjJc/default.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-8287635202413201698</id><published>2010-03-05T10:41:00.002+13:00</published><updated>2010-07-17T15:06:51.528+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sql'/><category scheme='http://www.blogger.com/atom/ns#' term='Sql 2005'/><title type='text'>SQL Server 2005/8 OUTPUT clause</title><content type='html'>&lt;p&gt;This just passed me by. What a &lt;a href="http://msdn.microsoft.com/en-us/library/ms177564.aspx" target="_blank"&gt;great function&lt;/a&gt; to avoid writing some triggers. Which we all know aren’t guaranteed to always fire.&lt;/p&gt;&lt;p&gt;Here are a couple of examples : &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://weblogs.sqlteam.com/mladenp/archive/2006/06/08/10122.aspx"&gt;http://weblogs.sqlteam.com/mladenp/archive/2006/06/08/10122.aspx&lt;/a&gt;&amp;#160;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.sqlauthority.com/2007/10/01/sql-server-2005-output-clause-example-and-explanation-with-insert-update-delete/"&gt;http://blog.sqlauthority.com/2007/10/01/sql-server-2005-output-clause-example-and-explanation-with-insert-update-delete/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-8287635202413201698?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/8287635202413201698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=8287635202413201698' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/8287635202413201698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/8287635202413201698'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2010/03/sql-server-2005-output-clause.html' title='SQL Server 2005/8 OUTPUT clause'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-455493758072316610</id><published>2010-01-29T14:50:00.000+13:00</published><updated>2010-02-22T09:00:32.366+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General Development'/><title type='text'>Hard Disk Beat Boxing</title><content type='html'>&lt;p&gt;I’ve just returned from a month away and have discovered that my disk has gone north last week, making the sounds of a rather rubbish DeeJay. &lt;/p&gt;  &lt;p&gt;Since I use virtual machines for a lot of the work I’ve been doing and these machines actually run from a separate disk – I‘ve been fairly lucky and have only lost my vs2008 environment – the vs2010 is in a VM. This environment is easily recovered as we have a hard disk images for most of the vs2008 environments, and I only have to reinstall beyond compare, configure notepad++ and some VS settings, restore a couple of test databases and I’m back in business.&lt;/p&gt;  &lt;p&gt;However this is another timely reminder for &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Using Source Control – I’ve lost no source code, including all my part changes which are in &lt;a href="http://msdn.microsoft.com/en-us/library/ms181403.aspx" target="_blank"&gt;TFS as shelvesets&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Use a second disk for VMs – not only is it faster but it can also save your bacon from time to time &lt;/li&gt;    &lt;li&gt;Keep hard disk images of important setups of your dev environment. I have to thank Aderant’s great IT team for this. They really are the best IT team I’ve ever worked with.      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:68aec0f2-f548-4d69-b8aa-63bdddbf68dd" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Disk+backup" rel="tag"&gt;Disk backup&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;back up important things before going away – and please please please automate this as its trivial on windows to set up &lt;a href="http://technet.microsoft.com/en-us/library/cc507860.aspx" target="_blank"&gt;scheduled task&lt;/a&gt; to do this for you. &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-455493758072316610?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/455493758072316610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=455493758072316610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/455493758072316610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/455493758072316610'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2010/01/hard-disk-beat-boxing.html' title='Hard Disk Beat Boxing'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-3915638415539067587</id><published>2009-09-28T10:47:00.001+13:00</published><updated>2009-09-28T10:47:30.009+13:00</updated><title type='text'>Make coding easier ???</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_KCdtnU2dH00/Sr_dbL0VHHI/AAAAAAAACSY/cMnlb68rMNs/s1600-h/image%5B3%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="376" alt="image" src="http://lh4.ggpht.com/_KCdtnU2dH00/Sr_dcHNIXbI/AAAAAAAACSc/S83sb9TSkzw/image_thumb%5B1%5D.png?imgmax=800" width="385" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The &lt;a title="Resharper 4.5" href="http://www.jetbrains.com/resharper/index.html" target="_blank"&gt;Resharper 4.5&lt;/a&gt; splash screen during installation made me laugh today. I completely dig Resharper (though I prefer &lt;a title="Refactor Pro" href="http://www.devexpress.com/Downloads/Visual_Studio_Add-in/index.xml" target="_blank"&gt;Refactor Pro&lt;/a&gt;) so don’t get me wrong. I just thought &lt;em&gt;“Wow, that makes my code easier to understand”&lt;/em&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-3915638415539067587?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/3915638415539067587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=3915638415539067587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/3915638415539067587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/3915638415539067587'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/09/make-coding-easier.html' title='Make coding easier ???'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_KCdtnU2dH00/Sr_dcHNIXbI/AAAAAAAACSc/S83sb9TSkzw/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-625720948217836954</id><published>2009-08-06T12:09:00.001+12:00</published><updated>2009-09-14T13:58:29.078+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Test'/><title type='text'>TRX File decoder script updated to include Console output</title><content type='html'>&lt;p&gt;Can’t image how I forgot this, but I did:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:stylesheet&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2.0&amp;quot;&lt;/span&gt;  &lt;br /&gt;                &lt;span class="attr"&gt;xmlns:xsl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/span&gt;&lt;br /&gt;                &lt;span class="attr"&gt;xmlns:t&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://microsoft.com/schemas/VisualStudio/TeamTest/2006&amp;quot;&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt; &lt;span class="attr"&gt;match&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/css&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            h2 {color: sienna}&lt;br /&gt;            p {margin-left: 20px}&lt;br /&gt;            .resultsHdrRow { font-face: arial; padding: 5px }&lt;br /&gt;            .resultsRow { font-face: arial; padding: 5px }&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;h2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Test Results&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;h2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;h3&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Summary&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;h3&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ul&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Tests found:    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;t:TestRun/t:ResultSummary/t:Counters/@total&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Tests executed: &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;t:TestRun/t:ResultSummary/t:Counters/@executed&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Tests passed:   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;t:TestRun/t:ResultSummary/t:Counters/@passed&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Tests Failed:   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;t:TestRun/t:ResultSummary/t:Counters/@failed&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ul&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt; &lt;span class="attr"&gt;border&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;80%&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;  &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;resultsHdrRow&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;th&lt;/span&gt; &lt;span class="attr"&gt;align&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;left&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Test&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;th&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;th&lt;/span&gt; &lt;span class="attr"&gt;align&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;left&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Outcome&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;th&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/t:TestRun/t:Results/t:UnitTestResult&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt; &lt;span class="attr"&gt;valign&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;top&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;resultsRow&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;width&lt;/span&gt;&lt;span class="kwrd"&gt;='30%'&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;@testName&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;width&lt;/span&gt;&lt;span class="kwrd"&gt;='70%'&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Message: &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;t:Output/t:ErrorInfo/t:Message&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Stack: &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;t:Output/t:ErrorInfo/t:StackTrace&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;               &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Console: &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;t:Output/t:StdOut&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:stylesheet&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-625720948217836954?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/625720948217836954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=625720948217836954' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/625720948217836954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/625720948217836954'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/08/trx-file-decoder-script-updated-to.html' title='TRX File decoder script updated to include Console output'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-8939625692603136912</id><published>2009-08-06T11:21:00.001+12:00</published><updated>2009-09-09T14:39:12.570+12:00</updated><title type='text'>Using Beyond Compare with Visual Studio</title><content type='html'>&lt;p&gt;This &lt;a href="http://blogs.msdn.com/jmanning/articles/535573.aspx" target="_blank"&gt;info is in other places on the internet&lt;/a&gt; but I’m putting it here for my future reference:&lt;/p&gt;  &lt;p&gt;Under Tools|Options|Source Control|Visual Studio Team Foundation Server&lt;/p&gt;  &lt;p&gt;Select Configure User Tools&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_KCdtnU2dH00/SnoUDlfVAGI/AAAAAAAACRM/0xofqF5jgLU/s1600-h/ConfigBC3%5B7%5D.png"&gt;&lt;img title="ConfigBC3" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="321" alt="ConfigBC3" src="http://lh6.ggpht.com/_KCdtnU2dH00/SnoUEgQRk6I/AAAAAAAACRQ/yufBIcaA3J8/ConfigBC3_thumb%5B3%5D.png?imgmax=800" width="484" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Then add the following tools:&lt;/p&gt;  &lt;p&gt;Compare:&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; Tool: C:\Program Files (x86)\Beyond Compare 3\BCompare.exe&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; Arguments: %1 %2 /title1=%6 /title2=%7 /solo&lt;/p&gt;  &lt;p&gt;Merge:&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; Tool: C:\Program Files (x86)\Beyond Compare 3\BCompare.exe&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; Arguments: %1 %2 %3 %4 /title1=%6 /title2=%7 /title3=%8 /title4=%9 /solo&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-8939625692603136912?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/8939625692603136912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=8939625692603136912' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/8939625692603136912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/8939625692603136912'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/08/using-beyond-compare-with-visual-studio.html' title='Using Beyond Compare with Visual Studio'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_KCdtnU2dH00/SnoUEgQRk6I/AAAAAAAACRQ/yufBIcaA3J8/s72-c/ConfigBC3_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-6240617481431969880</id><published>2009-06-29T11:55:00.001+12:00</published><updated>2009-06-29T11:55:07.991+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VSMDI'/><category scheme='http://www.blogger.com/atom/ns#' term='MS Test'/><category scheme='http://www.blogger.com/atom/ns#' term='testmetadata'/><title type='text'>MS Test Error: Metadata files that belong to projects cannot be edited. If you wish to use this metadata file, please import it into the solution</title><content type='html'>&lt;p&gt;Visual studio (2008) sometimes gets into a bind. It loses the binding with a testadatafile (vsmdi) and try as you might you cannot reattach it and you get the message:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;“Metadata files that belong to projects cannot be edited. If you wish to use this metadata file, please import it into the solution”.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Well there is &lt;a title="Solution" href="http://social.msdn.microsoft.com/Forums/en-US/vststest/thread/903e85f0-385e-4400-aa38-69525189cee4" target="_blank"&gt;one proposed solution on msdn&lt;/a&gt; but it didn’t work for me. To get round it I dropped the vsmdi from the solution. Added it back using add existing item in the solution designer and then went to the &lt;em&gt;Test | Create a new Test list&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_KCdtnU2dH00/SkgC1s92LJI/AAAAAAAACQU/XbbhfD-hoZY/s1600-h/image%5B2%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="202" alt="image" src="http://lh6.ggpht.com/_KCdtnU2dH00/SkgC24MCgdI/AAAAAAAACQY/QtTfM91bz-w/image_thumb.png?imgmax=800" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This allowed me to recreate my test list. since I don’t really use many test lists it was a piece of cake but I don’t recommend this solution if you have legacy test lists and are afraid of losing them.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-6240617481431969880?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/6240617481431969880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=6240617481431969880' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6240617481431969880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6240617481431969880'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/06/ms-test-error-metadata-files-that.html' title='MS Test Error: Metadata files that belong to projects cannot be edited. If you wish to use this metadata file, please import it into the solution'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_KCdtnU2dH00/SkgC24MCgdI/AAAAAAAACQY/QtTfM91bz-w/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-4231485792098982357</id><published>2009-06-09T17:37:00.001+12:00</published><updated>2009-06-09T17:37:27.214+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Test'/><title type='text'>MS Test Error : Test skipped/Test host process exited unexpectedly</title><content type='html'>&lt;p&gt;I get this occasionally – esp. when I’m killing the tests part way through a debug session. The trick is to kill the VSPerfMon process that hangs around.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_KCdtnU2dH00/Si31EC5gKPI/AAAAAAAACQM/q6rUykP5mwU/s1600-h/Killvsperfmon%5B4%5D.png"&gt;&lt;img title="Killvsperfmon" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="233" alt="Killvsperfmon" src="http://lh3.ggpht.com/_KCdtnU2dH00/Si31FtMH-oI/AAAAAAAACQQ/CxBqpBmp0eE/Killvsperfmon_thumb%5B2%5D.png?imgmax=800" width="506" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Or the way I do it:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;br /&gt;c:\&amp;gt;tasklist | findstr /i VSPERFMON&lt;br /&gt;VSPerfMon.exe    6500 Console                    1     23,192 K&lt;br /&gt;c:\&amp;gt;kill -f 6500 &lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-4231485792098982357?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/4231485792098982357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=4231485792098982357' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/4231485792098982357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/4231485792098982357'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/06/ms-test-error-test-skippedtest-host.html' title='MS Test Error : Test skipped/Test host process exited unexpectedly'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_KCdtnU2dH00/Si31FtMH-oI/AAAAAAAACQQ/CxBqpBmp0eE/s72-c/Killvsperfmon_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-867289819096704767</id><published>2009-05-21T13:50:00.001+12:00</published><updated>2009-07-02T15:43:28.505+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rant'/><category scheme='http://www.blogger.com/atom/ns#' term='MS Test'/><title type='text'>Why Oh Why Oh Why….</title><content type='html'>&lt;p&gt;Has MSTest decided it needs me to have a DVD in the drive in order to run my tests.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_KCdtnU2dH00/ShSzdcutxgI/AAAAAAAACQA/2rS43yYsTeE/s1600-h/WhyOWhyOWhy%5B4%5D.png"&gt;&lt;img title="WhyOWhyOWhy" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="228" alt="WhyOWhyOWhy" src="http://lh3.ggpht.com/_KCdtnU2dH00/ShSze9RjBvI/AAAAAAAACQI/FadE_yjsXTA/WhyOWhyOWhy_thumb%5B2%5D.png?imgmax=800" width="501" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I swear its &lt;a title="Infamy" href="http://www.yourdictionary.com/quotes/infamy" target="_blank"&gt;got it in for me&lt;/a&gt;… Ye gads even if I kill the process it and restart it still refuses to proceed unless I replace the &lt;a href="http://www.amazon.co.uk/Chef-Season-DVD-Lenny-Henry/dp/B0009S9LOE" target="_blank"&gt;Chef Series 2&lt;/a&gt; DVD I was listening. I suppose it must have like Lenny Henry!&lt;/p&gt;  &lt;p&gt;Update: It’s now decided I cannot take “Romeo and Juliet” out of the DVD drive!!!!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-867289819096704767?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/867289819096704767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=867289819096704767' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/867289819096704767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/867289819096704767'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/05/why-oh-why-oh-why.html' title='Why Oh Why Oh Why….'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_KCdtnU2dH00/ShSze9RjBvI/AAAAAAAACQI/FadE_yjsXTA/s72-c/WhyOWhyOWhy_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-738896481179498109</id><published>2009-05-12T15:17:00.001+12:00</published><updated>2009-05-12T15:17:32.933+12:00</updated><title type='text'>Awesome intro regexp!!!</title><content type='html'>&lt;p&gt;Found &lt;a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/" target="_blank"&gt;this tutorial&lt;/a&gt; on digg today. It’s definitely worth reading.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-738896481179498109?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/738896481179498109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=738896481179498109' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/738896481179498109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/738896481179498109'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/05/awesome-intro-regexp.html' title='Awesome intro regexp!!!'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-4680508210066668414</id><published>2009-04-13T00:00:00.010+12:00</published><updated>2009-04-13T00:28:59.301+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pivot scratch games'/><title type='text'>Scratch That</title><content type='html'>After realising that my son is producing his own videos using ms movie maker, &lt;a href="http://www.google.co.nz/url?q=http://www.hyperionics.com/hc/&amp;ei=N9nhSerbMI2itgPY14SrCQ&amp;sa=X&amp;oi=spellmeleon_result&amp;resnum=1&amp;ct=result&amp;usg=AFQjCNHHXYxsSEE7Ikso2dTiqBc44mtLQw"&gt;hypercam &lt;/a&gt;and the awesome &lt;a href="http://www.geocities.com/peter_bone_uk/pivot.html"&gt;pivot stick figure animator&lt;/a&gt; and seeing the quality of this work I decided to introduce him to the really cool &lt;a href="http://scratch.mit.edu/"&gt;Scratch &lt;/a&gt;tool from MIT. &lt;br /&gt;&lt;br /&gt;This is his &lt;a href="http://scratch.mit.edu/projects/ilikers/486276"&gt;first attempt&lt;/a&gt; at event driven programming.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KCdtnU2dH00/SeHdU_YwUSI/AAAAAAAACPY/QB-OG25Z2FQ/s1600-h/stick+man+conversation.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 266px;" src="http://3.bp.blogspot.com/_KCdtnU2dH00/SeHdU_YwUSI/AAAAAAAACPY/QB-OG25Z2FQ/s320/stick+man+conversation.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5323779587211022626" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://scratch.mit.edu/projects/ilikers/486361"&gt;This is his second&lt;/a&gt; &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KCdtnU2dH00/SeHdeFX2EPI/AAAAAAAACPg/3RRprhl28og/s1600-h/kill+the+diver.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 262px;" src="http://2.bp.blogspot.com/_KCdtnU2dH00/SeHdeFX2EPI/AAAAAAAACPg/3RRprhl28og/s320/kill+the+diver.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5323779743436640498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and its a great but simple game. The diver swims from left to right and back again. The left right cursor keys control the cannon (the pointy wizard's hat) and the space bar fires a bullet at the diver. Each time you hit the diver you get one point. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;My son is only 10 and the game's official tester only just turned 7 this week. But they've managed to build and have a global release of their first game in the space of one sunday afternoon - amazing what two easter eggs can achieve in terms of productivity. I wonder if Joel Spolsky is listening....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-4680508210066668414?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/4680508210066668414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=4680508210066668414' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/4680508210066668414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/4680508210066668414'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/04/scratch-that.html' title='Scratch That'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_KCdtnU2dH00/SeHdU_YwUSI/AAAAAAAACPY/QB-OG25Z2FQ/s72-c/stick+man+conversation.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-8050666127886785900</id><published>2009-04-08T13:29:00.002+12:00</published><updated>2009-04-09T09:36:19.012+12:00</updated><title type='text'>Beer and Bytes inaugural meeting</title><content type='html'>&lt;p&gt;Last night was the first meeting of the Auckland North Shore Beer and Bytes group. I consider is a great success not because I wasn't the only person there (I ensured that by dragging a couple of willing cohorts from work - cheers Joe and Steve), but because I had not anticipated how the evening would progress. Would everyone be bored? What would we talk about? &lt;/p&gt;  &lt;p&gt;Well as it happened there was some very interesting things discussed. Joe tells me there were tape (actually digital but due to my age they'll always be tape) recorders in action. If anyone has any snippets they'd a like to add please feel free to add a comment. &lt;/p&gt;  &lt;p&gt;Mark and Greg from &lt;a href="http://www.tracado.com" target="_blank"&gt;Tracado&lt;/a&gt; gave us a run down on all the cool new things in &lt;a href="http://silverlight.net/getstarted/silverlight3/default.aspx" target="_blank"&gt;Silverlight 3&lt;/a&gt; that make this the best release yet. I had discussion about &lt;a href="http://www.hibernate.org/343.html" target="_blank"&gt;NHibernate&lt;/a&gt; and magic. Peter recommends &lt;a href="http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx" target="_blank"&gt;this project as a great example of why WPF is great&lt;/a&gt;. But I think my favourite of all was Peter (please could you,&amp;#160; and everyone else who wants to, send me links to your web pages?) encouraging us to have a .net (real guns and bullets) shooting night!&lt;/p&gt;  &lt;p&gt;Actually the other main thing we discovered was how many of us have &lt;a href="http://en.wikipedia.org/wiki/DBase" target="_blank"&gt;DBase&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Clipper_(programming_language)" target="_blank"&gt;Clipper&lt;/a&gt; in our backgrounds....&amp;#160; Thanks to Steve, Guy, Patrick, Peter, Allan, Joe, David, Mark, Greg and Bruce!&lt;/p&gt;  &lt;p&gt;I think the general consensus was that we should do it again so I'll organise one for a couple weeks after Easter. Next time I'll bring my laptop and maybe we'll look at some code too :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-8050666127886785900?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/8050666127886785900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=8050666127886785900' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/8050666127886785900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/8050666127886785900'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/04/beer-and-bytes-inaugural-meeting.html' title='Beer and Bytes inaugural meeting'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-6197845606584362029</id><published>2009-03-18T17:35:00.001+13:00</published><updated>2009-03-18T17:35:04.760+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VSMDI'/><category scheme='http://www.blogger.com/atom/ns#' term='MS Test'/><category scheme='http://www.blogger.com/atom/ns#' term='testmetadata'/><title type='text'>MSTest - Specified cast is invalid</title><content type='html'>&lt;p&gt;Just remembered this one. When running a VSMDI from the command line (using the mstest command switch /testmetadata) sometimes this error just happens - no help just 'specified cast is invalid'. &lt;/p&gt;  &lt;p&gt;I found out a while ago that if you have test lists that are empty this error sometimes happens. What you do is go to the VSMDI editor in visual studio and in the VSMDI in question ensure that you either have tests in each Test List, or remove the test lists that are empty.&lt;/p&gt;  &lt;p&gt;One more hassle from MSTest!!!! &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-6197845606584362029?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/6197845606584362029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=6197845606584362029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6197845606584362029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6197845606584362029'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/03/mstest-specified-cast-is-invalid.html' title='MSTest - Specified cast is invalid'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-5350935414432758718</id><published>2009-03-17T13:58:00.001+13:00</published><updated>2009-03-18T17:27:33.677+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='Sql'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Generating SQL from the NHibernate mapping file</title><content type='html'>&lt;p&gt;I spent 10 minutes searching for a simple program that would dump out the SQL that NHibernate generates from a mapping file if requested. In the end I just wrote my own. This is the relevant snippet.&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;                NHibernate.Cfg.Configuration config = &lt;span class="kwrd"&gt;new&lt;/span&gt; NHibernate.Cfg.Configuration();&lt;/pre&gt;&lt;pre&gt;                config.Configure();&lt;/pre&gt;&lt;pre class="alt"&gt;                config.AddFile(&lt;span class="str"&gt;"hbm_mapping.xml"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;                &lt;/pre&gt;&lt;pre class="alt"&gt;                var export = &lt;span class="kwrd"&gt;new&lt;/span&gt; NHibernate.Tool.hbm2ddl.SchemaExport(config);&lt;/pre&gt;&lt;pre&gt;                export.Execute(&lt;span class="kwrd"&gt;true&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-5350935414432758718?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/5350935414432758718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=5350935414432758718' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/5350935414432758718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/5350935414432758718'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/03/generating-sql-from-nhibernate-mapping.html' title='Generating SQL from the NHibernate mapping file'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-5115467569663079728</id><published>2009-03-16T08:38:00.001+13:00</published><updated>2009-03-16T08:38:26.805+13:00</updated><title type='text'>For future use</title><content type='html'>&lt;p&gt;For those idle moments I like to visit &lt;a href="http://stackoverflow.com/questions/tagged/command-line" target="_blank"&gt;http://stackoverflow.com/questions/tagged/command-line&lt;/a&gt; - there's always a gem or two there. This morning I learned about &lt;a href="http://quux.wiki.zoho.com/WMIC-Snippets.html" target="_blank"&gt;quux's Excellent WMIC cheat sheet!&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-5115467569663079728?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/5115467569663079728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=5115467569663079728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/5115467569663079728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/5115467569663079728'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/03/for-future-use.html' title='For future use'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-579698744087216069</id><published>2009-03-13T08:59:00.001+13:00</published><updated>2009-03-18T17:37:26.719+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='Aderant'/><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Finally it's out!</title><content type='html'>&lt;p&gt;It's been a while coming and taken its toll in terms of long hours and hard work but the &lt;a href="http://www.aderant.com/" target="_blank"&gt;ADERANT&lt;/a&gt; team have finally released our new software - &lt;a href="http://www.aderant.com/newsroom/press_release.aspx?id={2FDD196B-EC44-42DF-95E0-74FEFF285895}" target="_blank"&gt;ADERANT Expert &amp;quot;Golden Gate&amp;quot; Release&lt;/a&gt;. I leave you read the &lt;a href="http://www.aderant.com/newsroom/press_release.aspx?id={2FDD196B-EC44-42DF-95E0-74FEFF285895}" target="_blank"&gt;press release&lt;/a&gt; but I must say it's an exciting release - workflow, DSLs, WCF, WPF, new User Experiences, - you name it - it's in there! Well done everyone!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-579698744087216069?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/579698744087216069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=579698744087216069' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/579698744087216069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/579698744087216069'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/03/finally-it-out.html' title='Finally it&amp;#39;s out!'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-7098278929602309728</id><published>2009-03-12T23:46:00.002+13:00</published><updated>2009-03-12T23:49:06.450+13:00</updated><title type='text'>Awww what a shame ....</title><content type='html'>Sorry but I couldn't help but feel a tinge of sadness &lt;a href="http://www.infoq.com/news/2009/03/NET-4-Parsing"&gt;this...&lt;/a&gt;. Only joking!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-7098278929602309728?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/7098278929602309728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=7098278929602309728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/7098278929602309728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/7098278929602309728'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/03/awww-what-shame.html' title='Awww what a shame ....'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-3944037342385700361</id><published>2009-03-03T10:01:00.001+13:00</published><updated>2009-03-03T10:01:17.624+13:00</updated><title type='text'>Taking ownership of a file without explorer</title><content type='html'>&lt;p&gt;Use the following command on vista (&lt;a href="http://blogs.msdn.com/tims/archive/2006/11/02/windows-vista-secret-10-open-an-elevated-command-prompt-in-six-keystrokes.aspx" target="_blank"&gt;elevated&lt;/a&gt;) command prompt:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;icacls full_path_and_filename.ext /setowner name_of_user_or_group&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-3944037342385700361?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/3944037342385700361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=3944037342385700361' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/3944037342385700361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/3944037342385700361'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/03/taking-ownership-of-file-without.html' title='Taking ownership of a file without explorer'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-2029163339114897783</id><published>2009-03-03T09:28:00.001+13:00</published><updated>2009-03-18T17:27:00.888+13:00</updated><title type='text'>Notepad++ on Vista 64 - replacing Notepad.exe</title><content type='html'>&lt;p&gt;There are links &lt;a href="http://www.decimation.com/markw/2007/07/16/free-notepad-replacement-for-windows-vista-and-xp/" target="_blank"&gt;here&lt;/a&gt; and &lt;a href="http://notepad-plus.sourceforge.net/uk/site.htm" target="_blank"&gt;here&lt;/a&gt; (among many other places) that shows how to replace notepad editor with the excellent &lt;a href="http://en.wikipedia.org/wiki/Notepad%2B%2B" target="_blank"&gt;Notepad++&lt;/a&gt; on a vista or xp machine as the system default text editor. If you use vista 64 you'll need to add another directory to the location where you replace the original notepad.exe &lt;/p&gt;  &lt;p&gt;(%SystemRoot%\SysWOW64).&lt;/p&gt;  &lt;p&gt;So the set is :&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="400"&gt;%SystemRoot%&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="400"&gt;%SystemRoot%\System32&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="400"&gt;%SystemRoot%\SysWOW64&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;As always on Vista you'll need to jump through a few hoops to allow you to do this. The first is to replace the file owner with someone other than the default 'TrueInstaller' and secondly to give the new owner full control over the file. &lt;/p&gt;  &lt;p&gt;The above links give more info if you need it.&lt;/p&gt;  &lt;p&gt;Don't forget - you mess with windows at your own risk :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-2029163339114897783?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/2029163339114897783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=2029163339114897783' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/2029163339114897783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/2029163339114897783'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/03/notepad-on-vista-64-replacing.html' title='Notepad++ on Vista 64 - replacing Notepad.exe'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-5178138448883799744</id><published>2009-02-23T13:31:00.001+13:00</published><updated>2009-02-23T13:32:57.365+13:00</updated><title type='text'>Heaven</title><content type='html'>&lt;p&gt;&lt;a title="Stack overflow" href="http://stackoverflow.com/questions/245395/underused-features-of-windows-batch-files" target="_blank"&gt;There are other nerds out there&lt;/a&gt;!!! Nuff said!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-5178138448883799744?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/5178138448883799744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=5178138448883799744' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/5178138448883799744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/5178138448883799744'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/02/heaven.html' title='Heaven'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-9139948225835740831</id><published>2009-02-23T13:17:00.001+13:00</published><updated>2009-02-23T13:17:52.992+13:00</updated><title type='text'>Chainsaw (log4net viewer) won't refresh properly</title><content type='html'>&lt;p&gt;We use &lt;a href="http://logging.apache.org/chainsaw/index.html" target="_blank"&gt;Apache project's Chainsaw&lt;/a&gt; utility to view our log4net based logging messages. Being a Java Swing/AWT app it has a loads of funnies when running on windows such as commands not being where a windows user typically expects them but as a log viewer I find it outstanding - well, once you've got it to work that is!&lt;/p&gt;  &lt;p&gt;Anyway recently we had a case where on one and only one machine it just refused to refresh the display properly. Though messages could be read one by one, using the cursor key down method, it was slow and painful, as reading the general flow and history of messages usually helps debugging more than an individual message. We spent ages over the past few weeks looking at different setting - java, log4net, networking/firewalls etc (we use chainsaw over UDP), we even tried running different versions of chainsaw but to no avail. &lt;/p&gt;  &lt;p&gt;Finally a flash of inspiration - where are user settings stored? Yes! In your c:\users\blah\.chainsaw directory!!! Just delete this and low and behold like any decent app it recreates the info with sensible defaults. &lt;/p&gt;  &lt;p&gt;Sometimes it helps not to be too clever!&lt;/p&gt;  &lt;p&gt;NB. I always forget how to format a application configuration url for chainsaw on windows as there is small funny in chainsaw setting it via the UI. The correct format for us on vista64 is:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;a href="file:///c|/users/blah/some-dir/somefile.xml"&gt;file:///c|/users/blah/some-dir/somefile.xml&lt;/a&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;You can find this under the application preferences:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_KCdtnU2dH00/SaHrJ2RZhFI/AAAAAAAACPA/2l5kcqjO9nU/showapp%5B7%5D.png" target="_blank"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="217" alt="Chainsaw Preferences Location" src="http://lh3.ggpht.com/_KCdtnU2dH00/SaHrKiTrfxI/AAAAAAAACPE/RGjVeBnC2X4/showapp_thumb%5B5%5D.png" width="313" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;In the Automatic Configuration URL&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_KCdtnU2dH00/SaHrLJ5jL9I/AAAAAAAACPI/kFsw4Jz_ljc/captured_Image.png%5B17%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="396" alt="Chainsaw Automatic Configuration URL" src="http://lh5.ggpht.com/_KCdtnU2dH00/SaHrMKrf9xI/AAAAAAAACPM/25mu53Yn71Q/captured_Image.png_thumb%5B14%5D.png" width="478" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-9139948225835740831?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/9139948225835740831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=9139948225835740831' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/9139948225835740831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/9139948225835740831'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/02/chainsaw-log4net-viewer-won-refresh.html' title='Chainsaw (log4net viewer) won&amp;#39;t refresh properly'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_KCdtnU2dH00/SaHrKiTrfxI/AAAAAAAACPE/RGjVeBnC2X4/s72-c/showapp_thumb%5B5%5D.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-6223483671001294133</id><published>2009-02-13T16:23:00.001+13:00</published><updated>2009-02-13T16:23:41.519+13:00</updated><title type='text'>Stopping command line building from signing assemblies</title><content type='html'>&lt;p&gt;we all know that signing assemblies is a good thing, and I'm sure that most people know that the visual studio built in profilers (in instrumentation mode) need to work with unsigned code. So to stop the team build from signing I used the property SignAssembly and set it false before running msbuild (via the environment). I don't know if it works yet as it's running right now but I hope its as simple as that.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-6223483671001294133?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/6223483671001294133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=6223483671001294133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6223483671001294133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6223483671001294133'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2009/02/stopping-command-line-building-from.html' title='Stopping command line building from signing assemblies'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-188529204057571892</id><published>2008-12-20T22:12:00.001+13:00</published><updated>2008-12-20T22:12:48.485+13:00</updated><title type='text'>Just managed to GET (groan!!!) my first WCF REST Service running from my own host and not IIS</title><content type='html'>&lt;p&gt;More info later. Its 10pm on a Saturday night and I'm off home :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-188529204057571892?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/188529204057571892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=188529204057571892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/188529204057571892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/188529204057571892'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/12/just-managed-to-get-groan-my-first-wcf.html' title='Just managed to GET (groan!!!) my first WCF REST Service running from my own host and not IIS'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-8820821895668948499</id><published>2008-12-11T08:47:00.001+13:00</published><updated>2008-12-11T08:59:15.782+13:00</updated><title type='text'>During a code review</title><content type='html'>&lt;p&gt;My code may not be the best in the world, but yesterday I came across the following snippet:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;            DrawingImage image = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;            IDictionaryEnumerator enumerator = dictionary.GetEnumerator();&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (enumerator != &lt;span class="kwrd"&gt;null&lt;/span&gt;) {&lt;br /&gt;                enumerator.Reset();&lt;br /&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;while&lt;/span&gt; (enumerator.MoveNext()) {&lt;br /&gt;                    DictionaryEntry key = (DictionaryEntry)enumerator.Current;&lt;br /&gt;                    image = key.Value &lt;span class="kwrd"&gt;as&lt;/span&gt; DrawingImage;&lt;br /&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (image != &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; image;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;Which after thinking about reduced to this:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; dictionary.Values.OfType&amp;lt;DrawingImage&amp;gt;().FirstOrDefault();&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Interesting? No not very except for the following thought, as we move to a world where we write less and less imperative code and more and more declarative code, some of us (esp. me) really have to give up control to other more talented programmers out there a just use their code 'declaratively'.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-8820821895668948499?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/8820821895668948499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=8820821895668948499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/8820821895668948499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/8820821895668948499'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/12/during-code-review.html' title='During a code review'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-6805286551032775103</id><published>2008-11-22T20:55:00.001+13:00</published><updated>2008-11-22T21:03:38.682+13:00</updated><title type='text'>Quick Mention For Ex Colleagues New Venture - tracado.com</title><content type='html'>&lt;p&gt;A couple of colleagues have just left Aderant to set up their own venture (&lt;a href="http://www.tracado.com" target="_blank"&gt;www.tracado.com&lt;/a&gt;) in Auckland, New Zealand. Mark Greene and and Greg Smith are two of the most talented software people I've had the privilege of working with. Between them they have an immense and detailed understanding of building large software systems using the very latest Microsoft technologies. It's been a great pleasure working these guys and I'm sure that they'll make huge success of their new consultancy. So if you want properly architected and built software see these guys!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-6805286551032775103?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/6805286551032775103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=6805286551032775103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6805286551032775103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6805286551032775103'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/11/quick-mention-for-ex-colleagues-new.html' title='Quick Mention For Ex Colleagues New Venture - tracado.com'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-6654706571586969302</id><published>2008-08-28T09:14:00.001+12:00</published><updated>2008-08-28T09:15:57.243+12:00</updated><title type='text'>SQL Server Management Studio Madness - why do I have to have scripts as strings?</title><content type='html'>&lt;p&gt;What do you think the following option in the SQL Server Management Studio does?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/preetsangha/SLXDosftJtI/AAAAAAAABXo/cQWYo-AGoUk/SSMS%20Option%5B3%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="264" alt="SSMS Option" src="http://lh5.ggpht.com/preetsangha/SLXDpmpJ5kI/AAAAAAAABXs/BVx3uaN0jjo/SSMS%20Option_thumb%5B1%5D.png" width="446" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now one side of my brain says that I'll get a some preamble on my script looking a little bit like&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N&lt;span style="color: #006080"&gt;'[dbo].[SomeTable]'&lt;/span&gt;))&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Well you'd be right! Well in the main.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Without the option:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode-wrapper"&gt;&lt;br /&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/****** Object:  Table [dbo].[SomeTable]    Script Date: 08/28/2008 09:03:29 ******/&lt;/span&gt;&lt;br /&gt;CREATE TABLE [dbo].[SomeTable](&lt;br /&gt;    [Column1] [nchar](10) NULL,&lt;br /&gt;    [Column2] [nchar](10) NULL&lt;br /&gt;) ON [PRIMARY]&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;And with the option:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode-wrapper"&gt;&lt;br /&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/****** Object:  Table [dbo].[SomeTable]    Script Date: 08/28/2008 09:03:49 ******/&lt;/span&gt;&lt;br /&gt;IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N&lt;span class="str"&gt;'[dbo].[SomeTable]'&lt;/span&gt;) AND type &lt;span class="kwrd"&gt;in&lt;/span&gt; (N&lt;span class="str"&gt;'U'&lt;/span&gt;))&lt;br /&gt;BEGIN&lt;br /&gt;CREATE TABLE [dbo].[SomeTable](&lt;br /&gt;    [Column1] [nchar](10) NULL,&lt;br /&gt;    [Column2] [nchar](10) NULL&lt;br /&gt;) ON [PRIMARY]&lt;br /&gt;END&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;But for stored procedures?&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Without the option:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode-wrapper"&gt;&lt;br /&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/****** Object:  StoredProcedure [dbo].[DoIt]    Script Date: 08/28/2008 09:10:53 ******/&lt;/span&gt;&lt;br /&gt;create procedure [dbo].[DoIt]&lt;br /&gt;&lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;br /&gt;    select * &lt;br /&gt;    from SomeTable&lt;br /&gt;    &lt;span class="kwrd"&gt;where&lt;/span&gt; Column1 = &lt;span class="str"&gt;'blah'&lt;/span&gt;&lt;br /&gt;    &lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;With the option:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode-wrapper"&gt;&lt;br /&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/****** Object:  StoredProcedure [dbo].[DoIt]    Script Date: 08/28/2008 09:10:35 ******/&lt;/span&gt;&lt;br /&gt;IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N&lt;span class="str"&gt;'[dbo].[DoIt]'&lt;/span&gt;) AND type &lt;span class="kwrd"&gt;in&lt;/span&gt; (N&lt;span class="str"&gt;'P'&lt;/span&gt;, N&lt;span class="str"&gt;'PC'&lt;/span&gt;))&lt;br /&gt;BEGIN&lt;br /&gt;EXEC dbo.sp_executesql @statement = N&lt;span class="str"&gt;'create procedure [dbo].[DoIt]&lt;br /&gt;as &lt;br /&gt;    select * &lt;br /&gt;    from SomeTable&lt;br /&gt;    where Column1 = '&lt;/span&gt;&lt;span class="str"&gt;'blah'&lt;/span&gt;&lt;span class="str"&gt;'&lt;br /&gt;    '&lt;/span&gt; &lt;br /&gt;END&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;What I want to know is why does the 'IF NOT EXISITS' check require me to generate a script as a string invocation of sp_executesql? &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-6654706571586969302?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/6654706571586969302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=6654706571586969302' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6654706571586969302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6654706571586969302'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/08/sql-server-management-studio-madness.html' title='SQL Server Management Studio Madness - why do I have to have scripts as strings?'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/preetsangha/SLXDpmpJ5kI/AAAAAAAABXs/BVx3uaN0jjo/s72-c/SSMS%20Option_thumb%5B1%5D.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-1569932305858479293</id><published>2008-08-26T20:43:00.001+12:00</published><updated>2008-08-26T20:44:35.614+12:00</updated><title type='text'>RDP over two monitors</title><content type='html'>&lt;p&gt;I'd not even thought about doing this until today but at work we have dual monitors and we can work via remote desktop but this usually doesn't expand correctly over my home laptop and spare lcd setup. Today I did some hunting around and &lt;a href="http://www.intelliadmin.com/blog/2006/11/vista-remote-desktop-client-supports.html" target="_blank"&gt;came up with the /span option on MSTSC&lt;/a&gt; (the rdp client).&amp;#160; Cannot do full screen but it expand just about perfectly!&lt;/p&gt;  &lt;p&gt;Sweet&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-1569932305858479293?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/1569932305858479293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=1569932305858479293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/1569932305858479293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/1569932305858479293'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/08/rdp-over-two-sessions.html' title='RDP over two monitors'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-9048936226852347873</id><published>2008-08-26T15:04:00.001+12:00</published><updated>2008-08-26T15:04:26.670+12:00</updated><title type='text'>TFS Command line (un)locking a file</title><content type='html'>&lt;p&gt;I locked a file to prevent other users being able to checkin as I was doing radical surgery on it. This is something I hardly ever have to do with TFS but I was justified in this case. Since I use the command line I found that the easiest to issue a &lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;tf &lt;span style="color: #0000ff"&gt;lock&lt;/span&gt; /&lt;span style="color: #0000ff"&gt;lock&lt;/span&gt;:checkin somefile.xml&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;However when unlocking it I discovered no unlock command. Rather you have to &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;tf &lt;span style="color: #0000ff"&gt;lock&lt;/span&gt; /&lt;span style="color: #0000ff"&gt;lock&lt;/span&gt;:none somefile.xml&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This is (IMO) a real programmer choosing an API that is sensible for them (lock a file with no lock) but opaque to the new user. As I write lots of little tools/scripts etc, it's made me think about API discoverablility/design for the future.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-9048936226852347873?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/9048936226852347873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=9048936226852347873' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/9048936226852347873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/9048936226852347873'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/08/tfs-command-line-unlocking-file.html' title='TFS Command line (un)locking a file'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-6929721190408463059</id><published>2008-08-21T14:47:00.001+12:00</published><updated>2008-08-21T14:47:56.628+12:00</updated><title type='text'>Playing with Extension Methods</title><content type='html'>&lt;p&gt;I've had a issue with option Xml such as in our configuration stores. Basically I wanted to grab data from an XAttribute (see System.Xml.Linq) but wanted to avoid having to constantly check for null nodes. To ease the pain I wrote the following:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Extensions {&lt;br /&gt;    &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #008000"&gt;/// The extension method allows you to grab data from an XAttribute of if its null, supply a default&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #008000"&gt;/// &amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;node&amp;quot;&amp;gt;The node.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;defaultValue&amp;quot;&amp;gt;The default value.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; T ValueOrDefault&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; XAttribute node, T defaultValue) &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : IConvertible {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (node == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; defaultValue;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; (T)Convert.ChangeType(node.Value, &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(T));&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;now I can write &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;var results = from element &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; doc.Descendants(&lt;span style="color: #006080"&gt;&amp;quot;SomeTag&amp;quot;&lt;/span&gt;).Where(e =&amp;gt; e != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;       select &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; {&lt;br /&gt;           Prop1 = element.Attribute(&lt;span style="color: #006080"&gt;&amp;quot;attribute1&amp;quot;&lt;/span&gt;).ValueOrDefault(String.Empty),&lt;br /&gt;           Prop2 = element.Attribute(&lt;span style="color: #006080"&gt;&amp;quot;attribute1&amp;quot;&lt;/span&gt;).ValueOrDefault(String.Empty),&lt;br /&gt;       };&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;instead of &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;var results = from element &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; doc.Descendants(&lt;span style="color: #006080"&gt;&amp;quot;SomeTag&amp;quot;&lt;/span&gt;).Where(e =&amp;gt; e != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;       select &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; {&lt;br /&gt;           Prop1 = element.Attribute(&lt;span style="color: #006080"&gt;&amp;quot;attribute1&amp;quot;&lt;/span&gt;) != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; ? element.Attribute(&lt;span style="color: #006080"&gt;&amp;quot;attribute1&amp;quot;&lt;/span&gt;).Value :  String.Empty,&lt;br /&gt;           Prop2 = element.Attribute(&lt;span style="color: #006080"&gt;&amp;quot;attribute2&amp;quot;&lt;/span&gt;) != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; ? element.Attribute(&lt;span style="color: #006080"&gt;&amp;quot;attribute2&amp;quot;&lt;/span&gt;).Value :  String.Empty,&lt;br /&gt;       };&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Or some multi line version of it. Its was just as easy to create one for XElement.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-6929721190408463059?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/6929721190408463059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=6929721190408463059' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6929721190408463059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6929721190408463059'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/08/playing-with-extension-methods.html' title='Playing with Extension Methods'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-1179829617298759373</id><published>2008-08-13T20:46:00.001+12:00</published><updated>2008-08-13T20:46:41.530+12:00</updated><title type='text'>How Did I Get Started In Software Development?</title><content type='html'>&lt;p&gt;I just been tagged by my friend &lt;a href="http://mikehadlow.blogspot.com/2008/08/how-did-i-get-started-in-software.html" target="_blank"&gt;Mike Hadlow&lt;/a&gt; to join with this &lt;a href="http://en.wikipedia.org/wiki/Meme" target="_blank"&gt;meme&lt;/a&gt;. The question is a very popular topic with us nerds, and for me especially considering my passion for technology.&lt;/p&gt;  &lt;h4&gt;How old were you when you first started&amp;#160; in programming?&lt;/h4&gt;  &lt;p&gt;This is a favourite story of mine. I was 11 years old (1978) and in Mr Beardsley's maths class. At the back of the room was a partition, behind which only the 6th formers (16 year and older) kids were allowed. In the fateful particular lesson a series of beeps and other noises were heard. Asking Mr Beardsley about them was the probably the most life changing thing (a part from having kids) ever to happen to me - &amp;quot;That's the 6th formers playing with the computers. Would you like to find out more about that?&amp;quot; Well we started youngsters computer club that week and the rest is history.&lt;/p&gt;  &lt;h4&gt;What was your first programming language&lt;/h4&gt;  &lt;p&gt;Sorry I'd like to say machine code but no it was BASIC (PET ISTR then TRS80 then Acorn).&lt;/p&gt;  &lt;h4&gt;What was the first real program that you wrote&lt;/h4&gt;  &lt;p&gt;The first program I entered into a computer was from my (then) best friend Mandeep:&lt;/p&gt;  &lt;div&gt;   &lt;pre class="csharpcode"&gt;10 print &lt;span class="str"&gt;&amp;quot;********************* Nuclear Alert ******************************&amp;quot;&lt;/span&gt;&lt;br /&gt;20 &lt;span class="kwrd"&gt;goto&lt;/span&gt; 10&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;However the first program I actually wrote myself was called fatty, and it was a game to teach my younger brother maths. It had a some simple maths questions like 'what is 15 + 4'. If you selected the right answer a fat man would move along the screen all way across, but if you got it wrong then the man would randomly fall down the screen on his journey across the screen :-) It was called fatty because the man sort of looked, well, fat!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;What languages have you used since you started programming&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Ok, apart from BASIC and some simple machine code on my home computer I've used Pascal, Modula2, C, C++, Assembler (many varieties), PL/1, PLS, SQL, and of course C# and VB, not to mention PERL, and various shell languages and now iron python. But without a doubt the most interesting language I've ever written in was micro code at university. Here we had to do such things like loading buses with addresses, issuing memory refresh and read instructions, unloading buses etc. Together these&amp;#160; instruction primitives would end up forming a single machine code instruction like load register with contents of memory address.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;What was your first professional programming gig&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I was hired by IBM for a year during my degree to to testing of network apps, but after graduation I started work at &lt;a href="http://www.natwest.com" target="_blank"&gt;NatWest bank&lt;/a&gt; in the UK as a systems analyst but left that after 9 months to return to programming at &lt;a href="http://www.bts.co.uk/" target="_blank"&gt;small company&lt;/a&gt; in Surrey, UK. Here I learned C then C++ and became firmly entrenched in the MS world with the first visual studio. I have to say working here was was another life changing experience - I learned the difference between hacking code and &lt;em&gt;engineering&lt;/em&gt; software systems (which I'll expand in another post).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;What's the most fun you've every had programming&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;For me its all about the paradigms and abstractions,&amp;#160; and how they affect cognition. It sounds lofty but really all I mean is that I think civilisation is really just the application of one technology after another that leads us from one way of thinking to another. Software is a great medium as we can create new models, use and break them, learn from them and then start over much more easily than say working with, say, hardware.&amp;#160; I have fun with programming nearly every day. But I get the most fun from getting into a tough debug session where you dig deep, learn some, try again , dig deeper and so on, every time building new models and breaking through abstractions to try and understand what was intended and what was achieved.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Who am I calling out?&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://blog.peter.goodman.ms/" target="_blank"&gt;Peter Goodman&lt;/a&gt; and &lt;a href="http://tothevalley.spaces.live.com/default.aspx" target="_blank"&gt;Simon Shearston&lt;/a&gt;....&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-1179829617298759373?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/1179829617298759373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=1179829617298759373' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/1179829617298759373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/1179829617298759373'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/08/how-did-i-get-started-in-software.html' title='How Did I Get Started In Software Development?'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-2565851817964127637</id><published>2008-07-22T20:55:00.001+12:00</published><updated>2008-07-22T20:56:00.009+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rant'/><category scheme='http://www.blogger.com/atom/ns#' term='MS Test'/><title type='text'>MS Test is hurting</title><content type='html'>&lt;p&gt;Normally I try not 'me-too' post but I had to link to this. A friend of mine has just written &lt;a href="http://mikehadlow.blogspot.com/2008/07/mstest-is-sapping-my-will-to-live.html" target="_blank"&gt;an interesting post&lt;/a&gt; about how difficult he finds MS Test. Mentioning this to a colleague resulted in a link to Jeff Atwood's Coding Horror '&lt;a href="http://www.codinghorror.com/blog/archives/001144.html"&gt;Why Can't Microsoft Ship Open Source Software?&lt;/a&gt;' post basically going further and trying to understand the reasons behind this. &lt;/p&gt;  &lt;p&gt;I'm actually fed up with littering my tests with &lt;a href="http://www.ademiller.com/blogs/tech/2007/10/gotchas-mstests-deploymentitem-attribute/" target="_blank"&gt;[DeploymentItem]&lt;/a&gt; attributes, having to hack around virtually opaque XML files, and bending over to assume the god forsaken position that MS Test wants me in. Yes I've tried to get change implemented - but some arguments I lose and some I win!!!&lt;/p&gt;  &lt;p&gt;Sorry - rant over.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-2565851817964127637?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/2565851817964127637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=2565851817964127637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/2565851817964127637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/2565851817964127637'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/07/ms-test-is-hurting.html' title='MS Test is hurting'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-3404636774919147099</id><published>2008-07-01T16:28:00.001+12:00</published><updated>2008-07-01T16:28:02.792+12:00</updated><title type='text'>Access Denied Error when attaching to process</title><content type='html'>&lt;p&gt;I've had this problem the that I've been trying to solve over the last few days and its stopped me from debugging into services (remoting and WCF) in other processes. Every time I went into (in VS2K8)&amp;#160; Tools|Attach to Process, and I selected a one of our processes, I got an &lt;strong&gt;Access Denied&lt;/strong&gt; error. There was nothing in the event log, so I really didn't know what to try - except perhaps to reinstall VS, which hasn't worked.&lt;/p&gt;  &lt;p&gt;The solution is actually very mundane and is related to the fact the I was attempting, not to do managed code debugging, but something called 'workflow debugging'. I'm not sure what this is but VS tells me it incompatible with managed debugging. I suspect that its TFS related and I was basically attempting to attach the wrong kind of debugger, and since I'm no longer a TFS admin, I suspect this is why I'm getting access denied messages.&lt;/p&gt;  &lt;p&gt;To fix this all I had to do was to specify the correct debugger in the attach dialog, by clicking on the Select button and and changing the debugger type.&lt;/p&gt;  &lt;p&gt;Before:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/preetsangha/SGmyPzLrrKI/AAAAAAAABW4/Z2xAzgaJRe8/attach%5B8%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="353" alt="attach" src="http://lh5.ggpht.com/preetsangha/SGmyQ-7Q-rI/AAAAAAAABW8/AqpIAf7OMYg/attach_thumb%5B4%5D.jpg" width="514" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;After:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/preetsangha/SGmyR55RcoI/AAAAAAAABXA/6oz7W7YL6J4/debugger%5B4%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="348" alt="debugger" src="http://lh5.ggpht.com/preetsangha/SGmySg5xyaI/AAAAAAAABXE/tcHyVrUBGjM/debugger_thumb%5B2%5D.jpg" width="508" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/preetsangha/SGmyTX1ZghI/AAAAAAAABXI/MUTK_uJsydU/debugger%5B12%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="347" alt="debugger" src="http://lh6.ggpht.com/preetsangha/SGmyUfBz33I/AAAAAAAABXM/fE2DO6kJwM8/debugger_thumb%5B8%5D.jpg" width="508" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-3404636774919147099?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/3404636774919147099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=3404636774919147099' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/3404636774919147099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/3404636774919147099'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/07/access-denied-error-when-attaching-to.html' title='Access Denied Error when attaching to process'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/preetsangha/SGmyQ-7Q-rI/AAAAAAAABW8/AqpIAf7OMYg/s72-c/attach_thumb%5B4%5D.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-7018976095622176953</id><published>2008-06-27T11:17:00.001+12:00</published><updated>2008-06-27T11:17:17.989+12:00</updated><title type='text'>MSBuild Tasks - DLL or EXE</title><content type='html'>&lt;p&gt;Quite often I find that I need the reuse the functionality that is in a custom msbuild task within small tool elsewhere. Usually the way round that issue is to refactor the nuts an bolts of the task into another dll, and then referencing this where needed. This is still the best option in my opinion. However this morning we discovered that you put your tasks assembly in exe wrappers also. This allows you to have a static main etc etc to allow to you call the nuts and bolts of the task from, say, the command line. Thanks to colleague &lt;a href="http://www.linkedin.com/in/viznerm" target="_blank"&gt;Martin&lt;/a&gt; for verifying my ad hoc musings on this subject.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-7018976095622176953?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/7018976095622176953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=7018976095622176953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/7018976095622176953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/7018976095622176953'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/06/msbuild-tasks-dll-or-exe.html' title='MSBuild Tasks - DLL or EXE'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-2623809414660815240</id><published>2008-06-25T14:25:00.001+12:00</published><updated>2008-06-25T14:25:16.010+12:00</updated><title type='text'>MSTest fails with UTA058: Trust problem</title><content type='html'>&lt;p&gt;I kept getting this &lt;a href="http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3416338&amp;amp;SiteID=1" target="_blank"&gt;error&lt;/a&gt; for all my unit test dlls even though I was absolutely&amp;#160; certain that their locations were 100% fully trusted on my local cdrive. I even checked using the .net config tool in control panel. Finally I had a go at specifying the full paths to the dlls and &lt;em&gt;'viola'&lt;/em&gt;&amp;#160; it worked! You'll see that in the previous posting we use &lt;strong&gt;/testcontainer:%%~ff . &lt;/strong&gt;The necessary bit is ~f. To find out more about this you can type 'for /?' in the a command window.&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="400"&gt;         &lt;p&gt;In addition, substitution of FOR variable references has been enhanced.           &lt;br /&gt;You can now use the following optional syntax: &lt;/p&gt;          &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; %~I&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - expands %I removing any surrounding quotes (&amp;quot;)           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; %~fI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - expands %I to a fully qualified path name            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; %~dI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - expands %I to a drive letter only            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; %~pI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - expands %I to a path only            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; %~nI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - expands %I to a file name only            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; %~xI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - expands %I to a file extension only            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; %~sI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - expanded path contains short names only            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; %~aI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - expands %I to file attributes of file            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; %~tI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - expands %I to date/time of file            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; %~zI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - expands %I to size of file            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; %~$PATH:I&amp;#160;&amp;#160; - searches the directories listed in the PATH            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; environment variable and expands %I to the            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fully qualified name of the first one found.            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If the environment variable name is not            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; defined or the file is not found by the            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; search, then this modifier expands to the            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; empty string &lt;/p&gt;          &lt;p&gt;The modifiers can be combined to get compound results: &lt;/p&gt;          &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; %~dpI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - expands %I to a drive letter and path only           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; %~nxI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - expands %I to a file name and extension only            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; %~fsI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - expands %I to a full path name with short names only            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; %~dp$PATH:I - searches the directories listed in the PATH            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; environment variable for %I and expands to the            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; drive letter and path of the first one found.            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; %~ftzaI&amp;#160;&amp;#160;&amp;#160;&amp;#160; - expands %I to a DIR like output line&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-2623809414660815240?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/2623809414660815240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=2623809414660815240' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/2623809414660815240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/2623809414660815240'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/06/mstest-fails-with-uta058-trust-problem.html' title='MSTest fails with UTA058: Trust problem'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-1042674662204074036</id><published>2008-06-25T14:17:00.001+12:00</published><updated>2008-06-25T14:26:09.620+12:00</updated><title type='text'>MSTest.exe on the command line</title><content type='html'>&lt;p&gt;Heres a little batch file to run your tests locally (neatly) from test containers (courtesy of Paul)&lt;/p&gt;  &lt;div&gt;   &lt;pre class="csharpcode"&gt;rmdir TestResults /S /Q&lt;br /&gt;&lt;span class="kwrd"&gt;for&lt;/span&gt; %%f &lt;span class="kwrd"&gt;in&lt;/span&gt; (&lt;span class="str"&gt;&amp;quot;..\bin\debug\*UnitTest*.dll&amp;quot;&lt;/span&gt;) &lt;span class="kwrd"&gt;do&lt;/span&gt; del &lt;span class="str"&gt;&amp;quot;%%~nf&amp;quot;&lt;/span&gt;.trx &amp;amp;  mstest /testcontainer:%%~ff /noisolation /resultsfile:&lt;span class="str"&gt;&amp;quot;%%~nf&amp;quot;&lt;/span&gt;.trx&lt;br /&gt;&lt;span class="kwrd"&gt;for&lt;/span&gt; /f &lt;span class="str"&gt;&amp;quot;Tokens=*&amp;quot;&lt;/span&gt; %%f &lt;span class="kwrd"&gt;in&lt;/span&gt; (&lt;span class="str"&gt;'dir *.trx /b'&lt;/span&gt;) &lt;span class="kwrd"&gt;do&lt;/span&gt; @nxslt2.exe  &lt;span class="str"&gt;&amp;quot;%%f&amp;quot;&lt;/span&gt; trxsummary.xsl&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="csharpcode"&gt;Works for me!!!&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-1042674662204074036?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/1042674662204074036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=1042674662204074036' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/1042674662204074036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/1042674662204074036'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/06/mstestexe-on-command-line.html' title='MSTest.exe on the command line'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-7770000211288260739</id><published>2008-06-24T09:46:00.001+12:00</published><updated>2008-06-27T11:18:44.818+12:00</updated><title type='text'>Debugger.IsAttached</title><content type='html'>&lt;p&gt;Have just discovered System.Diagnostics.Debugger.IsAttached after years of using using #if. This way I can check if my unit tests are being debugged and thus alter timeouts as needed! As they say down here - Sweet As!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-7770000211288260739?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/7770000211288260739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=7770000211288260739' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/7770000211288260739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/7770000211288260739'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/06/debuggerisattached.html' title='Debugger.IsAttached'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-4019668161417391184</id><published>2008-06-22T20:42:00.001+12:00</published><updated>2008-06-22T20:42:05.152+12:00</updated><title type='text'>Visual Studio 2005 to 2008 Migration - Collating the upgrade logs</title><content type='html'>&lt;p&gt;I've been involved in the migration of a fairly large code base from VS2005 to VS2008 this past few weeks. Well kudos to MS for making this a simple process, however one little thing really got on my nerves. I wanted to run the devenv /upgrade xxxxx.sln across the entire code base and not a solution at a time. Next I wanted all the upgrade reports to be amalgamated into one report that I could search easily for errors/issues/warnings etc. &lt;/p&gt;  &lt;p&gt;The first bit was solved by my colleague Larry in Tallahassee building a batch file that ran through all the solution files in a DOS for loop and running&amp;#160; down across the whole code base looking for solution files and then running the above command over them.&lt;/p&gt;  &lt;div&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;for&lt;/span&gt; /f &lt;span class="str"&gt;&amp;quot;tokens=*&amp;quot;&lt;/span&gt; %s &lt;span class="kwrd"&gt;in&lt;/span&gt; (&lt;span class="str"&gt;'dir *.sln /s/b'&lt;/span&gt;) &lt;span class="kwrd"&gt;do&lt;/span&gt; devenv /upgrade &lt;span class="str"&gt;&amp;quot;%s&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Next I wanted to collect all the upgrade xml reports (all called upgradelog.xml), but I didn't want to generate a different format to the one that MS creates. The ms report is actually just a xsl transformation that is run on the upgradelog.xml. It takes the contents of log file (an xml file with the root node &amp;lt;Log /&amp;gt;, and generates some nice html with some expand/collapse JavaScript.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;So I figured my best bet would to extend this template making is work over a series of logs rather than just one. This left the next issue, how to amalgamate all the XMLs. My first choice was hindered by the fact that XSLT to me a write only language. Try as I might I cannot seem to get the syntax to stick :-)&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Anyway my next option was to create use python to create a simple XML file that listed all the logs. This was trivial but again fun as I don't know much python either.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre class="csharpcode"&gt;dir UpgradeLog.XML /s/b | \Python25\python.exe generatemasterlog.py &amp;gt; upgrade.xml.list&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="csharpcode"&gt;The python is trivial&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;div&gt;&lt;br /&gt;    &lt;pre class="csharpcode"&gt;import sys&lt;br /&gt;print &lt;span class="str"&gt;'&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;'&lt;/span&gt;&lt;br /&gt;print &lt;span class="str"&gt;'&amp;lt;Logs&amp;gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;while&lt;/span&gt; True: &lt;br /&gt;    logfile = sys.stdin.readline().strip()&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; not logfile: &lt;span class="kwrd"&gt;break&lt;/span&gt;        &lt;br /&gt;    print &lt;span class="str"&gt;'\t&amp;lt;UpgradeLog report=&amp;quot;%s&amp;quot; /&amp;gt;'&lt;/span&gt; % logfile&lt;br /&gt;print &lt;span class="str"&gt;'&amp;lt;/Logs&amp;gt;'&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;this upgrade.xml.list has the form&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt;?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Logs&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;UpgradeLog&lt;/span&gt; &lt;span class="attr"&gt;report&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;c:\development\SomeSln\UpgradeLog.XML&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;            .&lt;br /&gt;            .&lt;br /&gt;            .&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;UpgradeLog&lt;/span&gt; &lt;span class="attr"&gt;report&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;c:\development\AnOtherSln\UpgradeLog.XML&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Logs&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The using my old favourite nxslt2.exe I transformed this into a master upgrade log xml file.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:stylesheet&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;xmlns:xsl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;xmlns:msxsl&lt;/span&gt;&lt;span class="kwrd"&gt;='urn:schemas-microsoft-com:xslt'&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:output&lt;/span&gt; &lt;span class="attr"&gt;method&lt;/span&gt;&lt;span class="kwrd"&gt;='xml'&lt;/span&gt; &lt;span class="attr"&gt;indent&lt;/span&gt;&lt;span class="kwrd"&gt;='yes'&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt; &lt;span class="attr"&gt;match&lt;/span&gt;&lt;span class="kwrd"&gt;='/*'&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:processing-instruction&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;xml-stylesheet&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;href=&amp;quot;UpgradeReport.xslt&amp;quot; type=&amp;quot;text/xsl&amp;quot;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:processing-instruction&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:element&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Logs&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;='/Logs/UpgradeLog'&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:copy&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:copy-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;='document(@report)//UpgradeLog/*'&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:copy&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:element&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:stylesheet&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;What this does is run through all the report=&amp;quot;&amp;quot; attributes in the above upgrade.xml.list and pull the out the contents of that xmlfile and output it in with in xml file within the root node of &amp;lt;Logs /&amp;gt;. Hence I now have a master XML file with all the logs in the form &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Logs&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;UpgradeLog&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; ....&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;UpgradeLog&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;UpgradeLog&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; ....&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;UpgradeLog&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Logs&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I also output a processing statement (href=&amp;quot;UpgradeReport.xslt&amp;quot; type=&amp;quot;text/xsl&amp;quot;) that allows a browser automatically transform this xml into the nice html view.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The final step was to update the Microsoft XSLT UpgradeReport.xslt to support the new amalgamted xml. Thats too big to put here, but it basically change the master match from Log to Logs (&amp;lt;xsl:template match=&amp;quot;Logs&amp;quot;&amp;gt;) and then change the existing &amp;lt;body&amp;gt; to apply template (&amp;lt;xsl:apply-templates select=&amp;quot;/Logs/UpgradeLog&amp;quot;/&amp;gt;). This meant that is applies to all the &amp;lt;UpgradeLog /&amp;gt; elements rather than just one.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I'll email it to anyone who wants it (preetsangha gmail etc), but remember is mostly Microsoft's work. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-4019668161417391184?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/4019668161417391184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=4019668161417391184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/4019668161417391184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/4019668161417391184'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/06/visual-studio-2005-to-2008-migration.html' title='Visual Studio 2005 to 2008 Migration - Collating the upgrade logs'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-362973764261545735</id><published>2008-06-19T15:45:00.001+12:00</published><updated>2008-06-19T16:13:52.801+12:00</updated><title type='text'>Getting round the Visual Studio 2008 MSTest Appbase issue/bug</title><content type='html'>&lt;h3&gt;The Problem&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://forums.microsoft.com/Forums/ShowPost.aspx?PostID=3497041&amp;amp;SiteID=1" target="_blank"&gt;There is a known bug in visual studio 2008&lt;/a&gt; (and &lt;a href="http://forums.microsoft.com/Forums/ShowPost.aspx?PostID=3506760&amp;amp;SiteID=1&amp;amp;mode=1" target="_blank"&gt;here&lt;/a&gt;)&amp;#160; Well actually its in how MSTest runs the unit tests. The problem as I see it is that the AppDomain that your unit tests run in is not the same one that is initially created in the VSTestHost.exe. Its this initially created domain cannot find your types/assemblies. This is caused by VSTestHost.exe having an APPBASE of &amp;quot;C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE (or the equivalent on 32 bits &amp;quot;C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE).&lt;/p&gt;  &lt;p&gt;Debugging through with the &lt;a href="http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx" target="_blank"&gt;.net framework reference source&lt;/a&gt;, led me to the following explanation. When the tests run there is an AppDomain transition from your testing AppDomain. This can be caused by may things, I my case it was a System.Configuration call that was resulting a GetEvidence() call deep in framework. Once this transition had occurred, the assembly resolver delegate chain only had one resolver delegate within&amp;#160; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Microsoft.VisualStudio.TestTools.TestTypes.Unit.AssemblyResolver. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This is the one that cannot find the unit test dlls. Our resolver on the other hand was in our AppDomain and was therefore never called.&lt;/p&gt;  &lt;h3&gt;My simple workaround&lt;/h3&gt;  &lt;p&gt;I couldn't find a complete workaround, but I have what I think is one that is fairly unobtrusive. However this one relies on a known locatation for the Unit test dlls to reside (which is only really true when you done a complete build).&lt;/p&gt;  &lt;p&gt;What you do is create a &lt;a href="http://en.wikipedia.org/wiki/NTFS_symbolic_link" target="_blank"&gt;Vista symbolic link&lt;/a&gt; to the required appbase inside the the problematic appbase, and then tell VSTestHost.exe to probe this path as well. This fools the resolver into following this link to your required appbase.&lt;/p&gt;  &lt;p&gt;The simplest way to do this use the mklink, on the command line, and then edit the VSTestHost.exe.config in the above directory to include this symlink. For example if my unit test dll was in directory c:\UnitTests. I'd use (mind the wrap)&lt;/p&gt;  &lt;div&gt;   &lt;pre class="csharpcode"&gt;mklink /D mklink /d &lt;span class="str"&gt;&amp;quot;C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\MyUnitTestsDir&amp;quot;&lt;/span&gt; C:\UnitTests&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;and I'd add edit the C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\VSTestHost.exe.config and replace&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;div&gt;&lt;br /&gt;    &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;runtime&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;assemblyBinding&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;urn:schemas-microsoft-com:asm.v1&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;probing&lt;/span&gt; &lt;span class="attr"&gt;privatePath&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;PrivateAssemblies;PublicAssemblies&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;assemblyBinding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;runtime&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;with &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;runtime&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;assemblyBinding&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;urn:schemas-microsoft-com:asm.v1&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;probing&lt;/span&gt; &lt;span class="attr"&gt;privatePath&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;PrivateAssemblies;PublicAssemblies;MyUnitTestsDir&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;assemblyBinding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;runtime&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;&lt;span class="kwrd"&gt;You can see in both cases the symbolic link is called MyUnitTestsDir.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;h3&gt;My better workaround&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;&lt;span class="kwrd"&gt;In the case of running the tests from the command line, or via the IDE I picked a similar method, but actually create and delete the symlink in the [AssemblyInitialize]/[AssemblyCleanup] methods. I created a small helper class (thanks to &lt;span class="kwrd"&gt;&lt;a href="http://community.bartdesmet.net/blogs/bart/archive/2006/10/24/Windows-Vista-_2D00_-Creating-symbolic-links-with-C_2300_.aspx" target="_blank"&gt;Creating symlinks&lt;/a&gt; in C# by Bart De Smet)&lt;/span&gt;, that can be used to create and delete the symbolic links.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;div&gt;&lt;br /&gt;    &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SymLink : IDisposable{&lt;br /&gt;&lt;br /&gt;    [System.Runtime.InteropServices.DllImport(&lt;span class="str"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/span&gt;)]&lt;br /&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; CreateSymbolicLink(&lt;span class="kwrd"&gt;string&lt;/span&gt; lpSymlinkFileName, &lt;span class="kwrd"&gt;string&lt;/span&gt; lpTargetFileName, &lt;span class="kwrd"&gt;int&lt;/span&gt; dwFlags);&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; SYMLINK_FLAG_DIRECTORY = 1;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; linkCreated;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; LinkCreated {&lt;br /&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; linkCreated; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; symbolicLinkPath;&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// Create a symbolic link of the given name to in a given directory to an actual location&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;linkName&amp;quot;&amp;gt;name of the link. &amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;root&amp;quot;&amp;gt;this is the directory within which the symlink should be created&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;actual&amp;quot;&amp;gt;this is the actual location where the symlink points&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; SymLink(&lt;span class="kwrd"&gt;string&lt;/span&gt; linkName, &lt;span class="kwrd"&gt;string&lt;/span&gt; root, &lt;span class="kwrd"&gt;string&lt;/span&gt; actual) {&lt;br /&gt;        symbolicLinkPath = System.IO.Path.Combine(root, linkName);&lt;br /&gt;        linkCreated = CreateSymbolicLink(symbolicLinkPath, actual, SYMLINK_FLAG_DIRECTORY);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// Create a symbolic link of the given name to in a given directory to an actual location&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;linkName&amp;quot;&amp;gt;name of the link. &amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;root&amp;quot;&amp;gt;this is the directory within which the symlink should be created&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;actual&amp;quot;&amp;gt;this is the actual location where the symlink points&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;force&amp;quot;&amp;gt;Where the link should be deleted before use&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; SymLink(&lt;span class="kwrd"&gt;string&lt;/span&gt; linkName, &lt;span class="kwrd"&gt;string&lt;/span&gt; root, &lt;span class="kwrd"&gt;string&lt;/span&gt; actual, &lt;span class="kwrd"&gt;bool&lt;/span&gt; force) {&lt;br /&gt;        symbolicLinkPath = System.IO.Path.Combine(root, linkName);&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (force) {&lt;br /&gt;            Dispose();&lt;br /&gt;        }&lt;br /&gt;        linkCreated = CreateSymbolicLink(symbolicLinkPath, actual, SYMLINK_FLAG_DIRECTORY);&lt;br /&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; getLastError = System.Runtime.InteropServices.Marshal.GetLastWin32Error();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="preproc"&gt;#region&lt;/span&gt; IDisposable Members&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// Dispose&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Dispose() {&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (System.IO.Directory.Exists(symbolicLinkPath)) {&lt;br /&gt;            System.IO.Directory.Delete(symbolicLinkPath);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;I&amp;#160; then added the appropriate calls with in the [AssemblyInitialize]/[AssemblyCleanup] methods.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;div&gt;&lt;br /&gt;    &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; SymLink link;&lt;br /&gt;&lt;br /&gt;[AssemblyInitialize()]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AssemblyInitialize(TestContext testContext) {&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;// I suggest that symLinkName should be a guid or uniqueness without } as this messes up string.format unless you think about it.&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; symLinkName = &lt;span class="str"&gt;&amp;quot;SymLink-CF06174B-AA2A-4890-9209-ECCD0F9D172E&amp;quot;&lt;/span&gt;;&lt;br /&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; oldAppBase = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)AppDomain.CurrentDomain.GetData(&lt;span class="str"&gt;&amp;quot;APPBASE&amp;quot;&lt;/span&gt;);&lt;br /&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; requiredAppBase = (&lt;span class="kwrd"&gt;new&lt;/span&gt; System.IO.FileInfo(&lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath)).DirectoryName;&lt;br /&gt;    link = &lt;span class="kwrd"&gt;new&lt;/span&gt; SymLink(symLinkName, oldAppBase, requiredAppBase, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    Assert.IsTrue(link.LinkCreated, &lt;span class="str"&gt;&amp;quot;MS Test directory symlnk creation failed&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[AssemblyCleanup()]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AssemblyCleanup() {&lt;br /&gt;    link.Dispose();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;&lt;span class="kwrd"&gt;You still have to add a probe path entry to 'SymLink-CF06174B-AA2A-4890-9209-ECCD0F9D172E' like in the first workaround, but atleast this version will take into account the funny deployment directories&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;blockquote&gt;&lt;br /&gt;    &lt;p&gt;&lt;span class="kwrd"&gt;...\TestResults\SomeDymanicName[xxx]\Out&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;  &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;&lt;span class="kwrd"&gt;And there you go.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;h3&gt;Some thoughts&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;&lt;span class="kwrd"&gt;This is only a hack, as it requires you to edit your C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\Vstesthost.exe.config file with known identifiers. But got me working until we see the real solution from MS.&lt;/span&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;div class="wlWriterSmartContent" id="scid:B3E14793-948F-49af-A347-D19C374A7C4F:b9b82723-d074-449c-84bb-6f924b4d89bb" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--&lt;br /&gt;digg_url = 'http://preetsangha.blogspot.com/2008/06/getting-round-visual-studio-2008-mstest.html';&lt;br /&gt;digg_title = 'Getting round the Visual Studio 2008 MSTest Appbase issue/bug';&lt;br /&gt;digg_bodytext = 'There is a known bug in visual studio 2008. Well actually its in how MSTest runs the unit tests. The problem as I see it is that the AppDomain that your unit tests run in is not the same one that is initially created in the VSTestHost.exe. Its this initially created domain cannot find your types/assemblies. This is caused by VSTestHost.exe having an APPBASE of "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE (or the equivalent on 32 bits "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE).';&lt;br /&gt;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;&lt;span class="kwrd"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-362973764261545735?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/362973764261545735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=362973764261545735' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/362973764261545735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/362973764261545735'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/06/getting-round-visual-studio-2008-mstest.html' title='Getting round the Visual Studio 2008 MSTest Appbase issue/bug'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-6329231001431301438</id><published>2008-06-17T12:23:00.001+12:00</published><updated>2008-06-19T15:53:39.671+12:00</updated><title type='text'>Decoding the VS2008 Trx file</title><content type='html'>&lt;p&gt;I've just updated my script to support 2008 and the of course if you look at the internals you're going to have to upgrade on new release! Here's the new xslt. I've updated it to include the errors too (mind the wrap):&lt;/p&gt;  &lt;div&gt;   &lt;pre class="csharpcode"&gt;&amp;lt;xsl:stylesheet version=&lt;span class="str"&gt;&amp;quot;2.0&amp;quot;&lt;/span&gt;  &lt;br /&gt;                xmlns:xsl=&lt;span class="str"&gt;&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/span&gt;&lt;br /&gt;                xmlns:t=&lt;span class="str"&gt;&amp;quot;http://microsoft.com/schemas/VisualStudio/TeamTest/2006&amp;quot;&lt;/span&gt;&lt;br /&gt;                &amp;gt;&lt;br /&gt;&amp;lt;xsl:output method=&lt;span class="str"&gt;&amp;quot;text&amp;quot;&lt;/span&gt; /&amp;gt;&lt;br /&gt;&amp;lt;xsl:template match=&lt;span class="str"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;xsl:text&amp;gt;&amp;amp;#xA;&amp;amp;#x9;&amp;lt;/xsl:text&amp;gt;&amp;lt;xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of select=&lt;span class="str"&gt;&amp;quot;substring(t:TestRun/t:TestRunConfiguration/t:NamingScheme/@baseName, 1, 20)&amp;quot;&lt;/span&gt;/&amp;gt;: &amp;lt;xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of select=&lt;span class="str"&gt;&amp;quot;t:TestRun/t:TestRunConfiguration/t:Deployment/@runDeploymentRoot&amp;quot;&lt;/span&gt;/&amp;gt;.trx&lt;br /&gt;    &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;        &amp;lt;xsl:when test=&lt;span class="str"&gt;&amp;quot;(t:TestRun/t:ResultSummary/@outcome) = 'Failed'&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;        Failed &amp;lt;xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of select=&lt;span class="str"&gt;&amp;quot;t:TestRun/t:ResultSummary/t:Counters/@failed&amp;quot;&lt;/span&gt;/&amp;gt; (Executed [&amp;lt;xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of select=&lt;span class="str"&gt;&amp;quot;t:TestRun/t:ResultSummary/t:Counters/@executed&amp;quot;&lt;/span&gt;/&amp;gt;], Found [&amp;lt;xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of select=&lt;span class="str"&gt;&amp;quot;t:TestRun/t:ResultSummary/t:Counters/@total&amp;quot;&lt;/span&gt;/&amp;gt;], Passed [&amp;lt;xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of select=&lt;span class="str"&gt;&amp;quot;t:TestRun/t:ResultSummary/t:Counters/@passed&amp;quot;&lt;/span&gt;/&amp;gt;])&lt;br /&gt;        &amp;lt;xsl:&lt;span class="kwrd"&gt;for&lt;/span&gt;-each select=&lt;span class="str"&gt;&amp;quot;/t:TestRun/t:Results/t:UnitTestResult&amp;quot;&lt;/span&gt; &amp;gt;&lt;br /&gt;            &amp;lt;xsl:&lt;span class="kwrd"&gt;if&lt;/span&gt; test=&lt;span class="str"&gt;&amp;quot;@outcome = 'Failed'&amp;quot;&lt;/span&gt; &amp;gt;&lt;br /&gt;                &amp;lt;xsl:text&amp;gt;&amp;amp;#xA;&amp;amp;#x9;&amp;amp;#x9;&amp;lt;/xsl:text&amp;gt;&amp;lt;xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of select=&lt;span class="str"&gt;&amp;quot;@testName&amp;quot;&lt;/span&gt;/&amp;gt;&lt;br /&gt;                &amp;lt;xsl:text&amp;gt;&amp;amp;#xA;&amp;amp;#x9;&amp;amp;#x9;&amp;amp;#x9;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;                &amp;lt;xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of select=&lt;span class="str"&gt;&amp;quot;substring(t:Output/t:ErrorInfo/t:Message, 1, 170)&amp;quot;&lt;/span&gt;/&amp;gt;&lt;br /&gt;                &amp;lt;xsl:text&amp;gt;&amp;amp;#xA;&amp;amp;#x9;&amp;amp;#x9;&amp;amp;#x9;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;                &amp;lt;xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of select=&lt;span class="str"&gt;&amp;quot;substring(t:Output/t:ErrorInfo/t:Message, 171, 340)&amp;quot;&lt;/span&gt;/&amp;gt;&lt;br /&gt;                &amp;lt;xsl:text&amp;gt;&amp;amp;#xA;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;            &amp;lt;/xsl:&lt;span class="kwrd"&gt;if&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:&lt;span class="kwrd"&gt;for&lt;/span&gt;-each&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;        &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;        Passed (Executed [&amp;lt;xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of select=&lt;span class="str"&gt;&amp;quot;t:TestRun/t:ResultSummary/t:Counters/@executed&amp;quot;&lt;/span&gt;/&amp;gt;], Found [&amp;lt;xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of select=&lt;span class="str"&gt;&amp;quot;t:TestRun/t:ResultSummary/t:Counters/@total&amp;quot;&lt;/span&gt;/&amp;gt;], Passed [&amp;lt;xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of select=&lt;span class="str"&gt;&amp;quot;t:TestRun/t:ResultSummary/t:Counters/@passed&amp;quot;&lt;/span&gt;/&amp;gt;])&lt;br /&gt;    &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;    &lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="wlWriterSmartContent" id="scid:B3E14793-948F-49af-A347-D19C374A7C4F:7df100a5-ba91-4e32-ba1a-d6bec11c4ce8" style="padding-right: 0px; display: inline; padding-left: 0px; float: right; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--&lt;br /&gt;digg_url = 'http://preetsangha.blogspot.com/2008/06/decoding-vs2008-trx-file.html';&lt;br /&gt;digg_title = 'Decoding a VS2008 TRX file';&lt;br /&gt;digg_bodytext = 'I've just updated my script to support 2008 and the of course if you look at the internals you're going to have to upgrade on new release! Here's the new xslt. I've updated it to include the errors too (mind the wrap):';&lt;br /&gt;digg_topic = 'software';&lt;br /&gt;digg_skin = 'compact';&lt;br /&gt;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-6329231001431301438?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/6329231001431301438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=6329231001431301438' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6329231001431301438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6329231001431301438'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/06/decoding-vs2008-trx-file.html' title='Decoding the VS2008 Trx file'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-7757407074291851176</id><published>2008-05-13T11:51:00.001+12:00</published><updated>2008-05-13T12:11:09.273+12:00</updated><title type='text'>Decoding the MS Test TRX file</title><content type='html'>&lt;p&gt;I got fed up with loading a command line MS Test output data (.trx file) into visual studio in order to see the the failed tests and their messages so with the help of a colleague we came up with a simple XSL transformation that turns the output of the MS test session into a piece of text or html. We use the text version to print out a summary, and the html version to show the errors (if any :-)&lt;/p&gt;  &lt;p&gt;In order to incorporate it into the command line desktop build I used &lt;a href="http://www.xmllab.net/Products/nxslt2/tabid/73/Default.aspx" target="_blank"&gt;nxslt2&lt;/a&gt; from &lt;a href="http://www.xmllab.net/" target="_blank"&gt;xmllab.net&lt;/a&gt;. Which takes the trx file, the xsl stylesheet and the output on its command line e.g.&lt;/p&gt;  &lt;div&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;nxslt2.exe  testrun.trx trxformatter.xsl -o testrun.results.htm&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The summary stylesheet just outputs how many test found, passed and failed, and the name of the trx file if any did fail (so you can interrogate easily in vs if you want).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode-wrapper"&gt;&lt;br /&gt;  &lt;div class="csharpcode"&gt;&lt;br /&gt;    &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;&lt;br /&gt;      &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:stylesheet&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;2.0&amp;quot;&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;xmlns:xsl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:output&lt;/span&gt; &lt;span style="color: #ff0000"&gt;method&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:template&lt;/span&gt; &lt;span style="color: #ff0000"&gt;match&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;         Test Results Summary : Codebase: &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:value-of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Tests/TestRun/tests/value/codeBase&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:if&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&amp;quot;(&lt;span style="color: #ff0000"&gt;Tests&lt;/span&gt;/&lt;span style="color: #ff0000"&gt;TestRun&lt;/span&gt;/&lt;span style="color: #ff0000"&gt;result&lt;/span&gt;/&lt;span style="color: #ff0000"&gt;executedTestCount&lt;/span&gt; &lt;span style="color: #ff0000"&gt;-&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Tests&lt;/span&gt;/&lt;span style="color: #ff0000"&gt;TestRun&lt;/span&gt;/&lt;span style="color: #ff0000"&gt;result&lt;/span&gt;/&lt;span style="color: #ff0000"&gt;passedTestCount&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; 0&amp;quot;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;             Summary : Failed &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:value-of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Tests/TestRun/result/executedTestCount - Tests/TestRun/result/passedTestCount&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt; (Executed [&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:value-of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Tests/TestRun/result/executedTestCount&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;], Found [&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:value-of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Tests/TestRun/result/totalTestCount&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;], Passed [&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:value-of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Tests/TestRun/result/passedTestCount&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;])&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;             Results : &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:value-of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Tests/TestRun/runConfig/runDeploymentRoot&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;.trx&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:if&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:if&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;(Tests/TestRun/result/executedTestCount - Tests/TestRun/result/passedTestCount) = 0&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;             Summary : Passed (Executed [&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:value-of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Tests/TestRun/result/executedTestCount&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;], Found [&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:value-of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Tests/TestRun/result/totalTestCount&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;], Passed [&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:value-of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Tests/TestRun/result/passedTestCount&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;])&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:if&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:template&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;      &lt;/div&gt;&lt;br /&gt;    &lt;/div&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;and outputs a summary similar to :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"&gt;&lt;template match="/"&gt;Test Results Summary : &lt;/template&gt;&lt;/stylesheet&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"&gt;&lt;template match="/"&gt;Codebase: (name of unit test dll) &lt;/template&gt;&lt;/stylesheet&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"&gt;&lt;template match="/"&gt;and one of the following lines dependant of whether there where any failures&lt;/template&gt;&lt;/stylesheet&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;&lt;br /&gt;    &lt;div align="left"&gt;&lt;stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"&gt;&lt;template match="/"&gt;&lt;value-of select="Tests/TestRun/tests/value/codeBase"&gt;&lt;/value-of&gt;&lt;if test="(Tests/TestRun/result/executedTestCount - Tests/TestRun/result/passedTestCount) &amp;gt; 0"&gt; 0&amp;quot;&amp;gt;Summary : Failed &lt;value-of select="Tests/TestRun/result/executedTestCount - Tests/TestRun/result/passedTestCount"&gt;&lt;/value-of&gt;(Executed [99&lt;value-of select="Tests/TestRun/result/executedTestCount"&gt;&lt;/value-of&gt;], Found [100&lt;value-of select="Tests/TestRun/result/totalTestCount"&gt;&lt;/value-of&gt;], Passed [99&lt;value-of select="Tests/TestRun/result/passedTestCount"&gt;&lt;/value-of&gt;]) &lt;/if&gt;&lt;/template&gt;&lt;/stylesheet&gt;&lt;/div&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"&gt;&lt;template match="/"&gt;&lt;if test="(Tests/TestRun/result/executedTestCount - Tests/TestRun/result/passedTestCount) &amp;gt; 0"&gt; 0&amp;quot;&amp;gt;or &lt;/if&gt;&lt;/template&gt;&lt;/stylesheet&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;&lt;br /&gt;    &lt;div align="left"&gt;&lt;stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"&gt;&lt;template match="/"&gt;&lt;if test="(Tests/TestRun/result/executedTestCount - Tests/TestRun/result/passedTestCount) &amp;gt; 0"&gt; 0&amp;quot;&amp;gt;Results : &lt;em&gt;(name of test results file)&lt;value-of select="Tests/TestRun/runConfig/runDeploymentRoot"&gt;&lt;/value-of&gt;.trx&lt;/em&gt; &lt;/if&gt;&lt;/template&gt;&lt;/stylesheet&gt;&lt;/div&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&lt;br /&gt;    &lt;div align="left"&gt;&lt;stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"&gt;&lt;template match="/"&gt;&lt;if test="(Tests/TestRun/result/executedTestCount - Tests/TestRun/result/passedTestCount) &amp;gt; 0"&gt;&lt;/if&gt;&lt;if test="(Tests/TestRun/result/executedTestCount - Tests/TestRun/result/passedTestCount) = 0"&gt;Summary : Passed (Executed [99&lt;value-of select="Tests/TestRun/result/executedTestCount"&gt;&lt;/value-of&gt;], Found [100&lt;value-of select="Tests/TestRun/result/totalTestCount"&gt;&lt;/value-of&gt;], Passed [97]) &lt;/if&gt;&lt;/template&gt;&lt;/stylesheet&gt;&lt;/div&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The error details stylesheet :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515"&gt;xml &lt;/span&gt;&lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;?&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:stylesheet &lt;/span&gt;&lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1.0&lt;/span&gt;&amp;quot;&lt;br /&gt;&lt;span style="color: red"&gt;xmlns:xsl&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://www.w3.org/1999/XSL/Transform&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:template &lt;/span&gt;&lt;span style="color: red"&gt;match&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;html&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;head&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;style &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;text/css&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                    &lt;/span&gt;h2 {color: sienna}&lt;br /&gt;                    p {margin-left: 20px}&lt;br /&gt;                    .resultsHdrRow { font-face: arial; padding: 5px }&lt;br /&gt;                    .resultsRow { font-face: arial; padding: 5px }&lt;br /&gt;                &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;style&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;head&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;h2&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Test Results&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;h2&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:for-each &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Tests/TestRun/result&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;h3&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Summary&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;h3&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ul&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                            &lt;/span&gt;Tests found: &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;totalTestCount&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;                        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                            &lt;/span&gt;Tests executed: &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;executedTestCount&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;                        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                            &lt;/span&gt;Tests passed: &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;passedTestCount&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;                        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ul&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:for-each&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;table &lt;/span&gt;&lt;span style="color: red"&gt;border&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;width&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;80%&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;tr  &lt;/span&gt;&lt;span style="color: red"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;resultsHdrRow&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;th &lt;/span&gt;&lt;span style="color: red"&gt;align&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;left&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Test&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;th&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;th &lt;/span&gt;&lt;span style="color: red"&gt;align&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;left&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Outcome&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;th&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;tr&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                    &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:for-each &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Tests/UnitTestResult&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;tr &lt;/span&gt;&lt;span style="color: red"&gt;valign&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;top&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;resultsRow&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;td &lt;/span&gt;&lt;span style="color: red"&gt;width&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;'&lt;span style="color: blue"&gt;30%&lt;/span&gt;'&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;testName&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;                            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;td &lt;/span&gt;&lt;span style="color: red"&gt;width&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;'&lt;span style="color: blue"&gt;70%&lt;/span&gt;'&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                                    &lt;/span&gt;Message: &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;errorInfo/message&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;                                &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;br&lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                                    &lt;/span&gt;Stack: &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;errorInfo/stackTrace&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;                                &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;td&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;tr&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                    &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:for-each&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;                &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;table&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;html&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;creates the following HTML output&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/preetsangha/SCjX18oelNI/AAAAAAAABT0/vn2vF7vCSEU/image%5B4%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="186" alt="image" src="http://lh5.ggpht.com/preetsangha/SCjX2soelOI/AAAAAAAABT8/ZH_2nKuhRmw/image_thumb%5B2%5D.png" width="618" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Note that the test name will of course be yours, and any messages and stack trace will appear in the &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I'm aware that you can optimise the xsl but it works for me as is.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-7757407074291851176?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/7757407074291851176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=7757407074291851176' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/7757407074291851176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/7757407074291851176'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2008/05/decoding-ms-test-trx-file.html' title='Decoding the MS Test TRX file'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/preetsangha/SCjX2soelOI/AAAAAAAABT8/ZH_2nKuhRmw/s72-c/image_thumb%5B2%5D.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-472926132640277855</id><published>2007-11-05T12:50:00.001+13:00</published><updated>2007-11-05T12:54:21.743+13:00</updated><title type='text'>Stupid Stupid Stupid</title><content type='html'>&lt;p&gt;Installing live writer on Vista 64 - hahahahahahhahahahahhahahahhahahahahahhaha.&lt;/p&gt;  &lt;p&gt;Save yourself a quizzical 10 minutes &lt;a href="http://www.edbott.com/weblog/?p=1801" target="_blank"&gt;Installing Windows Live Suite on Vista x64&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Only one issue the directory on my XP machine was &amp;quot;C:\WINDOWS\system32\config\systemprofile\Local Settings\Application Data\WindowsLiveInstaller\MsiSources&amp;quot;&lt;/p&gt;  &lt;p&gt;How hard is it to detect the OS and say - please download this instead - BTW there's no support.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-472926132640277855?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/472926132640277855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=472926132640277855' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/472926132640277855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/472926132640277855'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2007/11/stupid-stupid-stupid.html' title='Stupid Stupid Stupid'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-8592272760780368790</id><published>2007-10-31T09:37:00.001+13:00</published><updated>2007-10-31T09:37:42.220+13:00</updated><title type='text'>Problems with the formatting</title><content type='html'>&lt;p&gt;I'm using windows live writer to do the postings to this blog but I'm finding that the Insert Code plugin is not formatting correctly on the finished blog. I need to get to the bottom of this as my postings are looking rubbish. Bear with me as I try to find out what's going on.&lt;/p&gt;  &lt;p&gt;Sorry&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-8592272760780368790?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/8592272760780368790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=8592272760780368790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/8592272760780368790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/8592272760780368790'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2007/10/problems-with-formatting.html' title='Problems with the formatting'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-6195796807253216243</id><published>2007-10-31T09:34:00.001+13:00</published><updated>2007-10-31T11:08:05.547+13:00</updated><title type='text'>Signing a third party assembly</title><content type='html'>&lt;p&gt;The other day I had to add a library to our third party tools folder (nmock2 actually) but in order to use it in our code I had to ensure that it had a strong name. Now one way I could have done this is to have downloaded the source code for the assembly and then recompiled adding a strong name. However I found a &lt;a href="http://geekswithblogs.net/dotnetrodent/archive/2006/10/05/93247.aspx" target="_blank"&gt;simpler solution on Adrian Hara's blog&lt;/a&gt; that showed how I could use the &lt;a href="http://research.microsoft.com/~mbarnett/ILMerge.aspx" target="_blank"&gt;ILMerge&lt;/a&gt; tool from &lt;a href="http://research.microsoft.com" target="_blank"&gt;MS Research&lt;/a&gt; to achieve the same effect but without the hassle (and there would have been) of recompiling the unsigned module. &lt;/p&gt;  &lt;p&gt;Essentially what you do is sign your own assembly and merge in the unsigned assembly, creating a single signed assembly package. This does requires some code compilation but not the original code from the unsigned third party assembly, just some of your own. &lt;a href="http://en.wikipedia.org/wiki/Superhero" target="_blank"&gt;Being a lazy so an so (:-)&lt;/a&gt; I decided to automated the process:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Create temporary assembly (ILMerge.dummy.dll) with a correct strong name. &lt;em&gt;This is my favourite bit as the code I'm using to create this assembly doesn't exist (e.g. echo.&amp;gt;tmp.cs) .&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Run ILMerge on this assembly together with the third party one, also specifying the strong name. &lt;/li&gt;    &lt;li&gt;Delete the temporary assembly &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;with a command file and that's it.&lt;/p&gt;  &lt;p&gt;Here's a batch file snippet that I used to do all of this:&lt;/p&gt;  &lt;div&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 1:&lt;/span&gt; @echo off &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 2:&lt;/span&gt; setlocal&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 3:&lt;/span&gt; echo.&amp;gt;tmp.cs&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 4:&lt;/span&gt; set thekeyfile=&lt;span style="color: #006080"&gt;&amp;quot;MyStrongNameKeyFile.snk&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 5:&lt;/span&gt; csc /&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;:&lt;span style="color: #006080"&gt;&amp;quot;ilmerge.dummy.dll&amp;quot;&lt;/span&gt; /target:library /keyfile:%thekeyfile% tmp.cs &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; exist &lt;span style="color: #006080"&gt;&amp;quot;%%~nf.XXXXX%%~xf&amp;quot;&lt;/span&gt; del &lt;span style="color: #006080"&gt;&amp;quot;%%~nf.XXXXX%%~xf&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; %%f &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (%1) &lt;span style="color: #0000ff"&gt;do&lt;/span&gt; &lt;span style="color: #006080"&gt;&amp;quot;ILMerge.exe&amp;quot;&lt;/span&gt; &lt;span style="color: #006080"&gt;&amp;quot;ilmerge.dummy.%%~nf%%~xf&amp;quot;&lt;/span&gt; %%f /ndebug /keyfile:%thekeyfile% /&lt;span style="color: #0000ff"&gt;out&lt;/span&gt;:%%~nf.XXXXX%%~xf&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; exist &lt;span style="color: #006080"&gt;&amp;quot;ilmerge.dummy.dll&amp;quot;&lt;/span&gt; del &lt;span style="color: #006080"&gt;&amp;quot;ilmerge.dummy.dll&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 9:&lt;/span&gt; del tmp.cs&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 10:&lt;/span&gt; endlocal&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;By the way the &lt;em&gt;XXXXX &lt;/em&gt;is an identifier I've used to distinguish the output from the original assembly (e.g. preet.dll becomes a signed preet.XXXXX.dll). To use it just save the code snippet above use like this:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; background-color: #f4f4f4"&gt;&lt;br /&gt;    &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 1:&lt;/span&gt;&amp;#xA0; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 2:&lt;/span&gt; C:\temp\thirdparty&amp;gt;dir /b&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 3:&lt;/span&gt; MyStrongNameKeyFile.snk&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 4:&lt;/span&gt; NMock2.dll&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 5:&lt;/span&gt; signasm.cmd&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 6:&lt;/span&gt;&amp;#xA0; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 7:&lt;/span&gt; C:\temp\thirdparty&amp;gt;signasm.cmd NMoc*&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 8:&lt;/span&gt; Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.42&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; Microsoft (R) Windows (R) 2005 Framework version 2.0.50727&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 10:&lt;/span&gt; Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 11:&lt;/span&gt;&amp;#xA0; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 12:&lt;/span&gt;&amp;#xA0; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 13:&lt;/span&gt; C:\temp\thirdparty&amp;gt;dir /b&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 14:&lt;/span&gt; MyStrongNameKeyFile.snk&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 15:&lt;/span&gt; NMock2.dll&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 16:&lt;/span&gt; NMock2.XXXXX.dll&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 17:&lt;/span&gt; signasm.cmd&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 18:&lt;/span&gt;&amp;#xA0; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;      &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#x27;Courier New&amp;#x27;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 19:&lt;/span&gt; C:\temp\thirdparty&amp;gt;&lt;/pre&gt;&lt;br /&gt;    &lt;/div&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-6195796807253216243?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/6195796807253216243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=6195796807253216243' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6195796807253216243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6195796807253216243'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2007/10/signing-third-party-assembly.html' title='Signing a third party assembly'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-944013798516613254</id><published>2007-10-10T10:08:00.001+13:00</published><updated>2007-10-10T10:08:14.574+13:00</updated><title type='text'>SDC TeamBuild Task Clash</title><content type='html'>&lt;p&gt;Just ran into this and put a &lt;a href="http://www.codeplex.com/sdctasks/Thread/View.aspx?ThreadId=16215" target="_blank"&gt;Codeplex discussion posting&lt;/a&gt; on the &lt;a href="http://www.codeplex.com/" target="_blank"&gt;Microsoft Codeplex site&lt;/a&gt; for &lt;a href="http://www.codeplex.com/sdctasks" target="_blank"&gt;Microsoft SDC Tasks for MsBuild&lt;/a&gt;, indicating this fault we got with the latest version. &lt;/p&gt;  &lt;p&gt;Essentially the team build has &lt;a href="http://msdn2.microsoft.com/en-us/library/ms243778(VS.80).aspx" target="_blank"&gt;Get Source Code&lt;/a&gt; target and this calls the &lt;a href="http://msdn2.microsoft.com/en-us/library/aa721740(VS.80).aspx" target="_blank"&gt;Get&lt;/a&gt; task in Team Foundation, unless you use SDC in which case the Get task used is from SDC - and boom!&lt;/p&gt;  &lt;pre class="csharpcode"&gt;C:\Program Files\MSBuild\Microsoft\VisualStudio\v8.0\TeamBuild\Microsoft.TeamFoundation.Build.targets(331,11): error MSB4064: The &lt;span class="str"&gt;&amp;quot;Workspace&amp;quot;&lt;/span&gt; parameter &lt;span class="kwrd"&gt;is&lt;/span&gt; not supported by the &lt;span class="str"&gt;&amp;quot;Get&amp;quot;&lt;/span&gt; task. Verify the parameter exists on the task, and it &lt;span class="kwrd"&gt;is&lt;/span&gt; a settable &lt;span class="kwrd"&gt;public&lt;/span&gt; instance property.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt; C:\Program Files\MSBuild\Microsoft\VisualStudio\v8.0\TeamBuild\Microsoft.TeamFoundation.Build.targets(329,5): error MSB4063: The &lt;span class="str"&gt;&amp;quot;Get&amp;quot;&lt;/span&gt; task could not be initialized with its input parameters.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Heres the changed lines in Microsoft.Sdc.Common.tasks file: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;&amp;lt;!-- Not needed so excluded --&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;&amp;lt;!-- &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceDepot.Changes&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceDepot.ChangesInInterval&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceDepot.CreateBranch&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceDepot.CreateClientFromTemplate&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceDepot.CreateChangelist&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceDepot.DeleteBranch&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceDepot.GetChangelistFromDateTime&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceDepot.GetChangelistFromLabel&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceDepot.GetUsersForChangelists&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceDepot.Integrate&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceDepot.LabelSync&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceDepot.ReverseIntegrate&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceDepot.Sync&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt; --&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 16: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceTfs.Changes&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 17: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceTfs.Checkin&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 18: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceTfs.Checkout&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 19: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceTfs.CreateBranch&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 20: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceTfs.CreateClientFromTemplate&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 21: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceTfs.DeleteBranch&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 22: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceTfs.GetChangelistFromDateTime&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 23: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceTfs.GetChangelistFromLabel&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 24: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceTfs.GetUsersForChangelists&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 25: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceTfs.Integrate&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 26: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceTfs.LabelSync&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 27: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceTfs.Sync&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 28: &lt;/span&gt;&amp;lt;!-- Not needed so excluded --&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 29: &lt;/span&gt;&amp;lt;!-- &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceSafe.Get&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 30: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceSafe.LabelGet&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 31: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceSafe.LabelLatest&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt; 32: &lt;/span&gt; &amp;lt;UsingTask AssemblyFile=&lt;span class="str"&gt;&amp;quot;$(TasksPath)Microsoft.Sdc.Tasks.dll&amp;quot;&lt;/span&gt; TaskName=&lt;span class="str"&gt;&amp;quot;Microsoft.Sdc.Tasks.SourceSafe.Changes&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 33: &lt;/span&gt;--&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-944013798516613254?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/944013798516613254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=944013798516613254' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/944013798516613254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/944013798516613254'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2007/10/sdc-teambuild-task-clash.html' title='SDC TeamBuild Task Clash'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-1870608160898261012</id><published>2007-10-09T08:41:00.001+13:00</published><updated>2007-10-09T08:41:12.810+13:00</updated><title type='text'>Silly little MsBuild gotcha</title><content type='html'>&lt;p&gt;I've inherited some custom MsBuild tasks that just worked - until I moved their deployment location from &lt;strong&gt;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727&lt;/strong&gt;&lt;em&gt; &lt;/em&gt;to another directory (e.g. under program files\msbuild). &lt;/p&gt;  &lt;p&gt;Once moved they started giving out the message&lt;/p&gt;  &lt;div align="justify"&gt;   &lt;pre class="csharpcode"&gt;MSB4062: The &lt;span class="str"&gt;&amp;quot;Blah.BlahTask&amp;quot;&lt;/span&gt; task could not be loaded from the assembly C:\Program Files\MSBuild\Blah\Blah.BlahTasks.dll or one of its dependencies. The system cannot find the file specified. Confirm that the &amp;lt;UsingTask&amp;gt; declaration &lt;span class="kwrd"&gt;is&lt;/span&gt; correct, and that the assembly and all its dependencies are available.&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Thinking I'd missed a hidden assembly I searched until I was blue in the face. Moving the assembly back made it work again when I got message MSB4036 saying that the task assembly could be found, but that now my new tasks (in another new assembly) were not implementing ITask, or not public.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This was really interesting as I'd written the new tasks from the ref docs and they were indeed public and implemented ITask. So I pulled up the source to the legacy tasks and low and behold they were private classes derived from Task and not explicitly labeled as implemented ITask. Quick recompile sorted not only this problem but also (I figured) the location issue and yep it did.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;So the question is why did my new task give a message about other tasks? Maybe it was a glitch as I only saw it once.&lt;/p&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-1870608160898261012?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/1870608160898261012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=1870608160898261012' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/1870608160898261012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/1870608160898261012'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2007/10/silly-little-msbuild-gotcha.html' title='Silly little MsBuild gotcha'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-4030272836345364588</id><published>2007-10-03T09:02:00.001+13:00</published><updated>2007-10-03T09:08:33.680+13:00</updated><title type='text'>TFS Cloaking as a way of avoiding the "get all the stuff I don't need for my build"</title><content type='html'>&lt;p&gt;The source tree has things that you don&amp;#x2019;t always want. So use the TFS command line program &lt;b&gt;tf&lt;/b&gt;&amp;#xA0; with the &lt;b&gt;workfold&lt;/b&gt; command to cloak the stuff you don&amp;#x2019;t want.&amp;#xA0; This way a &amp;#x201C;get specific&amp;#x201D; or &amp;#x201C;get latest&amp;#x201D; will ignore those directories&lt;/p&gt;  &lt;p&gt;e.g.&amp;#xA0; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;to ignore one directory &lt;/li&gt; &lt;/ul&gt;  &lt;pre class="csharpcode"&gt;tf workfold /server:tfs-server /workspace:&lt;span class="str"&gt;&amp;quot;my workspace name&amp;quot;&lt;/span&gt; &lt;strong&gt;&lt;u&gt;/cloak&lt;/u&gt;&lt;/strong&gt; $/Project1/Prototypes/Directory1&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;to ignore the directories in the in the prototypes directory: &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;for&lt;/span&gt; /f %f &lt;span class="kwrd"&gt;in&lt;/span&gt; (&lt;span class="str"&gt;'dir C:\Development\Project1\Prototypes /ad/b'&lt;/span&gt;) &lt;span class="kwrd"&gt;do&lt;/span&gt; tf workfold /server:tfs-server /workspace:&lt;span class="str"&gt;&amp;quot;my workspace name&amp;quot;&lt;/span&gt; &lt;strong&gt;&lt;u&gt;/cloak&lt;/u&gt;&lt;/strong&gt; $/Project1/Prototypes/%f&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Notes:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;You can only seem to cloak a directory not individual file &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;You cannot decloak a directory that has an ancestor cloaked. So you have to use.&amp;#xA0; &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;if you&amp;#x2019;re an UI guy then you use the &lt;a title="Visual Studio Team System - How to: Create a Workspace" href="http://msdn2.microsoft.com/en-us/library/ms181384(VS.80).aspx"&gt;TFS Manage Workspaces&lt;/a&gt; to achieve the same effect. However it does take longer as you have navigate the entire TFS project hierarchy for each cloak.&amp;#xA0; Which is mucho boring after the second time!&lt;a href="http://lh5.google.com/preetsangha/RwKjxqBwoDI/AAAAAAAAA_Y/l1W5o0XBgGU/manage%20workspace%20-%20cloak%5B3%5D.png"&gt;&lt;img id="id" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="180" alt="manage workspace - cloak" src="http://lh4.google.com/preetsangha/RwKjyaBwoEI/AAAAAAAAA_g/XI4gJo5Hq3Y/manage%20workspace%20-%20cloak_thumb%5B1%5D.png" width="226" border="0" /&gt;&lt;/a&gt; &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-4030272836345364588?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/4030272836345364588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=4030272836345364588' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/4030272836345364588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/4030272836345364588'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2007/10/tfs-cloaking-as-way-of-avoiding-all.html' title='TFS Cloaking as a way of avoiding the &amp;quot;get all the stuff I don&amp;#39;t need for my build&amp;quot;'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-6835380753136090972</id><published>2007-09-11T21:57:00.001+12:00</published><updated>2007-09-12T08:58:05.348+12:00</updated><title type='text'>Little TFS Team Build Customisation</title><content type='html'>&lt;p&gt;A colleague (James) asked if I knew of a way to stop TFS builds for creating a work item if the build in question fails. The answer took a few minutes to dig up but in a nutshell the answer is that you have to create a CreateWorkItem target &lt;span style="font-weight:bold;"&gt;(see update at bottom for better answer)&lt;/span&gt; in your MSBuild&amp;nbsp;&amp;nbsp; file.&lt;/p&gt; &lt;p&gt;Ok why is that?&lt;/p&gt; &lt;p&gt;MSBuild scripts , like NAnt,&amp;nbsp;are defined using a&amp;nbsp;set of targets. Each target (defined with &amp;lt;Target /&amp;gt; tag)&amp;nbsp;and is an&amp;nbsp;outcome&amp;nbsp;which&amp;nbsp;MSBuild&amp;nbsp;&amp;nbsp;must assert as true for the build to succeed (or conversely not assert as true for the build to fail). This is not meant as a tutorial on MSBuild, as there's hundred's out there, but it does help to know the basics of what MSBuild is doing before you start customising the build. &lt;/p&gt; &lt;p&gt;If you think of the build process&amp;nbsp;as of essentially asserting one target (e.g. &amp;lt;Target Name='MakeItSoTarget' /&amp;gt;). This in itself may not do very much, but what a target can do it assert other targets, so MakeItSo may assert that it will be true if PowerEngines and SetCourse also&amp;nbsp;assert true.&amp;nbsp; &lt;/p&gt; &lt;p&gt;In this way a hierarchy of dependencies can be created to define the entire build process from start to finish.&amp;nbsp;&amp;nbsp;In fact VS2005 .csproj files are essentially MSBuild build files that Visual Studio passes to the MSBuild to create your lovingly crafted code masterpiece. But I think&amp;nbsp;a real strength of MSBuild is the&amp;nbsp;&lt;a title="MSBuild .Targets Files" href="http://msdn2.microsoft.com/en-us/library/ms164312.aspx" target="_blank"&gt;pre-existing targets&lt;/a&gt; (and thus build processes) that MS has defined, which can be used to create a standard build process such as for Visual Studio or say TFS.&lt;/p&gt; &lt;p&gt;Anyway back to the question, why do I need to override CreateWorkItem. Well for team build there is a &lt;font color="#ff0000"&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa337604(vs.80).aspx"&gt;targets file&lt;/a&gt;&lt;/font&gt;&lt;font color="#000000"&gt; which MS uses to control the build process. This does number of things including, preparing for a build, getting the source code from TFS, compiling, testing, and packaging (I'll put a more detailed description of this&amp;nbsp;in another post)&amp;nbsp;. You can see the structure yourself in the file but essentially the main target of concern is OnBuildBreak. This is called&amp;nbsp;(surprisingly) when a build breaks (i.e. some other target is not asserted). &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;     &amp;lt;PropertyGroup&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;              &amp;lt;OnBuildBreakDependsOn&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;                     BeforeOnBuildBreak;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;                     GetChangeSetsOnBuildBreak;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                     DropBuild;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                     CreateWorkItem;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                     AfterOnBuildBreak;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;              &amp;lt;/OnBuildBreakDependsOn&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;       &amp;lt;/PropertyGroup&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;       &amp;lt;Target Name=&lt;span class="str"&gt;"OnBuildBreak"&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                     Condition=&lt;span class="str"&gt;" '$(IsDesktopBuild)'!='true' "&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                     DependsOnTargets=&lt;span class="str"&gt;"$(OnBuildBreakDependsOn)"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;font color="#000000"&gt;Here we can see that the On&lt;/font&gt;BuildBreak asserts true if the targets defined in property group &lt;em&gt;OnBuildBreakDependsOn&lt;/em&gt; also assert (line 12). This means that we&amp;nbsp; have a number of options for customisation. We can &lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Change &lt;font color="#000000"&gt;On&lt;/font&gt;BuildBreak to not depend on this precise property group &lt;br /&gt;&lt;li&gt;Alter the property group &lt;br /&gt;&lt;li&gt;Create a custom version&amp;nbsp;CreateWorkItem&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Since MS recommends that we don't actually alter the supplied .targets files, we can do each of these in our build file as any targets we define with the same name as the MS ones will be used by MSBuild instead. The path of least resistance suggests that we should endeavour to keep true the MSBuild as possible as this leads to a smaller ongoing maintenance cost (thanks for that Howard!) so to me the simplest thing is to define a new target: &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&amp;lt;Target Name=&lt;span class="str"&gt;'CreateWorkItem'&lt;/span&gt; &amp;gt;&lt;br /&gt;     &amp;lt;Message Text=&lt;span class="str"&gt;'Not creating a work item !!!.'&lt;/span&gt; /&amp;gt;&lt;br /&gt;&amp;lt;/Target&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;Now a new work item will not be created!&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;UPDATE: looking again I see an even simpler way - define the property SkipWorkItemCreation=true in your script, then team build will not do the task. I hope the exercise in understanding was still of value.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-6835380753136090972?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/6835380753136090972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=6835380753136090972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6835380753136090972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/6835380753136090972'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2007/09/little-tfs-team-build-customisation.html' title='Little TFS Team Build Customisation'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-2814259891132472872</id><published>2007-08-27T09:06:00.000+12:00</published><updated>2007-08-27T09:35:55.391+12:00</updated><title type='text'>Setting up slick run shortcuts quickly</title><content type='html'>I use &lt;a href="http://www.bayden.com/SlickRun/"&gt;slickrun&lt;/a&gt; for lots of things, but what I find it most useful for is opening up visual studio with the correct solutions. The reason its so useful is that our project is based on about 80+ vs solution files, and numerous more project files, carefully organised in to appropriate directories and subdirectories. After getting bored setting up 10 odd shortcuts in slickrun (even using  drag and drop) I decided that code would be a quicker solution. Anyway 5 minutes in notepad++ (qrs.cs) and using c# from command line I had:&lt;br /&gt;&lt;br&gt;&lt;br /&gt;using System;&lt;br /&gt;namespace qrs {&lt;br /&gt;public class p {&lt;br /&gt;        [STAThread] public static void Main(string [] args) {&lt;br /&gt;                        Console.WriteLine("[{0}]", args[1] );&lt;br /&gt;                        Console.WriteLine("Filename=\"{0}\"", args[0] );&lt;br /&gt;                        Console.WriteLine("Path=\"\"");&lt;br /&gt;                        Console.WriteLine("Params=\"\"");&lt;br /&gt;                        Console.WriteLine("Notes=\"\"");&lt;br /&gt;                        Console.WriteLine("GUID={{{0}}}", Guid.NewGuid().ToString());&lt;br /&gt;                        Console.WriteLine("StartMode=5");&lt;br /&gt;                        Console.WriteLine("UseRunAs=0");&lt;br /&gt;                        Console.WriteLine("");&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;br&gt;&lt;br /&gt;(yes thats a rubbish name :-)&lt;br /&gt;&lt;br /&gt;This only requires you to run the exe with the first parameter as the sln file, and the second parameter as the shorcut name. To generate the list I did a simple command line "for".&lt;br /&gt;&lt;br&gt;&lt;br /&gt;for /f "tokens=*"  %f in ('dir c:\project_root\*.sln /s/b') do @echo qrs.exe "%f" "%~nf" &gt;&gt; myqrs.txt&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br /&gt;This generated a load of entries in a file called myqrs.txt ,that I was able to cut and paste into the slickrun ini file.&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;[Solution2]&lt;br /&gt;Filename="C:\project_root\Subdir\Solution2.sln"&lt;br /&gt;Path=""&lt;br /&gt;Params=""&lt;br /&gt;Notes=""&lt;br /&gt;GUID={29647410-3995-45bf-9e46-cd8540f94c35}&lt;br /&gt;StartMode=5&lt;br /&gt;UseRunAs=0&lt;br /&gt;[Solution1]&lt;br /&gt;Filename="C:\project_root\Solution1.sln"&lt;br /&gt;Path=""&lt;br /&gt;Params=""&lt;br /&gt;Notes=""&lt;br /&gt;GUID={443ba4c0-339a-45d7-bae4-97a2d7bc511f}&lt;br /&gt;StartMode=5&lt;br /&gt;UseRunAs=0&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-2814259891132472872?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/2814259891132472872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=2814259891132472872' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/2814259891132472872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/2814259891132472872'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2007/08/setting-up-slick-run-shortcuts-quickly.html' title='Setting up slick run shortcuts quickly'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-4953291977256995887</id><published>2007-08-23T10:17:00.000+12:00</published><updated>2007-08-23T10:29:35.581+12:00</updated><title type='text'>Finding the .net framework path programattically</title><content type='html'>This seemed to be an easy question to answer when my colleague Jamie first asked. But it took a while to track it down. &lt;br /&gt;&lt;br&gt;&lt;br /&gt;System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()&lt;br /&gt;&lt;br&gt;&lt;br /&gt;Thanks to &lt;a href="http://blogs.msdn.com/toub"&gt;Stephen Toub&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-4953291977256995887?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/4953291977256995887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=4953291977256995887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/4953291977256995887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/4953291977256995887'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2007/08/finding-net-framework-path.html' title='Finding the .net framework path programattically'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8304622315377858621.post-5494810881641476491</id><published>2006-12-30T11:34:00.000+13:00</published><updated>2007-08-23T10:27:48.764+12:00</updated><title type='text'>Decided to move my technical musings here</title><content type='html'>After having kept a few technical postings on another site (&lt;a href="http://preetsangha.spaces.live.com/blog"&gt;http://preetsangha.spaces.live.com/blog&lt;/a&gt;) I'm now convinced that this is a better place - so I've finally created a diary here. Hope its not too boring. &lt;br /&gt;&lt;br /&gt;Apologies to &lt;a href="http://weblogs.asp.net/rosherove/"&gt;ISerializable - Roy Osherove's Blog&lt;/a&gt; and &lt;a href=""&gt;IUnknown John Lam on software&lt;/a&gt; for not being as orignal as them in the name chosen - hope you don't mind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8304622315377858621-5494810881641476491?l=preetsangha.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://preetsangha.blogspot.com/feeds/5494810881641476491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8304622315377858621&amp;postID=5494810881641476491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/5494810881641476491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8304622315377858621/posts/default/5494810881641476491'/><link rel='alternate' type='text/html' href='http://preetsangha.blogspot.com/2006/12/decided-to-move-my-technical-musings.html' title='Decided to move my technical musings here'/><author><name>preet sangha</name><uri>http://www.blogger.com/profile/07027050079768738581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
