<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>jeffcal's blogland : MSBuild</title><link>http://blogs.msdn.com/jeffcal/archive/tags/MSBuild/default.aspx</link><description>Tags: MSBuild</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>building everett apps with msbuild</title><link>http://blogs.msdn.com/jeffcal/archive/2004/12/16/318683.aspx</link><pubDate>Thu, 16 Dec 2004 19:54:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:318683</guid><dc:creator>jeffcal</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jeffcal/comments/318683.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffcal/commentrss.aspx?PostID=318683</wfw:commentRss><description>&lt;p&gt;check out &lt;a href="http://mark.michaelis.net/Blog/PermaLink.aspx?guid=a2aa1af7-e71e-4296-81fe-7bcecbb7a9cd"&gt;this post&lt;/a&gt; from &lt;a href="http://mark.michaelis.net/Blog/default.aspx"&gt;mark michaelis&lt;/a&gt;, where he describes the &lt;a href="http://mark.michaelis.net/Blog/PermaLink.aspx?guid=a2aa1af7-e71e-4296-81fe-7bcecbb7a9cd"&gt;work he did to build everett apps with msbuild&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;many customers are tackling this problem and it's encouraging to see them meet it with success.&lt;/p&gt; &lt;p&gt;jeff.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=318683" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffcal/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>early msbuild documentation</title><link>http://blogs.msdn.com/jeffcal/archive/2004/12/06/275965.aspx</link><pubDate>Mon, 06 Dec 2004 22:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:275965</guid><dc:creator>jeffcal</dc:creator><slash:comments>8</slash:comments><comments>http://blogs.msdn.com/jeffcal/comments/275965.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffcal/commentrss.aspx?PostID=275965</wfw:commentRss><description>&lt;p&gt;there's an &lt;a href="http://channel9.msdn.com/wiki/default.aspx/MSBuild.HomePage"&gt;msbuild wiki&lt;/a&gt; over at &lt;a href="http://channel9.msdn.com"&gt;channel 9&lt;/a&gt;, and there's a good preview of the msbuild documentation over at msdn:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msdn2.microsoft.com/library/0k6kkbsd.aspx"&gt;http://msdn2.microsoft.com/library/0k6kkbsd.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;as always, feedback is welcome (and encouraged).&lt;/p&gt; &lt;p&gt;jeff.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=275965" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffcal/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>important:  we need your feedback</title><link>http://blogs.msdn.com/jeffcal/archive/2004/10/06/238732.aspx</link><pubDate>Wed, 06 Oct 2004 17:35:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:238732</guid><dc:creator>jeffcal</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/jeffcal/comments/238732.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffcal/commentrss.aspx?PostID=238732</wfw:commentRss><description>&lt;p&gt;lately it seems like i've been pointing a lot at other content rather than providing too much of my own; i'll continue that trend today with the promise to change it tomorrow.&amp;nbsp; &lt;/p&gt; &lt;p&gt;but this one's particularly important:&amp;nbsp; &lt;A href="http://blogs.msdn.com/akipman"&gt;alex kipman&lt;/a&gt;,&amp;nbsp;the msbuild&amp;nbsp;program manager, has posted an important &lt;A href="http://blogs.msdn.com/akipman/archive/2004/10/05/238345.aspx"&gt;call for input&lt;/a&gt; from the community regarding how msbuild ships.&amp;nbsp; please go share your opinion with him, we want to hear from each of you.&lt;/p&gt; &lt;p&gt;jeff.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=238732" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffcal/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>everyone wants it...</title><link>http://blogs.msdn.com/jeffcal/archive/2004/10/03/237285.aspx</link><pubDate>Sun, 03 Oct 2004 21:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:237285</guid><dc:creator>jeffcal</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/jeffcal/comments/237285.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffcal/commentrss.aspx?PostID=237285</wfw:commentRss><description>&lt;p&gt;easily one of the &lt;a href="http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=15986521-ee6a-4397-8937-1b9cee7f2cf1"&gt;top requests&lt;/a&gt; we get from customers is support for targeting msbuild to the everett (1.1) framework.&amp;nbsp; well &lt;A href="http://blogs.msdn.com/Jomo_Fisher/"&gt;jomo&lt;/a&gt;'s recently posted an &lt;A href="http://blogs.msdn.com/jomo_fisher/archive/2004/10/01/236879.aspx"&gt;instructional explanation&lt;/a&gt; of how one might approach this problem.&amp;nbsp; and now &lt;a href="http://weblogs.asp.net/rmclaws/"&gt;robert mclaws&lt;/a&gt; has taken that and &lt;a href="http://weblogs.asp.net/rmclaws/archive/2004/10/03/237179.aspx"&gt;run with it&lt;/a&gt; to try to make it more versatile...&amp;nbsp; frankly,&amp;nbsp;i'm excited to see customers already using our product to accomplish their work even when we can't explicitly support it.&amp;nbsp; i think that speaks volumes about both the ingenuity of our customers and the versatility of our product.&lt;/p&gt; &lt;p&gt;jeff.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=237285" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffcal/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>new msbuild wiki</title><link>http://blogs.msdn.com/jeffcal/archive/2004/09/29/235885.aspx</link><pubDate>Wed, 29 Sep 2004 21:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:235885</guid><dc:creator>jeffcal</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/jeffcal/comments/235885.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffcal/commentrss.aspx?PostID=235885</wfw:commentRss><description>&lt;p&gt;over at the &lt;a href="http://weblogs.asp.net/nunitaddin/"&gt;nunitaddin&lt;/a&gt; blog, there's a &lt;a href="http://weblogs.asp.net/nunitaddin/archive/2004/09/29/235637.aspx"&gt;post&lt;/a&gt;&amp;nbsp;announcing a new &lt;a href="http://www.flexwiki.com/default.aspx/FlexWiki.MSBuildBloggersAndResources"&gt;msbuild wiki&lt;/a&gt;&amp;nbsp;maintained by external customers and developers.&amp;nbsp; i'm sure you'll find a few of the msbuild team members contributing there too.&amp;nbsp; please share any interesting resources/tips with others!&lt;/p&gt; &lt;p&gt;keep your eyes open for the official msbuild site/wiki coming soon.&lt;/p&gt; &lt;p&gt;jeff.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=235885" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffcal/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>the sequel</title><link>http://blogs.msdn.com/jeffcal/archive/2004/09/17/230957.aspx</link><pubDate>Fri, 17 Sep 2004 18:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:230957</guid><dc:creator>jeffcal</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jeffcal/comments/230957.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffcal/commentrss.aspx?PostID=230957</wfw:commentRss><description>&lt;p&gt;once again, the msbuild team will be packing our bags and heading to a secret location to fix as many bugs as possible.&amp;nbsp; hopefully it will be as successful as &lt;A href="http://blogs.msdn.com/jeffcal/archive/2004/08/02/206310.aspx"&gt;last time&lt;/a&gt;.&amp;nbsp; unfortunately, we'll be missing some of the helping hands we had last time, but maybe we can pick up a free agent or two.&amp;nbsp; either way, i'll keep you posted.&lt;/p&gt; &lt;p&gt;jeff.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=230957" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffcal/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>debugging a build process - what works for you?</title><link>http://blogs.msdn.com/jeffcal/archive/2004/09/02/225023.aspx</link><pubDate>Fri, 03 Sep 2004 01:33:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:225023</guid><dc:creator>jeffcal</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/jeffcal/comments/225023.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffcal/commentrss.aspx?PostID=225023</wfw:commentRss><description>&lt;p&gt;building a large piece of software can take a very long time.&amp;nbsp; combine the times to compile and link with syncing sources, running test suites and unit tests, mailing a build&amp;nbsp;report, copying the bins over the network, etc. and you have a process that can easily take hours.&amp;nbsp; what happens when some step in this process fails?&amp;nbsp; &lt;/p&gt; &lt;p&gt;i'm curious what those of you out there do.&amp;nbsp; &lt;/p&gt; &lt;p&gt;how do you track the problem down?&amp;nbsp; how do you correct it?&amp;nbsp; how do you carry on with the build?&amp;nbsp; do you rely solely on the build's logs?&amp;nbsp; do they normally contain the information you're interested in?&amp;nbsp; what information &lt;em&gt;are&lt;/em&gt; you interested in?&amp;nbsp; do you try to repro the problem?&amp;nbsp; does dependency analysis save you the trouble of again running those parts of the build which were successful?&lt;/p&gt; &lt;p&gt;let me know :)&lt;/p&gt; &lt;p&gt;jeff.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=225023" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffcal/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>reducing our bug backlog, or why "The MSBuild team rocks!!!"</title><link>http://blogs.msdn.com/jeffcal/archive/2004/08/02/206310.aspx</link><pubDate>Tue, 03 Aug 2004 00:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:206310</guid><dc:creator>jeffcal</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/jeffcal/comments/206310.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffcal/commentrss.aspx?PostID=206310</wfw:commentRss><description>&lt;P&gt;it's been nearly&amp;nbsp;eight weeks since my last post, but i promise i've been doing something for you!&amp;nbsp; and i can easily account for one of the&amp;nbsp;eight with an explanation of what my whole team did just last week.&lt;/P&gt;
&lt;P&gt;recently a couple teammates were trying to think about what issues they were concerned about resolving before we could ship a great first version of MSBuild.&amp;nbsp; they weren't talking about specific bugs or work items, but more generally about the mileage between that day and the day we ship, and how we can make sure we cover that distance.&amp;nbsp;&amp;nbsp;reducing our bug count came up for several reasons:&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;1.&amp;nbsp; lately the count has been&amp;nbsp;pretty flat.&amp;nbsp; in other words, the number of bugs we resolve (fixed, doesn't repro, by design, ...) has&amp;nbsp;been roughly the same as the number of bugs people are opening.&lt;/P&gt;
&lt;P&gt;2.&amp;nbsp; devs have lots of other work to do&amp;nbsp;aside from&amp;nbsp;fixing bugs.&lt;/P&gt;
&lt;P&gt;3.&amp;nbsp;&amp;nbsp;some important but lower priority bugs were starting to look ripe for kicking down to version 2 (which makes no one happy).&lt;/P&gt;
&lt;P&gt;4.&amp;nbsp; fixing bugs seemed like something program managers and testers could help the developers with.&amp;nbsp; and if we (the testers) were fixing bugs, &lt;EM&gt;presumably&lt;/EM&gt;&amp;nbsp;we wouldn't be finding them....more on that later.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;a&amp;nbsp;plan was set:&amp;nbsp; for one week, the MSBuild team - developers, program managers, and testers -&amp;nbsp;would all sit in the same conference room in an unusual building (read:&amp;nbsp; far away from the people most likely to distract us) while fixing&amp;nbsp;MSBuild bugs on our laptops.&amp;nbsp;&amp;nbsp;we wouldn't answer mail, wouldn't have phones, wouldn't go to meetings, and wouldn't work on anything other than fixing bugs.&amp;nbsp; period.&amp;nbsp; there were obviously some&amp;nbsp;initial concerns about this:&amp;nbsp; who would take care of our dogfooders?&amp;nbsp; which bugs would we fix?&amp;nbsp; could testers and program managers even fix bugs?&amp;nbsp; what would make this a success?&amp;nbsp; we came up with the answers we could but otherwise dove straight in hoping we'd accomplish something.&amp;nbsp; at the very least, this experiment would be a week of doing something different and exciting, and there was potential for significant results.&amp;nbsp; &lt;/P&gt;
&lt;P dir=ltr&gt;let's start with what we were facing:&amp;nbsp; at 12:01 AM on monday the 26th, there were 437 bugs without an available fix open against MSBuild.&amp;nbsp;&amp;nbsp;to put this number&amp;nbsp;in perspective a bit:&amp;nbsp;the bug count sat&amp;nbsp;just above&amp;nbsp;300 from early february to late april, before steadily rising to just under 450 from late april to mid june.&amp;nbsp;&amp;nbsp;for the next six weeks, we hovered&amp;nbsp;there at about the same spot.&amp;nbsp; over the past six months, our bug count had increased by about 50%.&lt;/P&gt;
&lt;P dir=ltr&gt;so there was a lot of work to do.&amp;nbsp; the first obstacle:&amp;nbsp; the conference room we'd reserved as our temporary home wasn't on any building maps and the receptionist had no idea where it was.&amp;nbsp; we feared&amp;nbsp;the mysterious room&amp;nbsp;was a black hole, but a &lt;A href="http://www.nytimes.com/2004/07/22/science/22hawk.html?ex=1091592000&amp;amp;en=43e0345503dc64df&amp;amp;ei=5070"&gt;recent admission by steven hawking&lt;/A&gt; allayed those fears.&amp;nbsp; once we'd all discovered the room, we fixed bugs.&amp;nbsp; and read bugs we thought maybe we could fix.&amp;nbsp; and fixed bugs.&amp;nbsp; and read the same bugs we thought we could fix before but still didn't know how to fix.&amp;nbsp; and fixed bugs.&amp;nbsp; and talked about fixing bugs.&amp;nbsp; and fixed bugs.&amp;nbsp; we also ate a few dozen krispy kreme donuts, a lot of bagels and cream cheese, sumedh's banana, and even some &lt;A href="http://www.canampizza.com/"&gt;pizza&lt;/A&gt; with indian food on top of it.&lt;/P&gt;
&lt;P dir=ltr&gt;by the end of the week,&amp;nbsp;we'd all learned a lot and&amp;nbsp;several of us had new nicknames (not all of which were desirable).&amp;nbsp; the developers were especially patient while helping the others out with everything&amp;nbsp;from process details to code reviews to&amp;nbsp;discussions of potential fixes.&amp;nbsp;&amp;nbsp;the testers actually did open&amp;nbsp;nine new bugs during the week. &amp;nbsp;eight of&amp;nbsp;those were opened by&amp;nbsp;our resident star tester dan, who finds bugs while putting his shoes on. &amp;nbsp;i personally learned a ton about our codebase and debugged more managed-&amp;gt;unmanaged transitions than the mariners after piniella's been tossed.&lt;/P&gt;
&lt;P dir=ltr&gt;here's the details though:&amp;nbsp; &lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P dir=ltr&gt;&lt;STRONG&gt;Monday 12:01 AM:&amp;nbsp;&amp;nbsp;&lt;FONT color=#ff0000&gt;437&lt;/FONT&gt; unfixed bugs&lt;/STRONG&gt;&lt;BR&gt;&lt;STRONG&gt;Friday 11:59 AM:&amp;nbsp; &lt;FONT color=#ff0000&gt;264&lt;/FONT&gt; unfixed bugs&lt;/STRONG&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;frankly, we'd hoped to reduce the count by about 100 for the week, or about 2/person/day.&amp;nbsp; in fact, we were able to reduce the count by about 3.5/person/day, even including the 16 new bugs opened over the week.&amp;nbsp; these numbers deserve a few qualifications:&amp;nbsp; our goal was simply to reduce the bug count by as much as possible, so many of us chose the easiest bugs to fix rather than the most important bugs; we don't&amp;nbsp;yet&amp;nbsp;know how many&amp;nbsp;new bugs we introduced, or&amp;nbsp;how the regression rate&amp;nbsp;compares to&amp;nbsp;the&amp;nbsp;usual&amp;nbsp;scenario when only developers are working on the codebase;&amp;nbsp;some of us actually did read our mail during the week (and deserve slaps on the wrists!).&amp;nbsp; but no matter the qualifications,&amp;nbsp;it was a great success&amp;nbsp;and discussions are already underway about when we should do it again.&amp;nbsp;&amp;nbsp;it'd be nice if&amp;nbsp;our work will encourage other teams to try similar experiments.&amp;nbsp; &lt;/P&gt;
&lt;P dir=ltr&gt;hopefully MSBuild will be a better product when we ship it because of this experiment; i personally think it will.&lt;/P&gt;
&lt;P dir=ltr&gt;jeff.&lt;/P&gt;
&lt;P dir=ltr&gt;ps - i'll write sooner next time!&lt;/P&gt;
&lt;P dir=ltr&gt;&lt;EM&gt;[Edit: removed link]&lt;/EM&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=206310" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffcal/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>dependency analysis in msbuild</title><link>http://blogs.msdn.com/jeffcal/archive/2004/05/28/144286.aspx</link><pubDate>Sat, 29 May 2004 04:58:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:144286</guid><dc:creator>jeffcal</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/jeffcal/comments/144286.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffcal/commentrss.aspx?PostID=144286</wfw:commentRss><description>&lt;P&gt;when people first get their hands on msbuild, especially those familiar with other build systems, one of the first things they notice is msbuild's dependency analysis mechanism.&amp;nbsp; the msbuild&amp;nbsp;engine offers basic dependency&amp;nbsp;checking based on explicitly declared target inputs and outputs.&amp;nbsp; currently, the analysis is pretty simple, although helpful in many cases:&amp;nbsp; msbuild checks output timestamps and input timestamps and if some of the outputs are older than some of the inputs (i'm glossing over details here), the engine will execute the target.&lt;/P&gt;
&lt;P&gt;users of other &lt;A href="http://ant.apache.org/"&gt;build&lt;/A&gt; &lt;A href="http://nant.sourceforge.net/"&gt;systems&lt;/A&gt;&amp;nbsp;have &lt;A href="http://nagoya.apache.org/eyebrowse/ReadMsg?listId=4&amp;amp;msgNo=46165"&gt;pointed out&lt;/A&gt; a fairly obvious &lt;A href="http://stefanbodewig.blogger.de/stories/11887/"&gt;limitation&lt;/A&gt;&amp;nbsp;of this mechanism:&amp;nbsp; dependency analysis often &lt;EM&gt;must&lt;/EM&gt; be more complex than timestamp checking.&amp;nbsp; i couldn't agree more.&lt;/P&gt;
&lt;P&gt;however, this limitation of msbuild's&amp;nbsp;dependency checking&amp;nbsp;mechanism should not be mistaken for a limitation of msbuild itself.&amp;nbsp; reason:&amp;nbsp; the author of a project file is not strictly limited to using the msbuild engine&amp;nbsp;for her dependency checking, nor is she required to allow the engine to perform&amp;nbsp;&lt;EM&gt;any&lt;/EM&gt; dependency analysis at all!&amp;nbsp; furthermore, and most importantly, &lt;STRONG&gt;this mechanism&lt;/STRONG&gt; (whether opting in or out) &lt;STRONG&gt;in no way precludes &lt;EM&gt;tasks&lt;/EM&gt; from performing their own dependency analysis at any level of precision they'd like&lt;/STRONG&gt;, exactly as many (N)Ant tasks do today.&amp;nbsp; the resgen task our team has developed does just this.&amp;nbsp;&amp;nbsp;we found&amp;nbsp;in some cases simple filestamp checking would lead to skipped calls to resgen when they were actually required, so&amp;nbsp;we simply moved the dependency analysis from the target level to the task level and &lt;EM&gt;voila!&lt;/EM&gt; problem solved.&lt;/P&gt;
&lt;P&gt;all this still leaves room for the engine to do more complex analysis while still exposing more control over it to the user, and we're thinking hard about how to make that happen.&lt;/P&gt;
&lt;P&gt;jeff.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=144286" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffcal/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>coming soon: wix tasks for msbuild</title><link>http://blogs.msdn.com/jeffcal/archive/2004/05/28/144131.aspx</link><pubDate>Fri, 28 May 2004 21:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:144131</guid><dc:creator>jeffcal</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/jeffcal/comments/144131.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffcal/commentrss.aspx?PostID=144131</wfw:commentRss><description>&lt;P&gt;hey y'all, and sorry i haven't written in a couple of weeks.&amp;nbsp;&amp;nbsp;we're working hard to ship our first beta of msbuild right now so my blog unfortunately sat down with a hefty piece of neglect pie.&amp;nbsp; but i'm back now (to the three of you who actually read this; well, two of you if i can't count my mother).&amp;nbsp; &lt;/P&gt;
&lt;P&gt;as many of you know by now, microsoft has &lt;A href="http://blogs.msdn.com/robmen/archive/2004/04/05/107709.aspx"&gt;dipped its toes&lt;/A&gt; into the open source waters&amp;nbsp;by opening up the &lt;A href="http://sourceforge.net/projects/wix/"&gt;wix project&lt;/A&gt;&amp;nbsp;to the community.&amp;nbsp;&amp;nbsp;a wise dev on my team pointed out that&amp;nbsp;the wix open source&amp;nbsp;announcement was followed almost immediately by &lt;A href="http://blogs.msdn.com/robmen/archive/2004/04/05/107709.aspx#107798"&gt;a&lt;/A&gt; &lt;A href="http://www.gotdotnet.com/team/dbox/default.aspx?month=2004-04"&gt;few&lt;/A&gt; &lt;A href="http://blogs.msdn.com/robmen/archive/2004/04/05/107709.aspx#107837"&gt;requests&lt;/A&gt; for msbuild tasks which wrapped the core wix tools.&amp;nbsp; so on my backburner for the past month has been figuring out how to make sure this happens.&amp;nbsp; i started by reading a little more about wix and thinking about how it should fit into the build process, and finally before typing any code decided to ask&amp;nbsp;if anyone else at microsoft had endeavored to create such tasks.&amp;nbsp; i was silly to ask &amp;#8220;if&amp;#8221; rather than &amp;#8220;who&amp;#8221; because within about twenty minutes i'd learned that one of our top dogfooders (in another state no less) had already authored working versions of the tasks!&amp;nbsp; so we're going to work with the wix guys to make sure these useful tasks see the light of day outside microsoft too...&lt;/P&gt;
&lt;P&gt;in other task development news, i recently stumbled across some&amp;nbsp;frustrating fusion loading issues, presented to me in the concise, if not elegant, form of &lt;A href="http://blogs.msdn.com/suzcook/archive/2003/05/29/57120.aspx"&gt;HRESULT 0x80131040&lt;/A&gt;.&amp;nbsp; i haven't quite tracked down exactly what the problem is but i'm certainly having fun trying.&lt;/P&gt;
&lt;P&gt;have&amp;nbsp;a good memorial day weekend.&amp;nbsp; i'll be watching &lt;A href="http://us.imdb.com/title/tt0139776/"&gt;&amp;#8220;fishing with john&amp;#8220;&lt;/A&gt; and a couple of &lt;A href="http://us.imdb.com/title/tt0059578/"&gt;sergio leone/clint eastwood&lt;/A&gt; &lt;A href="http://us.imdb.com/title/tt0060196/"&gt;westerns&lt;/A&gt;...&lt;/P&gt;
&lt;P&gt;jeff.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=144131" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffcal/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>today on dr. phil:  resolving conflict among dependencies</title><link>http://blogs.msdn.com/jeffcal/archive/2004/05/11/130064.aspx</link><pubDate>Tue, 11 May 2004 21:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:130064</guid><dc:creator>jeffcal</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/jeffcal/comments/130064.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffcal/commentrss.aspx?PostID=130064</wfw:commentRss><description>&lt;P&gt;Since joining the MSBuild team, I've learned more than I ever thought imaginable about .NET references and dependencies, largely because&amp;nbsp;I'm responsible for testing the ResolveAssemblyReference task we'll be shipping as part of our task library.&amp;nbsp;&amp;nbsp;Between my testing of that&amp;nbsp;task and the&amp;nbsp;patient guidance of one of our&amp;nbsp;developers, I've learned about many of the intricate details of reference resolution.&amp;nbsp; It's amazing to me how much this thing can do, and how many scenarios rely on this little (ok, well, not so little) task in one way or another.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;One&amp;nbsp;cool new feature in Whidbey is&amp;nbsp;at build time the ResolveAssemblyReference task can automatically choose the latest versions of your references and dependencies.&amp;nbsp; So if&amp;nbsp;I have some cool MusicWidget in my app which depends on Version 1.0 of&amp;nbsp;WidgetBackend.dll&amp;nbsp;but&amp;nbsp;my MovieWidget depends on Version 2.0 of WidgetBackend.dll, the ResolveAssemblyReference&amp;nbsp;task&amp;nbsp;can ensure&amp;nbsp;my app is compiled with Version 2.0.&amp;nbsp; In most cases, when the owners of WidgetBackend.dll are playing nicely and maintaining backwards compatibility, this is exactly&amp;nbsp;what I'd want, but&amp;nbsp;I'd rather not have to worry about the details of which versions of support files my widgets are using.&amp;nbsp; &lt;EM&gt;I just want to use my widgets!&lt;/EM&gt;&amp;nbsp; Of course, there will still be cases when for one reason or another I'm not prepared to migrate to Version 2.0, and I'll be able to direct the ResolveAssemblyReference task to still use the old version if so.&lt;/P&gt;
&lt;P&gt;Similarly, 99.99% of apps written against version 1.1 of the .NET Framework will depend on some Framework assembly such as System.dll or System.Data.dll.&amp;nbsp; When you install the Whidbey .NET Framework and rebuild your apps, the ResolveAssemblyReference task will see your Whidbey .NET Framework and pick those versions of System.dll and System.Data.dll for the compiler to use.&amp;nbsp; And you won't even have to so much as browse to&amp;nbsp;a file on disk.&amp;nbsp; Of course the same provision applies here for those who aren't ready to move all of their dependencies to Whidbey:&amp;nbsp; you can just tell MSBuild to use the specific version you've been using all along.&lt;/P&gt;
&lt;P&gt;Hopefully the work we're doing in this area will give developers confidence in choosing the right solutions for their problems rather than worrying about what new problems may be introduced by their solutions...&lt;/P&gt;
&lt;P&gt;jeff.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=130064" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffcal/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>tasks in msbuild and nant</title><link>http://blogs.msdn.com/jeffcal/archive/2004/05/04/125872.aspx</link><pubDate>Tue, 04 May 2004 18:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:125872</guid><dc:creator>jeffcal</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/jeffcal/comments/125872.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffcal/commentrss.aspx?PostID=125872</wfw:commentRss><description>&lt;P&gt;this weekend, &lt;A href="http://www.neward.net/ted/weblog/index.jsp?date=20040501#1083397805317"&gt;ted neward wrote some dispirited comments&lt;/A&gt; about microsoft's decision to release msbuild&amp;nbsp;in light of&amp;nbsp;nant's community acceptance.&amp;nbsp; now his point is larger than just the decision to release msbuild, and &lt;A href="http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=e44cbb53-0976-4630-9a08-96e862915615"&gt;dare has&amp;nbsp;commented on the larger issue here&lt;/A&gt;.&amp;nbsp; but the&amp;nbsp;quandary he describes is sure to be a common one faced by many nant users.&amp;nbsp; specifically, he writes:&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;So if I need a custom build task to do ASP.NET deployment, do I build a NAnt task knowing its lifetime is probably scoped to this Whidbey beta cycle? Or do I build a MSBuild task knowing that it'll probably be two years before it's really useful, and that it's entirely likely that I'll have to rewrite it at least once or twice in the meantime?&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;i expect task authors to ask exactly these questions and frankly i think it's in the interest of both nant and msbuild to make sure we're providing solid answers.&amp;nbsp; but i thought to myself:&amp;nbsp;&amp;nbsp;&amp;#8220;there's a way to resolve this easily:&amp;nbsp; write a task that works in nant &lt;EM&gt;and&lt;/EM&gt; msbuild.&amp;#8221;&amp;nbsp; the idea isn't far fetched, as the interfaces are quite similar.&amp;nbsp; to my surprise, i found &lt;A href="http://www.mail-archive.com/nant-developers%40lists.sourceforge.net/msg02676.html"&gt;john lam already did this for an ftp task&lt;/A&gt;&amp;nbsp;and noted the following:&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P dir=ltr&gt;[N]Ant tasks can easily port to MSBuild and vice-versa. Today I just built an FTP task that works in both MSBuild and NAnt.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;to be sure, there is a bit of maintenance involved in supporting both the nant and msbuild interfaces, but&amp;nbsp;in general this should work without too much effort.&amp;nbsp; have any others out there tried this?&amp;nbsp; are you interested in seeing me write a task that works in both nant and msbuild?&lt;/P&gt;
&lt;P dir=ltr&gt;jeff.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=125872" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffcal/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>writing a build logger: all the news fit to print</title><link>http://blogs.msdn.com/jeffcal/archive/2004/04/27/121469.aspx</link><pubDate>Tue, 27 Apr 2004 21:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:121469</guid><dc:creator>jeffcal</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/jeffcal/comments/121469.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffcal/commentrss.aspx?PostID=121469</wfw:commentRss><description>&lt;P&gt;We have an internal discussion list for users of MSBuild to share their thoughts and experiences with each other and bring questions they have about MSBuild.&amp;nbsp; Last week, one of our internal users wrote the list to talk about some performance issues he was noticing as his build projects grew larger and larger, but he needed to extract timing info for the build in order to drill down on the problem.&amp;nbsp; MSBuild won't give you this for free, but it offers an even better solution:&amp;nbsp; loggers.&amp;nbsp; By writing a custom logger, which is really just a .NET class&amp;nbsp;implementing&amp;nbsp;a public MSBuild interface, users can receive the events they're interested in receiving and record them in the ways they're interested in viewing them.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;So I set out to write a logger which computes and records timing info for each segment of the build.&amp;nbsp; I pasted the outcome of this effort below.&amp;nbsp; Essentially I started off maintaining an open xml document and writing the data to the file as it became available (i.e., when the MSBuild engine fired a StatusEvent).&amp;nbsp; This was quite efficient but the logs were just flat out ugly&amp;nbsp;because every single &amp;#8220;build&amp;#8220; element had to have a child &amp;#8220;time&amp;#8220; element.&amp;nbsp; So&amp;nbsp;at the expense of my RAM,&amp;nbsp;I cached all of the events for the entire build and&amp;nbsp;processed the&amp;nbsp;data once the build was complete.&amp;nbsp; Here's what I came up with:&lt;/P&gt;
&lt;P&gt;&lt;CODE&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;FONT size=2&gt; System;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;FONT size=2&gt; System.Xml;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;FONT size=2&gt; System.Collections;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;FONT size=2&gt; Microsoft.Build.Framework;&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#0000ff size=2&gt;namespace&lt;/FONT&gt; &lt;FONT size=2&gt;BuildTimer&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; This logger computes and records the timing info for each interesting segment &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; of the build, i.e., the time spent in each task, target, and project along &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; with the total time for the entire build.&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;class&lt;/FONT&gt;&lt;FONT size=2&gt; BuildTimer : ILogger &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;private&lt;/FONT&gt;&lt;FONT size=2&gt; Queue events; &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;//where we cache all of the events&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt; parameters; &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;//storage for Parameters property&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;private&lt;/FONT&gt;&lt;FONT size=2&gt; LoggerVerbosity verbosity; &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;//storage for Verbosity property&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; From ILogger. This value is specified on the command line along with the logger spec. &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; Should be a valid path to a writable location or the logger will throw during Shutdown() &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; when it tries to write the XML log.&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;value&amp;gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;The value the engine provided from the logger's command line spec.&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/value&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt; Parameters &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;set&lt;/FONT&gt;&lt;FONT size=2&gt; { parameters = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;value&lt;/FONT&gt;&lt;FONT size=2&gt;; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;get&lt;/FONT&gt;&lt;FONT size=2&gt; { &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;FONT size=2&gt; parameters; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; From ILogger. This value is either specified on the command line, or the engine will &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; set it to the default value LoggerVerbosity.Normal. All loggers receive the same value &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; for a particular build and it is their choice/responsibility to use Verbosity as they &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; see fit. In particular, the set of events a logger receives from the engine is the &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; same no matter what Verbosity is specified.&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;value&amp;gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;The value specified on the command line, or the default if none was specified.&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/value&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; LoggerVerbosity Verbosity &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;set&lt;/FONT&gt;&lt;FONT size=2&gt; { verbosity = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;value&lt;/FONT&gt;&lt;FONT size=2&gt;; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;get&lt;/FONT&gt;&lt;FONT size=2&gt; { &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;FONT size=2&gt; verbosity; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; From ILogger. This method is called by the engine before any events are fired &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; so the logger can register for events it's interested in. In our case, we're &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; only interested in StatusEvents.&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;param name="eventSource"&amp;gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;IEventSource provided by the engine for event registration.&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/param&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; Initialize(IEventSource eventSource) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; events = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; Queue(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eventSource.StatusEvent += &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; BuildEventHandler(StatusHandler); &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;//register for StatusEvents&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; From ILogger. This method is called by the engine once all events have been fired. &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; The logger should perform any final work here. We create an Xml file and log all &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; event info including times to the file.&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; Shutdown() &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlTextWriter log = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; XmlTextWriter(Parameters, System.Text.Encoding.Unicode); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.Formatting = Formatting.Indented; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.IndentChar = '\t'; &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Stack timingInfo = ComputeTimingInfo(); &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;//contains one BuildInterval per Started/Finished pair&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;while&lt;/FONT&gt;&lt;FONT size=2&gt; (events.Count &amp;gt; 0) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BuildStatusEventArgs statusEvent = (BuildStatusEventArgs)events.Dequeue(); &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;if&lt;/FONT&gt;&lt;FONT size=2&gt; (!IsStartedStage(statusEvent.Stage)) &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;//finish event - close the element and carry on&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.WriteEndElement(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;continue&lt;/FONT&gt;&lt;FONT size=2&gt;; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.WriteStartElement(GetStageElementName(statusEvent.Stage)); &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;if&lt;/FONT&gt;&lt;FONT size=2&gt; (statusEvent.Stage != BuildStage.BuildStarted) &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;//StageName is blank for BuildStarted&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.WriteAttributeString("Name", statusEvent.StageName); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;&lt;/CODE&gt;&lt;CODE&gt;&lt;FONT size=2&gt;&amp;nbsp; &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BuildInterval interval = (BuildInterval) timingInfo.Pop(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.WriteAttributeString("Time", (interval.Finish - interval.Start).ToString()); &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;if&lt;/FONT&gt;&lt;FONT size=2&gt; (Verbosity == LoggerVerbosity.Detailed || Verbosity == LoggerVerbosity.Diagnostic) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.WriteAttributeString("Message", statusEvent.Message); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.WriteAttributeString("Start", interval.Start.ToString()); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.WriteAttributeString("Finish", interval.Finish.ToString()); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.Close(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; The registered BuildEventHandler which will receive all StatusEvents&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; from the engine. We simply cache the event and save the work for&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; Shutdown() when we know we've received all events.&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;param name="sender"&amp;gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;Ignored.&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/param&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;param name="args"&amp;gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;BuildStatusEventArgs object we cache for later use.&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/param&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; StatusHandler(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;object&lt;/FONT&gt;&lt;FONT size=2&gt; sender, BuildEventArgs args) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; events.Enqueue(args); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; Walks the event cache and populates a stack with BuildIntervals for each&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; Started/Finished pair of StatusEvents.&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;private&lt;/FONT&gt;&lt;FONT size=2&gt; Stack ComputeTimingInfo() &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Stack remaining = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; Stack(events); &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;//the constructor effectively reverses the order we'll see events&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Stack finishedEvents = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; Stack(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Stack timingInfo = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; Stack(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;while&lt;/FONT&gt;&lt;FONT size=2&gt; (remaining.Count &amp;gt; 0) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BuildStatusEventArgs currentEvent = (BuildStatusEventArgs) remaining.Pop(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;if&lt;/FONT&gt;&lt;FONT size=2&gt; (IsStartedStage(currentEvent.Stage)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BuildInterval interval = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; BuildInterval(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; interval.Start = currentEvent.TimeStamp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; interval.Finish = ((BuildStatusEventArgs)finishedEvents.Pop()).TimeStamp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; timingInfo.Push(interval); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;else&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finishedEvents.Push(currentEvent); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;FONT size=2&gt; timingInfo; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; Simple test to see if a particular BuildStage was one of the "Started" stages.&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;param name="stage"&amp;gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;The stage to be checked.&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/param&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;bool&lt;/FONT&gt;&lt;FONT size=2&gt; IsStartedStage(BuildStage stage) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;FONT size=2&gt; ((stage == BuildStage.TaskStarted) || &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (stage == BuildStage.TargetStarted) || &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (stage == BuildStage.ProjectStarted) || &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (stage == BuildStage.BuildStarted)); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; This exists purely for performance, to avoid repeated calls of the form&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; stage.ToString().Replace("Started", "")&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;param name="stage"&amp;gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;The stage we're getting the element name for.&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/param&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt; GetStageElementName(BuildStage stage) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt; name = String.Empty; &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;switch&lt;/FONT&gt;&lt;FONT size=2&gt; (stage) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;case&lt;/FONT&gt;&lt;FONT size=2&gt; BuildStage.TaskStarted: &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name = "Task"; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;break&lt;/FONT&gt;&lt;FONT size=2&gt;; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;case&lt;/FONT&gt;&lt;FONT size=2&gt; BuildStage.TargetStarted: &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name = "Target"; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;break&lt;/FONT&gt;&lt;FONT size=2&gt;; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;case&lt;/FONT&gt;&lt;FONT size=2&gt; BuildStage.ProjectStarted: &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name = "Project"; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;break&lt;/FONT&gt;&lt;FONT size=2&gt;; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;case&lt;/FONT&gt;&lt;FONT size=2&gt; BuildStage.BuildStarted: &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name = "Build"; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;break&lt;/FONT&gt;&lt;FONT size=2&gt;; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;FONT size=2&gt; name; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; Use this to conveniently pair the timing info for a Started/Finished event pair&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; so we can later output it to the log.&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&amp;lt;/summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;internal&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;struct&lt;/FONT&gt;&lt;FONT size=2&gt; BuildInterval &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; DateTime Start; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; DateTime Finish; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;}&lt;/FONT&gt;&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;I like the output of this logger much better now even if it chews up memory on order of the number of status events (I've always been a sucker for form over function).&amp;nbsp; With a sufficiently large project, it'd probably be necessary to go back to the uglier logs or risk the logger becoming its own bottleneck in the build's perf.&amp;nbsp; Finally, here's an example of the logger's output when logging a build of itself with default verbosity:&lt;/P&gt;
&lt;P&gt;&lt;CODE&gt;&amp;lt;Build Time="00:00:00.7030980"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Project Name="C:\playground\BuildTimer\BuildTimer\BuildTimer.csproj" Time="00:00:00.7030980"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="BuildOnlySettings" Time="00:00:00.0312488"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="CreateProperty" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Target&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="GetFrameworkPaths" Time="00:00:00"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="GetFrameworkPath" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="GetFrameworkSDKPath" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Target&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="AssignTargetPaths" Time="00:00:00.0156244"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="AssignTargetPath" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="AssignTargetPath" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="AssignTargetPath" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="AssignTargetPath" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="AssignTargetPath" Time="00:00:00.0156244" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Target&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="PrepareForBuild" Time="00:00:00"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="MakeDir" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Target&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="ResolveAssemblyReferences" Time="00:00:00.2968636"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="CreateProperty" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="ResolveAssemblyReference" Time="00:00:00.2812392" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Target&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="ResolveReferences" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="SplitResourcesByCulture" Time="00:00:00.0156244"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="AssignCulture" Time="00:00:00.0156244" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="CreateItem" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="CreateItem" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Target&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="PrepareResourceNames" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="PrepareResources" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="Compile" Time="00:00:00.2812392"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="Csc" Time="00:00:00.2812392" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Target&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="BuildManifests" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="CopyCopyLocalFilesToOutputDirectory" Time="00:00:00"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="Copy" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Target&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="CreateCopyToOutputDirectoryItems" Time="00:00:00.0156244" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="CopyCopyToOutputDirectoryFiles" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="CopyFilesToOutputDirectory" Time="00:00:00.0156244"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="Copy" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="Copy" Time="00:00:00.0156244" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="Copy" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="Copy" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="Copy" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Task Name="Copy" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Target&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="PrepareForRun" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="CoreBuild" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="PostBuildOnSuccess" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="CoreBuildSucceeded" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Target Name="Build" Time="00:00:00" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Project&amp;gt;&lt;BR&gt;&amp;lt;/Build&amp;gt;&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;With a command line switch, I can increase the verbosity to include the Message, Start time, and Finish time for each build segment.&lt;/P&gt;
&lt;P&gt;jeff.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=121469" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffcal/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>the meanderings of an msbuild tester</title><link>http://blogs.msdn.com/jeffcal/archive/2004/04/22/118361.aspx</link><pubDate>Thu, 22 Apr 2004 18:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:118361</guid><dc:creator>jeffcal</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jeffcal/comments/118361.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jeffcal/commentrss.aspx?PostID=118361</wfw:commentRss><description>&lt;P&gt;hola.&amp;nbsp; and welcome to my flashy new blog.&amp;nbsp; my name's jeff callahan and i test microsoft's new build system, msbuild.&amp;nbsp; i've been a full time tester for msbuild almost a year now, but during various breaks from college i also worked as an intern or contractor on projects&amp;nbsp;under visual basic, exchange server, and visual c++.&amp;nbsp; but none of those experiences were nearly as cool as my stint on msbuild has been thus far.&lt;/P&gt;
&lt;P&gt;why is that?&amp;nbsp; we're working on an exciting project that i think customers are really going to like.&amp;nbsp; i'm helping ship the first version of a product and i get to&amp;nbsp;see the important decisions we must make to get it right &lt;EM&gt;and&lt;/EM&gt; out the door.&amp;nbsp; but most importantly i work with a group of really smart folks who teach me things every day.&lt;/P&gt;
&lt;P&gt;so hopefully i can give a bit of insight into how this&amp;nbsp;project msbuild works, what sort of hard decisions we're making to get&amp;nbsp;it shipped, and what cool things i'm learning from the people i work with.&lt;/P&gt;
&lt;P&gt;make yourself at home, and don't hesitate to speak up.&lt;/P&gt;
&lt;P&gt;jeffcal.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=118361" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jeffcal/archive/tags/MSBuild/default.aspx">MSBuild</category></item></channel></rss>