<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Sayed Ibrahim Hashimi - MSBuild, Web Deploy (MSDeploy), ASP.NET - msbuild</title>
    <link>http://sedodream.com/</link>
    <description>MSBuild, C#, Visual Studio and more</description>
    <language>en-us</language>
    <copyright>Sayed Ibrahim Hashimi</copyright>
    <lastBuildDate>Thu, 09 May 2013 05:33:20 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>sayed.hashimi@gmail.com</managingEditor>
    <webMaster>sayed.hashimi@gmail.com</webMaster>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=19245c5f-8119-45bf-be6e-acc60ea53ed8</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,19245c5f-8119-45bf-be6e-acc60ea53ed8.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,19245c5f-8119-45bf-be6e-acc60ea53ed8.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=19245c5f-8119-45bf-be6e-acc60ea53ed8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I’m happy to say that my <a href="http://www.amazon.com/gp/product/0735678162/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0735678162&amp;linkCode=as2&amp;tag=sedodream-20">Supplement
to Inside the Microsoft Build Engine</a> book (<em>co-author </em><a href="https://twitter.com/wbarthol"><em>William
Bartholomew</em></a>) has now been published. In fact it’s already in stock and ready
to be shipped by <a href="http://www.amazon.com/gp/product/0735678162/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0735678162&amp;linkCode=as2&amp;tag=sedodream-20">Amazon.com</a>. 
</p>
        <p>
This book is a small addition (<em>118 pages</em>) to the previous book, <a href="http://www.amazon.com/gp/product/0735645248/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0735645248&amp;linkCode=as2&amp;tag=sedodream-20">Inside
the Microsoft Build Engine 2nd edition</a>. It has a small price too, MSRP is $12.99
but it’s selling on Amazon.com for $8.99! In this book we cover the updates to MSBuild,
Team Build and Web Publishing in Visual Studio 2012. The foreword was written by <a href="http://www.hanselman.com/">Scott
Hanselman</a>, and you can <a href="http://blogs.msdn.com/b/microsoft_press/archive/2013/05/02/scott-hanselman-ah-the-thankless-life-of-the-build-master.aspx">read
the entire foreword online</a>. 
</p>
        <p>
Check out how thin the supplement is in comparison to the 2<sup>nd</sup> edition <em>#ThinIsIn</em>.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/Book-publ_137D2/945231_10103483509401051_968543011_n_2.jpg">
            <img title="945231_10103483509401051_968543011_n" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="945231_10103483509401051_968543011_n" src="http://sedodream.com/content/binary/Windows-Live-Writer/Book-publ_137D2/945231_10103483509401051_968543011_n_thumb.jpg" width="274" height="484" />
          </a>
        </p>
        <p>
 
</p>
        <p>
If you already own the 2<sup>nd</sup> edition then you’ll love this update.
</p>
        <p>
 
</p>
        <h3>Table of Contents
</h3>
        <p>
Chapter 1: What's new in MSBuild
</p>
        <ol>
          <li>
Visual Studio project compatibility between 2010 and 2012 
</li>
          <li>
Out of Process Tasks 
</li>
          <li>
NuGet 
</li>
          <li>
XML Updates with SlowCheetah 
</li>
          <li>
Cookbook</li>
        </ol>
        <h5>Chapter 2: What's new in Team Build 2012
</h5>
        <ol>
          <li>
Installation 
</li>
          <li>
Team Foundation Service 
</li>
          <li>
User interface (UI) enhancements 
</li>
          <li>
Visual Studio Test Runner 
</li>
          <li>
Pausing build definitions 
</li>
          <li>
Batching 
</li>
          <li>
Logging 
</li>
          <li>
Windows Workflow Foundation 4.5 
</li>
          <li>
Cookbook</li>
        </ol>
        <h5>Chapter 3: What's new in Web Publishing
</h5>
        <ol>
          <li>
Overview of the new Publish Web Dialog 
</li>
          <li>
Building web packages 
</li>
          <li>
Publish profiles 
</li>
          <li>
Database publishing support 
</li>
          <li>
Profile-specific web.config transforms 
</li>
          <li>
Cookbook</li>
        </ol>
        <p>
 
</p>
        <p>
The book has been available in e-book form for a few weeks. Just long enough for us
to get our first review. It was 5 stars :).
</p>
        <p>
          <a href="http://www.amazon.com/review/RVXCZ4FAXMVE5/?_encoding=UTF8&amp;ASIN=B00CDXOWJW&amp;camp=1789&amp;creative=390957&amp;linkCode=ur2&amp;nodeID=&amp;tag=sedodream-20">
            <img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/Book-publ_137D2/image_3.png" width="644" height="254" />
          </a>
        </p>
        <p>
 
</p>
        <p>
Please let us know what you think of this book! 
</p>
        <p>
 
</p>
        <p>
You can download all the samples and learn more at <a href="http://msbuildbook.com/">msbuildbook.com</a>.
</p>
        <p>
 
</p>
        <p>
Sayed Ibrahim Hashimi | <a href="http://msbuildbook.com">http://msbuildbook.com</a> | <a href="https://twitter.com/sayedihashimi">@SayedIHashimi</a></p>
      </body>
      <title>Book published and now in stock!</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,19245c5f-8119-45bf-be6e-acc60ea53ed8.aspx</guid>
      <link>http://sedodream.com/2013/05/09/BookPublishedAndNowInStock.aspx</link>
      <pubDate>Thu, 09 May 2013 05:33:20 GMT</pubDate>
      <description>&lt;p&gt;
I’m happy to say that my &lt;a href="http://www.amazon.com/gp/product/0735678162/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735678162&amp;amp;linkCode=as2&amp;amp;tag=sedodream-20"&gt;Supplement
to Inside the Microsoft Build Engine&lt;/a&gt; book (&lt;em&gt;co-author &lt;/em&gt;&lt;a href="https://twitter.com/wbarthol"&gt;&lt;em&gt;William
Bartholomew&lt;/em&gt;&lt;/a&gt;) has now been published. In fact it’s already in stock and ready
to be shipped by &lt;a href="http://www.amazon.com/gp/product/0735678162/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735678162&amp;amp;linkCode=as2&amp;amp;tag=sedodream-20"&gt;Amazon.com&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
This book is a small addition (&lt;em&gt;118 pages&lt;/em&gt;) to the previous book, &lt;a href="http://www.amazon.com/gp/product/0735645248/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735645248&amp;amp;linkCode=as2&amp;amp;tag=sedodream-20"&gt;Inside
the Microsoft Build Engine 2nd edition&lt;/a&gt;. It has a small price too, MSRP is $12.99
but it’s selling on Amazon.com for $8.99! In this book we cover the updates to MSBuild,
Team Build and Web Publishing in Visual Studio 2012. The foreword was written by &lt;a href="http://www.hanselman.com/"&gt;Scott
Hanselman&lt;/a&gt;, and you can &lt;a href="http://blogs.msdn.com/b/microsoft_press/archive/2013/05/02/scott-hanselman-ah-the-thankless-life-of-the-build-master.aspx"&gt;read
the entire foreword online&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Check out how thin the supplement is in comparison to the 2&lt;sup&gt;nd&lt;/sup&gt; edition &lt;em&gt;#ThinIsIn&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/Book-publ_137D2/945231_10103483509401051_968543011_n_2.jpg"&gt;&lt;img title="945231_10103483509401051_968543011_n" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="945231_10103483509401051_968543011_n" src="http://sedodream.com/content/binary/Windows-Live-Writer/Book-publ_137D2/945231_10103483509401051_968543011_n_thumb.jpg" width="274" height="484"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
If you already own the 2&lt;sup&gt;nd&lt;/sup&gt; edition then you’ll love this update.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h3&gt;Table of Contents
&lt;/h3&gt;
&lt;p&gt;
Chapter 1: What's new in MSBuild
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Visual Studio project compatibility between 2010 and 2012 
&lt;li&gt;
Out of Process Tasks 
&lt;li&gt;
NuGet 
&lt;li&gt;
XML Updates with SlowCheetah 
&lt;li&gt;
Cookbook&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Chapter 2: What's new in Team Build 2012
&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
Installation 
&lt;li&gt;
Team Foundation Service 
&lt;li&gt;
User interface (UI) enhancements 
&lt;li&gt;
Visual Studio Test Runner 
&lt;li&gt;
Pausing build definitions 
&lt;li&gt;
Batching 
&lt;li&gt;
Logging 
&lt;li&gt;
Windows Workflow Foundation 4.5 
&lt;li&gt;
Cookbook&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Chapter 3: What's new in Web Publishing
&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
Overview of the new Publish Web Dialog 
&lt;li&gt;
Building web packages 
&lt;li&gt;
Publish profiles 
&lt;li&gt;
Database publishing support 
&lt;li&gt;
Profile-specific web.config transforms 
&lt;li&gt;
Cookbook&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
The book has been available in e-book form for a few weeks. Just long enough for us
to get our first review. It was 5 stars :).
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.amazon.com/review/RVXCZ4FAXMVE5/?_encoding=UTF8&amp;amp;ASIN=B00CDXOWJW&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;linkCode=ur2&amp;amp;nodeID=&amp;amp;tag=sedodream-20"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/Book-publ_137D2/image_3.png" width="644" height="254"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Please let us know what you think of this book! 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
You can download all the samples and learn more at &lt;a href="http://msbuildbook.com/"&gt;msbuildbook.com&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | &lt;a href="http://msbuildbook.com"&gt;http://msbuildbook.com&lt;/a&gt; | &lt;a href="https://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,19245c5f-8119-45bf-be6e-acc60ea53ed8.aspx</comments>
      <category>MSBuild</category>
      <category>MSDeploy</category>
      <category>Team Build</category>
      <category>web</category>
      <category>Web Publishing Pipeline</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=25443824-c7ea-4164-892a-386c7b39ddaf</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,25443824-c7ea-4164-892a-386c7b39ddaf.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,25443824-c7ea-4164-892a-386c7b39ddaf.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=25443824-c7ea-4164-892a-386c7b39ddaf</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today I saw <a href="http://stackoverflow.com/q/14762167/105999" target="_blank">a
question on StackOverflow</a> asking about the difference between DependsOnTargets
and BeforeTargets/AfterTargets. Below is my response.
</p>
        <p>
In my <a href="http://msbuildbook.com/">MSBuild Book</a> I have a section based on
how to create reusable elements in MSBuild, if you are interested. I'll give some
comments here as well though. This content is different from what the book has.
</p>
        <p>
When creating MSBuild files you should be careful to isolate <strong>what</strong> versus <strong>how</strong>.
To explain that a bit, lets examine how the managed VS projects work out of the box
(<em>which is a great model for reusable elements</em>).
</p>
        <p>
When you create a C#/VB project you get a .csproj file, this .csproj file primarily
contains Properties and Items. You will not find a single target in that file. These
files contains <strong>what</strong> will get built (along with some settings relating
to the build). At the bottom of the project file you will find an import statement.
This import bring in <strong>How</strong> the project is built.
</p>
        <p>
The files which are imported include:
</p>
        <ul>
          <li>
Microsoft.CSharp/VisualBasic/FSharp.targets</li>
          <li>
Microsoft.common.targets</li>
        </ul>
        <p>
In this case Microsoft.common.targets defines the overall build process for all the
managed languages. Then Microsoft.CSharp.targets (<em>or one of the other lang specific
.targets file</em>) fills in the blanks of how to invoke the specific language specific
tools.
</p>
        <h4>DependsOnTargets versus Before/AfterTargets
</h4>
        <p>
In your answer above you state "<em>I recommend to avoid DependsOnTargets unless
it is really really necessary, for instance if two</em>". I disagree with this.
Here is my take on DependsOnTargets versus Before/AfterTargets.
</p>
        <p>
          <strong>Use DependsOnTargets when</strong>
        </p>
        <ul>
          <li>
When you are trying to create a workflow of targets to be executed 
</li>
          <li>
When a target will not function without the other target(s) executing first 
</li>
          <li>
When you need to inject different targets at specific steps based on the desired operation</li>
        </ul>
        <p>
          <strong>Use Before/AfterTargets when</strong>
        </p>
        <ul>
        </ul>
        <ul>
          <li>
When you don't own the file the target resides in and it has no DependsOnTargets property
that can be extended 
</li>
          <li>
You want a target to execute Before/After a specific target no matter when it gets
executed</li>
        </ul>
        <p>
To tease out the difference a bit consider web projects. For web projects there are
two workflows that the .csproj/.vbproj take care of: 1. Build 1. Publish
</p>
        <p>
If I want to add a target to the list of targets to be executed before the Build target
I can dynamically update the BuildDependsOn property for publish scenarios only. You
cannot do this with Before/AfterTargets.
</p>
        <p>
In an ideal world each target would have the following wrt DependsOnTargets.
</p>
        <ul>
          <li>
All targets have a DependsOnTargets attribute which is feed by a property 
</li>
          <li>
Each DependsOnTargets always prepends the existing value to the property definition</li>
        </ul>
        <p>
For example
</p>
        <pre class="brush: xml;">&lt;MyTargetDependsOn&gt;
    $(MyTargetDependsOn);
    Target1;
    Target2
&lt;/MyTargetDependsOn&gt;</pre>
        <p>
Unfortunately many targets do not follow this pattern, so DependsOnTargets is dead
in the water for many cases.
</p>
        <p>
When I am authoring MSBuild scripts <strong>I always use DependsOnTargets unless there
is a solid reason why I should chose to use Before/AfterTargets</strong>. I feel that
(<em>I have no insight on the real reasons to the design as I wasn't with Microsoft
at the time</em>) Before/AfterTargets was really created to allow users to inject
targets to be executed before/after a target which they did not own, and the creators
did not use the pattern above.
</p>
        <p>
 
</p>
        <p>
 
</p>
        <p>
dddd
</p>
      </body>
      <title>MSBuild: DependsOnTargets versus BeforeTargets, AfterTargets</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,25443824-c7ea-4164-892a-386c7b39ddaf.aspx</guid>
      <link>http://sedodream.com/2013/02/12/MSBuildDependsOnTargetsVersusBeforeTargetsAfterTargets.aspx</link>
      <pubDate>Tue, 12 Feb 2013 02:16:30 GMT</pubDate>
      <description>&lt;p&gt;
Today I saw &lt;a href="http://stackoverflow.com/q/14762167/105999" target="_blank"&gt;a
question on StackOverflow&lt;/a&gt; asking about the difference between DependsOnTargets
and BeforeTargets/AfterTargets. Below is my response.
&lt;/p&gt;
&lt;p&gt;
In my &lt;a href="http://msbuildbook.com/"&gt;MSBuild Book&lt;/a&gt; I have a section based on
how to create reusable elements in MSBuild, if you are interested. I'll give some
comments here as well though. This content is different from what the book has.
&lt;/p&gt;
&lt;p&gt;
When creating MSBuild files you should be careful to isolate &lt;strong&gt;what&lt;/strong&gt; versus &lt;strong&gt;how&lt;/strong&gt;.
To explain that a bit, lets examine how the managed VS projects work out of the box
(&lt;em&gt;which is a great model for reusable elements&lt;/em&gt;).
&lt;/p&gt;
&lt;p&gt;
When you create a C#/VB project you get a .csproj file, this .csproj file primarily
contains Properties and Items. You will not find a single target in that file. These
files contains &lt;strong&gt;what&lt;/strong&gt; will get built (along with some settings relating
to the build). At the bottom of the project file you will find an import statement.
This import bring in &lt;strong&gt;How&lt;/strong&gt; the project is built.
&lt;/p&gt;
&lt;p&gt;
The files which are imported include:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Microsoft.CSharp/VisualBasic/FSharp.targets&lt;/li&gt;
&lt;li&gt;
Microsoft.common.targets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
In this case Microsoft.common.targets defines the overall build process for all the
managed languages. Then Microsoft.CSharp.targets (&lt;em&gt;or one of the other lang specific
.targets file&lt;/em&gt;) fills in the blanks of how to invoke the specific language specific
tools.
&lt;/p&gt;
&lt;h4&gt;DependsOnTargets versus Before/AfterTargets
&lt;/h4&gt;
&lt;p&gt;
In your answer above you state &amp;quot;&lt;em&gt;I recommend to avoid DependsOnTargets unless
it is really really necessary, for instance if two&lt;/em&gt;&amp;quot;. I disagree with this.
Here is my take on DependsOnTargets versus Before/AfterTargets.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Use DependsOnTargets when&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
When you are trying to create a workflow of targets to be executed 
&lt;/li&gt;
&lt;li&gt;
When a target will not function without the other target(s) executing first 
&lt;/li&gt;
&lt;li&gt;
When you need to inject different targets at specific steps based on the desired operation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Use Before/AfterTargets when&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
When you don't own the file the target resides in and it has no DependsOnTargets property
that can be extended 
&lt;/li&gt;
&lt;li&gt;
You want a target to execute Before/After a specific target no matter when it gets
executed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
To tease out the difference a bit consider web projects. For web projects there are
two workflows that the .csproj/.vbproj take care of: 1. Build 1. Publish
&lt;/p&gt;
&lt;p&gt;
If I want to add a target to the list of targets to be executed before the Build target
I can dynamically update the BuildDependsOn property for publish scenarios only. You
cannot do this with Before/AfterTargets.
&lt;/p&gt;
&lt;p&gt;
In an ideal world each target would have the following wrt DependsOnTargets.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
All targets have a DependsOnTargets attribute which is feed by a property 
&lt;/li&gt;
&lt;li&gt;
Each DependsOnTargets always prepends the existing value to the property definition&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
For example
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;MyTargetDependsOn&amp;gt;
    $(MyTargetDependsOn);
    Target1;
    Target2
&amp;lt;/MyTargetDependsOn&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Unfortunately many targets do not follow this pattern, so DependsOnTargets is dead
in the water for many cases.
&lt;/p&gt;
&lt;p&gt;
When I am authoring MSBuild scripts &lt;strong&gt;I always use DependsOnTargets unless there
is a solid reason why I should chose to use Before/AfterTargets&lt;/strong&gt;. I feel that
(&lt;em&gt;I have no insight on the real reasons to the design as I wasn't with Microsoft
at the time&lt;/em&gt;) Before/AfterTargets was really created to allow users to inject
targets to be executed before/after a target which they did not own, and the creators
did not use the pattern above.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
dddd
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,25443824-c7ea-4164-892a-386c7b39ddaf.aspx</comments>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=0ead210a-209b-4f45-9fac-3c55162b2e53</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,0ead210a-209b-4f45-9fac-3c55162b2e53.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,0ead210a-209b-4f45-9fac-3c55162b2e53.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=0ead210a-209b-4f45-9fac-3c55162b2e53</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
With the release of VS2012 we have improved the command line publish experience. We’ve
also made all the web publish related features available for VS2010 users in the <a href="http://www.windowsazure.com/en-us/develop/net/">Azure
SDK</a>.
</p>
        <p>
The easies way to publish a project from the command line is to create a publish profile
in VS and then use that. To create a publish profile in Visual Studio right click
on the web project and select Publish. After that it will walk you though creating
a publish profile. VS Web publish profile support the following publish methods.
</p>
        <ul>
          <li>
            <strong>Web Deploy</strong> – The preferred method. You can publish to any host/server
which has <a href="http://www.iis.net/downloads/microsoft/web-deploy">Web Deploy</a> configured 
</li>
          <li>
            <strong>Web Deploy Package</strong>  - Used to create a package which can be
published offline at a later time 
</li>
          <li>
            <strong>File system</strong>  - Used to publish to a local/network folder 
</li>
          <li>
            <strong>FTP</strong>  - Used to publish to any FTP server 
</li>
          <li>
            <strong>FPSE</strong> – Used to publish to a server using Front Page Server Extensions</li>
        </ul>
        <p>
Command line publishing is only supported for Web Deploy, Web Deploy Package, and
File System. If you think we should support command line scenarios for other publish
methods the best thing to do would be to create a suggestion at <a title="http://aspnet.uservoice.com" href="http://aspnet.uservoice.com">http://aspnet.uservoice.com</a>.
If there is enough interest we may work on that support.
</p>
        <p>
Let’s first take a look at how you can publish a simple Web project from the command
line. I have created a simple Web Forms project and want to publish that. I’ve created
a profile named SayedProfile. In order to publish this project I will execute the
following command.
</p>
        <p>
msbuild MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=&lt;profile-name&gt;
/p:Password=&lt;insert-password&gt; /p:VisualStudioVersion=11.0
</p>
        <p>
In this command you can see that I have passed in these properties; 
</p>
        <ul>
          <li>
            <strong>DeployOnBuild</strong> – when true the build process will be extended to perform
a publish as well 
</li>
          <li>
            <strong>PublishProfile</strong>  - name of the publish profile (<em>you can also
provide a full path to a .pubxml file</em>) 
</li>
          <li>
            <strong>Password</strong> – Password value 
</li>
          <li>
            <strong>VisualStudioVersion</strong> – Special property see comments below</li>
        </ul>
        <p>
You may not have expected the VisualStudioVersion property here. This is a new property
which was introduced with VS 2012. It is related to how VS 2010 and VS 2012 are able
to share the same projects. Take a look at my previous blog post at <a title="http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx" href="http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx">http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx</a>. <strong><u>If
you are building the project file, instead of the solution file then you should always
set this property.</u></strong></p>
        <p>
If you are publishing using the .sln file you can omit the VisualStudioVersion property.
That property will be derived from the version of the solution file itself. Note that
there is one big difference when publishing using the project or solution file. When
you build an individual project the properties you pass in are given to that project
alone. When you build from the command line using the solution file, the properties
you have specified are passed to all the projects. So if you have multiple web projects
in the same solution it would attempt to publish each of the web projects.
</p>
        <p>
FYI in case you haven’t already heard I’m working on an update to my book. More info
at <a href="msbuildbook.com">msbuildbook.com</a></p>
        <p>
Sayed Ibrahim Hashimi | <a href="https://twitter.com/sayedihashimi">@SayedIHashimi</a></p>
      </body>
      <title>Command line web project publishing</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,0ead210a-209b-4f45-9fac-3c55162b2e53.aspx</guid>
      <link>http://sedodream.com/2013/01/06/CommandLineWebProjectPublishing.aspx</link>
      <pubDate>Sun, 06 Jan 2013 02:56:37 GMT</pubDate>
      <description>&lt;p&gt;
With the release of VS2012 we have improved the command line publish experience. We’ve
also made all the web publish related features available for VS2010 users in the &lt;a href="http://www.windowsazure.com/en-us/develop/net/"&gt;Azure
SDK&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
The easies way to publish a project from the command line is to create a publish profile
in VS and then use that. To create a publish profile in Visual Studio right click
on the web project and select Publish. After that it will walk you though creating
a publish profile. VS Web publish profile support the following publish methods.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web Deploy&lt;/strong&gt; – The preferred method. You can publish to any host/server
which has &lt;a href="http://www.iis.net/downloads/microsoft/web-deploy"&gt;Web Deploy&lt;/a&gt; configured 
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Deploy Package&lt;/strong&gt;&amp;#160; - Used to create a package which can be
published offline at a later time 
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File system&lt;/strong&gt;&amp;#160; - Used to publish to a local/network folder 
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FTP&lt;/strong&gt;&amp;#160; - Used to publish to any FTP server 
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FPSE&lt;/strong&gt; – Used to publish to a server using Front Page Server Extensions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Command line publishing is only supported for Web Deploy, Web Deploy Package, and
File System. If you think we should support command line scenarios for other publish
methods the best thing to do would be to create a suggestion at &lt;a title="http://aspnet.uservoice.com" href="http://aspnet.uservoice.com"&gt;http://aspnet.uservoice.com&lt;/a&gt;.
If there is enough interest we may work on that support.
&lt;/p&gt;
&lt;p&gt;
Let’s first take a look at how you can publish a simple Web project from the command
line. I have created a simple Web Forms project and want to publish that. I’ve created
a profile named SayedProfile. In order to publish this project I will execute the
following command.
&lt;/p&gt;
&lt;p&gt;
msbuild MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=&amp;lt;profile-name&amp;gt;
/p:Password=&amp;lt;insert-password&amp;gt; /p:VisualStudioVersion=11.0
&lt;/p&gt;
&lt;p&gt;
In this command you can see that I have passed in these properties; 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DeployOnBuild&lt;/strong&gt; – when true the build process will be extended to perform
a publish as well 
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PublishProfile&lt;/strong&gt;&amp;#160; - name of the publish profile (&lt;em&gt;you can also
provide a full path to a .pubxml file&lt;/em&gt;) 
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password&lt;/strong&gt; – Password value 
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VisualStudioVersion&lt;/strong&gt; – Special property see comments below&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
You may not have expected the VisualStudioVersion property here. This is a new property
which was introduced with VS 2012. It is related to how VS 2010 and VS 2012 are able
to share the same projects. Take a look at my previous blog post at &lt;a title="http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx" href="http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx"&gt;http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx&lt;/a&gt;. &lt;strong&gt;&lt;u&gt;If
you are building the project file, instead of the solution file then you should always
set this property.&lt;/u&gt;&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
If you are publishing using the .sln file you can omit the VisualStudioVersion property.
That property will be derived from the version of the solution file itself. Note that
there is one big difference when publishing using the project or solution file. When
you build an individual project the properties you pass in are given to that project
alone. When you build from the command line using the solution file, the properties
you have specified are passed to all the projects. So if you have multiple web projects
in the same solution it would attempt to publish each of the web projects.
&lt;/p&gt;
&lt;p&gt;
FYI in case you haven’t already heard I’m working on an update to my book. More info
at &lt;a href="msbuildbook.com"&gt;msbuildbook.com&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | &lt;a href="https://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,0ead210a-209b-4f45-9fac-3c55162b2e53.aspx</comments>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
      <category>MSDeploy</category>
      <category>web</category>
      <category>Web Deployment Tool</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=ca9825b2-a384-4d68-9413-e774948bbd58</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,ca9825b2-a384-4d68-9413-e774948bbd58.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,ca9825b2-a384-4d68-9413-e774948bbd58.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=ca9825b2-a384-4d68-9413-e774948bbd58</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
When you are building a .sln file or a .csproj/.vbproj/etc you need to be careful
how you set the Configuration property. Once this property is set you do not want
to change the value of it. Because of this it is best to specify this as a global
property. To do that you can pass it in on the command line. If you are using the <a href="http://msdn.microsoft.com/en-us/library/z7f65y0d.aspx" target="_blank">MSBuild
task</a> then you can pass it in via Properties or AdditionalProperties. <strong>What
you do not want to do is to set this value inside your .csproj/.vbproj or any imported
file.</strong> The only time when this is OK if there is a condition which will not
set the property if it’s already been set. This is exactly how the default .csproj/.vbproj
files are authored:
</p>
        <pre class="brush: xml;">&lt;Configuration Condition=" '$(Configuration)' == '' "&gt;Debug&lt;/Configuration&gt;</pre>
        <p>
If you do set this property w/o the conditional not to overwrite an existing value
you may experience really strange behavior during your builds. And it may be difficult
to diagnose the issue as well.
</p>
        <p>
Now let me explain why you cannot do this. When you build a .csproj/.vbproj MSBuild
will start creating an in-memory representation of the entire project. It will start
with the .csproj/.vbproj file itself. It will read the file from top to bottom. When
a property is encountered it is evaluated. If a property is encountered that relies
on another one, for example
</p>
        <pre class="brush: xml;">&lt;IntermediateOutputPath Condition=" '$(PlatformName)' == 'AnyCPU' "&gt;$(BaseIntermediateOutputPath)$(Configuration)\&lt;/IntermediateOutputPath&gt;</pre>
        <p>
The properties inside the expression will be evaluated on whatever values exist for
the properties at the time. In this case ItermediateOutputPath will be the value of
BaseIntermediateOutputPath and Configuration.
</p>
        <p>
If a property is encountered which specifies a value for a property which has been
previously declared, the previous value will be discarded.
</p>
        <p>
The implications of this are subtle but very simple; <strong>once a property has been
set which has dependent properties you must not overwrite that property</strong>.
This is because when a dependent property is encountered it is evaluated immediately.
You cannot re-evaluate that property. So if you set a property during your build,
some existing dependent properties which were evaluated before the value change will
continue to use the old value. There is no way to re-evaluate those properties.
</p>
        <p>
Now lets see how this relates to the Configuration property specifically.
</p>
        <p>
The contents of the .csproj/.vbproj are properties/items along with an import to Microsoft.csharp.targets
(Microsoft.VisualBasic.targets for .vbproj) which then imports Microsoft.Common.targets.
If you look in Microsoft.common.targets you will see many different properties which
are declared using $(Configuration). So this means that you must treat the Configuration
property with care and abide by the rule that I have outlined above.
</p>
        <p>
FYI If you want more details on this I have explained this entire process in great
detail in my book <a href="http://www.amazon.com/gp/product/0735645248?ie=UTF8&amp;tag=sedodream-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0735645248" target="_blank">Inside
MSBuild and Team Build</a>.
</p>
        <p>
          <strong>
            <u>Configuration for web publishing</u>
          </strong>
        </p>
        <p>
If you have used the new web publish experience in Visual Studio 2012 (also available
for VS2010 from the <a href="https://www.windowsazure.com/en-us/develop/net/#" target="_blank">Azure
SDK</a>) you may have noticed that the web publish profiles are MSBuild files. They
are stored under Properties\PublishProfiles (My Project\PublishProfiles for VB) and
have extensions of .pubxml. In that file (or in a .pubxml.user file associated with
it) you will find a property defined as
</p>
        <pre class="brush: xml;">&lt;LastUsedBuildConfiguration&gt;Release&lt;/LastUsedBulidConfiguration&gt;</pre>
        <p>
This value corresponds to the value for the Configuration drop down in the VS web
publish dialog. When you kick off a publish in VS we use this value and kick off a
build and specify Configuration as a global property which is passed in. The reason
why we did not name this property Configuration is because the web publish profile
is imported into the web project itself during the publish process. By the file being
imported you can natively access all the properties/items of the .csproj/.vbproj and
also easily extend the build process. Since that is the case we cannot set the Configuration
property because we know it’s value has already been set. Due to this when publishing
from the command line you must specify the Configuration property.
</p>
        <p>
Sayed Ibrahim Hashimi | <a href="http://twitter.com/sayedihashimi" target="_blank">@SayedIHashimi</a></p>
      </body>
      <title>MSBuild: how to set the configuration property</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,ca9825b2-a384-4d68-9413-e774948bbd58.aspx</guid>
      <link>http://sedodream.com/2012/10/27/MSBuildHowToSetTheConfigurationProperty.aspx</link>
      <pubDate>Sat, 27 Oct 2012 02:49:02 GMT</pubDate>
      <description>&lt;p&gt;
When you are building a .sln file or a .csproj/.vbproj/etc you need to be careful
how you set the Configuration property. Once this property is set you do not want
to change the value of it. Because of this it is best to specify this as a global
property. To do that you can pass it in on the command line. If you are using the &lt;a href="http://msdn.microsoft.com/en-us/library/z7f65y0d.aspx" target="_blank"&gt;MSBuild
task&lt;/a&gt; then you can pass it in via Properties or AdditionalProperties. &lt;strong&gt;What
you do not want to do is to set this value inside your .csproj/.vbproj or any imported
file.&lt;/strong&gt; The only time when this is OK if there is a condition which will not
set the property if it’s already been set. This is exactly how the default .csproj/.vbproj
files are authored:
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Configuration Condition=&amp;quot; '$(Configuration)' == '' &amp;quot;&amp;gt;Debug&amp;lt;/Configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;
If you do set this property w/o the conditional not to overwrite an existing value
you may experience really strange behavior during your builds. And it may be difficult
to diagnose the issue as well.
&lt;/p&gt;
&lt;p&gt;
Now let me explain why you cannot do this. When you build a .csproj/.vbproj MSBuild
will start creating an in-memory representation of the entire project. It will start
with the .csproj/.vbproj file itself. It will read the file from top to bottom. When
a property is encountered it is evaluated. If a property is encountered that relies
on another one, for example
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;IntermediateOutputPath Condition=&amp;quot; '$(PlatformName)' == 'AnyCPU' &amp;quot;&amp;gt;$(BaseIntermediateOutputPath)$(Configuration)\&amp;lt;/IntermediateOutputPath&amp;gt;&lt;/pre&gt;
&lt;p&gt;
The properties inside the expression will be evaluated on whatever values exist for
the properties at the time. In this case ItermediateOutputPath will be the value of
BaseIntermediateOutputPath and Configuration.
&lt;/p&gt;
&lt;p&gt;
If a property is encountered which specifies a value for a property which has been
previously declared, the previous value will be discarded.
&lt;/p&gt;
&lt;p&gt;
The implications of this are subtle but very simple; &lt;strong&gt;once a property has been
set which has dependent properties you must not overwrite that property&lt;/strong&gt;.
This is because when a dependent property is encountered it is evaluated immediately.
You cannot re-evaluate that property. So if you set a property during your build,
some existing dependent properties which were evaluated before the value change will
continue to use the old value. There is no way to re-evaluate those properties.
&lt;/p&gt;
&lt;p&gt;
Now lets see how this relates to the Configuration property specifically.
&lt;/p&gt;
&lt;p&gt;
The contents of the .csproj/.vbproj are properties/items along with an import to Microsoft.csharp.targets
(Microsoft.VisualBasic.targets for .vbproj) which then imports Microsoft.Common.targets.
If you look in Microsoft.common.targets you will see many different properties which
are declared using $(Configuration). So this means that you must treat the Configuration
property with care and abide by the rule that I have outlined above.
&lt;/p&gt;
&lt;p&gt;
FYI If you want more details on this I have explained this entire process in great
detail in my book &lt;a href="http://www.amazon.com/gp/product/0735645248?ie=UTF8&amp;amp;tag=sedodream-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735645248" target="_blank"&gt;Inside
MSBuild and Team Build&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Configuration for web publishing&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
If you have used the new web publish experience in Visual Studio 2012 (also available
for VS2010 from the &lt;a href="https://www.windowsazure.com/en-us/develop/net/#" target="_blank"&gt;Azure
SDK&lt;/a&gt;) you may have noticed that the web publish profiles are MSBuild files. They
are stored under Properties\PublishProfiles (My Project\PublishProfiles for VB) and
have extensions of .pubxml. In that file (or in a .pubxml.user file associated with
it) you will find a property defined as
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;LastUsedBuildConfiguration&amp;gt;Release&amp;lt;/LastUsedBulidConfiguration&amp;gt;&lt;/pre&gt;
&lt;p&gt;
This value corresponds to the value for the Configuration drop down in the VS web
publish dialog. When you kick off a publish in VS we use this value and kick off a
build and specify Configuration as a global property which is passed in. The reason
why we did not name this property Configuration is because the web publish profile
is imported into the web project itself during the publish process. By the file being
imported you can natively access all the properties/items of the .csproj/.vbproj and
also easily extend the build process. Since that is the case we cannot set the Configuration
property because we know it’s value has already been set. Due to this when publishing
from the command line you must specify the Configuration property.
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | &lt;a href="http://twitter.com/sayedihashimi" target="_blank"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,ca9825b2-a384-4d68-9413-e774948bbd58.aspx</comments>
      <category>MSBuild</category>
      <category>MSDeploy</category>
      <category>Visual Studio</category>
      <category>Visual Studio 2008</category>
      <category>Visual Studio 2010</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=fdcc88bf-95ac-4945-a49b-96d9d1ac35a5</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,fdcc88bf-95ac-4945-a49b-96d9d1ac35a5.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,fdcc88bf-95ac-4945-a49b-96d9d1ac35a5.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=fdcc88bf-95ac-4945-a49b-96d9d1ac35a5</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
When we released VS2010 we add support for <a href="http://msdn.microsoft.com/en-us/library/dd465326.aspx">web.config
(XDT) transforms</a> during publish/package. <em>Note: From now on I’ll only use the
word publish from now on but the full content relates to packaging as well.</em> In
the original implementation when you published your web project the web.config file
would be transformed by the file web.{Configuration}.config, where {Configuration}
is the project build configuration. For example Debug, or Release. If you publish
on Release and there exists a web.release.config we will take your web.config and
transform it with web.release.config before publishing.
</p>
        <h3>Cascading web.config transformations
</h3>
        <p>
In VS 2012 (<em>as well as the publishing updates for VS2010 through the </em><a href="https://www.windowsazure.com/en-us/develop/net/"><em>Azure
SDK</em></a>) now support the concept of publish specific transforms. You can also
now specify the project configuration used for a profile when publishing on the publish
dialog.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/SNAGHTML45b19fc.png">
            <img title="SNAGHTML45b19fc" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="SNAGHTML45b19fc" src="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/SNAGHTML45b19fc_thumb.png" width="621" height="484" />
          </a>
        </p>
        <p>
In this case I have created a profile named Production and set the Configuration to
Release. When I publish this project the following transformations will be applied
(if the files exist) in this order.
</p>
        <ol>
          <li>
web.release.config 
</li>
          <li>
web.production.config 
</li>
        </ol>
        <p>
I think that we got this wrong when we initially implemented the support. We should
have created profile specific transforms instead of ones based on build config, but
having these cascading transforms are still pretty useful. For example I may want
to remove the attribute debug=”true” from the compilation element and then inside
of the profile specific transform we would override appSettings/WCF endpoints/logging
config/etc for that environment.
</p>
        <p>
In VS there is a right-click option on web.config for Add Config Transform, but we
were not able to update the functionality of that to automatically create profile
specific transforms. Don’t worry it will be released soon with our first set of updates
for web tooling. For now you will need to create a new file with the correct name
and add it to your project. <em>Note: if you want it to show up nested under web.config
you’ll need to add the metadata &lt;DependentUpon&gt;Web.config&lt;/DependentUpon&gt;
to the item in the .csproj/.vbproj file.</em></p>
        <h3>web.config transform preview
</h3>
        <p>
Previously the only way to test the functionality for these transformation was to
actually publish or package the web project. This gets old pretty quick. In order
to simplify creating these transforms we have introduced the Preview Transform menu
option. This is the <strong>coolest feature in VS 2012</strong> (<em>OK I’m a bit
biased, but still its the coolest</em>).
</p>
        <p>
          <a href="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/image_4.png">
            <img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/image_thumb_1.png" width="444" height="235" />
          </a>
        </p>
        <p>
In my web.release.config I have left the default contents, which just removes the
debug attribute. Here is what I see when I select this on web.release.config for my
project.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/image_8.png">
            <img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/image_thumb_3.png" width="644" height="321" />
          </a>
        </p>
        <p>
You can see that in the image above we can see that the debug flag was indeed removed
as expected. 
</p>
        <p>
In my web.production.config I have a transform which simply updates the email app
setting value. Here is the really cool part when I preview the transform for web.production.config
the previewer will look into the profile and determine the build configuration which
has been configured, and it will ensure that transform is applied before the profile
specific one. For example take a look at the result for web.production.config.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/image_12.png">
            <img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/image_thumb_5.png" width="644" height="321" />
          </a>
        </p>
        <p>
In the image above you can see the note that web.release.config was applied first
followed by web.production.config. In the result we can see that web.release.config
removed the debug flag and that web.production.config updated the email address value.
</p>
        <p>
We also do a little bit to help out in case there are errors in either the web.config
or a transform. You can see errors in the Output Window and double click it to go
directly to where the error exists.
</p>
        <p>
Note: <a href="http://www.hanselman.com/blog/">Scott Hanselman</a> has a <a href="http://www.asp.net/vnext/overview/videos/visual-studio-2012-web-publishing-improvements">5
minute video showing this and other updates</a>.
</p>
        <p>
Another note: If you need to transform any file besides web.config during publish
then install my extension <a href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5/">SlowCheetah</a>.
</p>
        <p>
Sayed Ibrahim Hashimi | <a href="https://twitter.com/sayedihashimi">@SayedIHashimi</a></p>
      </body>
      <title>Profile specific web.config transforms and transform preview</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,fdcc88bf-95ac-4945-a49b-96d9d1ac35a5.aspx</guid>
      <link>http://sedodream.com/2012/08/19/ProfileSpecificWebconfigTransformsAndTransformPreview.aspx</link>
      <pubDate>Sun, 19 Aug 2012 22:18:16 GMT</pubDate>
      <description>&lt;p&gt;
When we released VS2010 we add support for &lt;a href="http://msdn.microsoft.com/en-us/library/dd465326.aspx"&gt;web.config
(XDT) transforms&lt;/a&gt; during publish/package. &lt;em&gt;Note: From now on I’ll only use the
word publish from now on but the full content relates to packaging as well.&lt;/em&gt; In
the original implementation when you published your web project the web.config file
would be transformed by the file web.{Configuration}.config, where {Configuration}
is the project build configuration. For example Debug, or Release. If you publish
on Release and there exists a web.release.config we will take your web.config and
transform it with web.release.config before publishing.
&lt;/p&gt;
&lt;h3&gt;Cascading web.config transformations
&lt;/h3&gt;
&lt;p&gt;
In VS 2012 (&lt;em&gt;as well as the publishing updates for VS2010 through the &lt;/em&gt;&lt;a href="https://www.windowsazure.com/en-us/develop/net/"&gt;&lt;em&gt;Azure
SDK&lt;/em&gt;&lt;/a&gt;) now support the concept of publish specific transforms. You can also
now specify the project configuration used for a profile when publishing on the publish
dialog.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/SNAGHTML45b19fc.png"&gt;&lt;img title="SNAGHTML45b19fc" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="SNAGHTML45b19fc" src="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/SNAGHTML45b19fc_thumb.png" width="621" height="484" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
In this case I have created a profile named Production and set the Configuration to
Release. When I publish this project the following transformations will be applied
(if the files exist) in this order.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
web.release.config 
&lt;/li&gt;
&lt;li&gt;
web.production.config 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
I think that we got this wrong when we initially implemented the support. We should
have created profile specific transforms instead of ones based on build config, but
having these cascading transforms are still pretty useful. For example I may want
to remove the attribute debug=”true” from the compilation element and then inside
of the profile specific transform we would override appSettings/WCF endpoints/logging
config/etc for that environment.
&lt;/p&gt;
&lt;p&gt;
In VS there is a right-click option on web.config for Add Config Transform, but we
were not able to update the functionality of that to automatically create profile
specific transforms. Don’t worry it will be released soon with our first set of updates
for web tooling. For now you will need to create a new file with the correct name
and add it to your project. &lt;em&gt;Note: if you want it to show up nested under web.config
you’ll need to add the metadata &amp;lt;DependentUpon&amp;gt;Web.config&amp;lt;/DependentUpon&amp;gt;
to the item in the .csproj/.vbproj file.&lt;/em&gt;
&lt;/p&gt;
&lt;h3&gt;web.config transform preview
&lt;/h3&gt;
&lt;p&gt;
Previously the only way to test the functionality for these transformation was to
actually publish or package the web project. This gets old pretty quick. In order
to simplify creating these transforms we have introduced the Preview Transform menu
option. This is the &lt;strong&gt;coolest feature in VS 2012&lt;/strong&gt; (&lt;em&gt;OK I’m a bit
biased, but still its the coolest&lt;/em&gt;).
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/image_4.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/image_thumb_1.png" width="444" height="235" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
In my web.release.config I have left the default contents, which just removes the
debug attribute. Here is what I see when I select this on web.release.config for my
project.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/image_8.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/image_thumb_3.png" width="644" height="321" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
You can see that in the image above we can see that the debug flag was indeed removed
as expected. 
&lt;/p&gt;
&lt;p&gt;
In my web.production.config I have a transform which simply updates the email app
setting value. Here is the really cool part when I preview the transform for web.production.config
the previewer will look into the profile and determine the build configuration which
has been configured, and it will ensure that transform is applied before the profile
specific one. For example take a look at the result for web.production.config.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/image_12.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/Pro.configtransformsandtransformpreviews_CB5A/image_thumb_5.png" width="644" height="321" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
In the image above you can see the note that web.release.config was applied first
followed by web.production.config. In the result we can see that web.release.config
removed the debug flag and that web.production.config updated the email address value.
&lt;/p&gt;
&lt;p&gt;
We also do a little bit to help out in case there are errors in either the web.config
or a transform. You can see errors in the Output Window and double click it to go
directly to where the error exists.
&lt;/p&gt;
&lt;p&gt;
Note: &lt;a href="http://www.hanselman.com/blog/"&gt;Scott Hanselman&lt;/a&gt; has a &lt;a href="http://www.asp.net/vnext/overview/videos/visual-studio-2012-web-publishing-improvements"&gt;5
minute video showing this and other updates&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Another note: If you need to transform any file besides web.config during publish
then install my extension &lt;a href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5/"&gt;SlowCheetah&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | &lt;a href="https://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,fdcc88bf-95ac-4945-a49b-96d9d1ac35a5.aspx</comments>
      <category>Config-Transformation</category>
      <category>MSBuild</category>
      <category>Visual Studio</category>
      <category>Visual Studio 2012</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=a5894bad-f2a1-441a-a5b2-74f16c6cf8aa</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,a5894bad-f2a1-441a-a5b2-74f16c6cf8aa.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,a5894bad-f2a1-441a-a5b2-74f16c6cf8aa.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a5894bad-f2a1-441a-a5b2-74f16c6cf8aa</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
One of the most requested features of Visual Studio 2012 was the ability to open projects
in both VS 2012 as well as VS 2010 (<em>requires VS 2010 SP1</em>). In case you haven’t
heard we did implement that feature. You may be wondering how we were able to do this
and how this may impact you.
</p>
        <p>
If you open the .csproj/.vbproj for a Web Project created in VS2010 you will see the
following import statement.
</p>
        <pre class="brush: xml;">&lt;Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\<br />
v10.0\WebApplications\Microsoft.WebApplication.targets" /&gt;</pre>
        <p>
When you open this project in VS 2012 there are a few changes made to your project
file to ensure that it can be opened in both VS 2010 SP1 and VS 2012. One of the changes
made to the project when it is first loaded in VS 2012 is to add the following to
replace that import statement.
</p>
        <pre class="brush: xml;">&lt;PropertyGroup&gt;
  &lt;VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''"&gt;10.0&lt;/VisualStudioVersion&gt;
  &lt;VSToolsPath Condition="'$(VSToolsPath)' == ''"&gt;
    $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)&lt;/VSToolsPath&gt;
&lt;/PropertyGroup&gt;
&lt;Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" /&gt;</pre>
        <p>
We removed the hard-coded 10.0 and instead used the property <em>VisualStudioVersion</em>.
When building in Visual Studio 2012 this value will always be 11.0, but for VS 2010
it doesn’t exist. That is why we defaulted it to 10.0 above.
</p>
        <p>
There are some scenarios where building from the command line will require to set
this property explicitly. Before we get there let me explain how this property gets
set (<em>in this order</em>)
</p>
        <ol>
          <li>
If VisualStudioVersion is defined as an environment variable/global MSBuild property,
that is used.</li>
        </ol>
        <ul>
          <li>
            <em>This is how VS and the VS developer command prompt set this value</em>
          </li>
        </ul>
        <li>
Based on the file format version of the .sln file (toolset used is sln file format
–1)</li>
        <ul>
          <li>
            <em>To simplify this statement, the .sln file will build with specifying VisualStudioVersion
to the value of the version of VS which created the .sln file.</em>
          </li>
        </ul>
        <li>
Choose default</li>
        <ul>
          <li>
10.0 if VS 2010 is installed</li>
          <li>
Highest-versioned sub-toolset version installed</li>
        </ul>
        <p>
For #2 when you are building a .sln file the value of VisulStudioVersion will be –1
of the Format Version found in the .sln file. The important thing to note here is
that if you build a .sln file it will build with the value of VisulStudioVersion corresponding
to the version of VS which created the .sln file. So if you create a .sln file in
VS2012 and you always build that .sln file the value for VisualStudioVersion will
be 11.0. In many cases if you build the .sln file you are good. 
</p>
        <p>
If you are building .csproj/.vbproj files w/o going through a .sln file? If you build
a web project from the command line (<em>not the developer prompt</em>) then the value
for VisualStudioVersion used will be 10.0. That is an artifact of the properties which
I showed above. In this case you should pass this in as an MSBuild property. For example
</p>
        <pre class="brush: xml;">msbuild.exe MyAwesomeWeb.csproj /p:VisualStudioVersion=11.0</pre>
        <p>
In this case I’m passing in the property explicitly. This will always override any
other mechanism to determine the value for VisualStudioVersion. If you are using the <a href="http://msdn.microsoft.com/en-us/library/z7f65y0d.aspx">MSBuild
task</a> in a build script, then you can specify the property either in the Properties
attribute or the AdditionalProperties attribute. <em>See my previous </em><a href="http://sedodream.com/2009/04/29/MSBuildPropertiesAndAdditionalPropertiesKnownMetadata.aspx"><em>blog
post on the difference between Properties and AdditionalProperties</em></a><em>.</em></p>
        <p>
If you encounter any funny behavior when building/publishing and you notice that the
wrong .targets files are being imported then you may need to specify this property.
</p>
        <p>
Sayed Ibrahim Hashimi | <a href="https://twitter.com/sayedihashimi">@SayedIHashimi</a></p>
      </body>
      <title>Visual Studio project compatability and VisualStudioVersion</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,a5894bad-f2a1-441a-a5b2-74f16c6cf8aa.aspx</guid>
      <link>http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx</link>
      <pubDate>Sun, 19 Aug 2012 21:06:56 GMT</pubDate>
      <description>&lt;p&gt;
One of the most requested features of Visual Studio 2012 was the ability to open projects
in both VS 2012 as well as VS 2010 (&lt;em&gt;requires VS 2010 SP1&lt;/em&gt;). In case you haven’t
heard we did implement that feature. You may be wondering how we were able to do this
and how this may impact you.
&lt;/p&gt;
&lt;p&gt;
If you open the .csproj/.vbproj for a Web Project created in VS2010 you will see the
following import statement.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Import Project=&amp;quot;$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\&lt;br /&gt;
v10.0\WebApplications\Microsoft.WebApplication.targets&amp;quot; /&amp;gt;&lt;/pre&gt;
&lt;p&gt;
When you open this project in VS 2012 there are a few changes made to your project
file to ensure that it can be opened in both VS 2010 SP1 and VS 2012. One of the changes
made to the project when it is first loaded in VS 2012 is to add the following to
replace that import statement.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;PropertyGroup&amp;gt;
  &amp;lt;VisualStudioVersion Condition=&amp;quot;'$(VisualStudioVersion)' == ''&amp;quot;&amp;gt;10.0&amp;lt;/VisualStudioVersion&amp;gt;
  &amp;lt;VSToolsPath Condition=&amp;quot;'$(VSToolsPath)' == ''&amp;quot;&amp;gt;
    $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)&amp;lt;/VSToolsPath&amp;gt;
&amp;lt;/PropertyGroup&amp;gt;
&amp;lt;Import Project=&amp;quot;$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets&amp;quot; Condition=&amp;quot;'$(VSToolsPath)' != ''&amp;quot; /&amp;gt;&lt;/pre&gt;
&lt;p&gt;
We removed the hard-coded 10.0 and instead used the property &lt;em&gt;VisualStudioVersion&lt;/em&gt;.
When building in Visual Studio 2012 this value will always be 11.0, but for VS 2010
it doesn’t exist. That is why we defaulted it to 10.0 above.
&lt;/p&gt;
&lt;p&gt;
There are some scenarios where building from the command line will require to set
this property explicitly. Before we get there let me explain how this property gets
set (&lt;em&gt;in this order&lt;/em&gt;)
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
If VisualStudioVersion is defined as an environment variable/global MSBuild property,
that is used.&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;This is how VS and the VS developer command prompt set this value&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
Based on the file format version of the .sln file (toolset used is sln file format
–1)&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;To simplify this statement, the .sln file will build with specifying VisualStudioVersion
to the value of the version of VS which created the .sln file.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
Choose default&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
10.0 if VS 2010 is installed&lt;/li&gt;
&lt;li&gt;
Highest-versioned sub-toolset version installed&lt;/li&gt;
&lt;/ul&gt;
&gt;
&lt;p&gt;
For #2 when you are building a .sln file the value of VisulStudioVersion will be –1
of the Format Version found in the .sln file. The important thing to note here is
that if you build a .sln file it will build with the value of VisulStudioVersion corresponding
to the version of VS which created the .sln file. So if you create a .sln file in
VS2012 and you always build that .sln file the value for VisualStudioVersion will
be 11.0. In many cases if you build the .sln file you are good. 
&lt;/p&gt;
&lt;p&gt;
If you are building .csproj/.vbproj files w/o going through a .sln file? If you build
a web project from the command line (&lt;em&gt;not the developer prompt&lt;/em&gt;) then the value
for VisualStudioVersion used will be 10.0. That is an artifact of the properties which
I showed above. In this case you should pass this in as an MSBuild property. For example
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;msbuild.exe MyAwesomeWeb.csproj /p:VisualStudioVersion=11.0&lt;/pre&gt;
&lt;p&gt;
In this case I’m passing in the property explicitly. This will always override any
other mechanism to determine the value for VisualStudioVersion. If you are using the &lt;a href="http://msdn.microsoft.com/en-us/library/z7f65y0d.aspx"&gt;MSBuild
task&lt;/a&gt; in a build script, then you can specify the property either in the Properties
attribute or the AdditionalProperties attribute. &lt;em&gt;See my previous &lt;/em&gt;&lt;a href="http://sedodream.com/2009/04/29/MSBuildPropertiesAndAdditionalPropertiesKnownMetadata.aspx"&gt;&lt;em&gt;blog
post on the difference between Properties and AdditionalProperties&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt; 
&lt;/p&gt;
&lt;p&gt;
If you encounter any funny behavior when building/publishing and you notice that the
wrong .targets files are being imported then you may need to specify this property.
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | &lt;a href="https://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,a5894bad-f2a1-441a-a5b2-74f16c6cf8aa.aspx</comments>
      <category>MSBuild</category>
      <category>Visual Studio</category>
      <category>Visual Studio 11</category>
      <category>Visual Studio 2010</category>
      <category>Visual Studio 2012</category>
      <category>web</category>
      <category>Web Publishing Pipeline</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=7f2bfbcc-e5ac-4547-af65-83ce74f80feb</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,7f2bfbcc-e5ac-4547-af65-83ce74f80feb.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,7f2bfbcc-e5ac-4547-af65-83ce74f80feb.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=7f2bfbcc-e5ac-4547-af65-83ce74f80feb</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A couple of months ago I wrote a blog post <a href="http://sedodream.com/2012/05/14/MSBuildHowToExecuteATargetAfterCoreCompile.aspx" target="_blank">MSBuild
how to execute a target after CoreCompile</a> in which I describe how you can execute
a target if the CoreCompile target is executed, if CoreCompile is skipped then so
will your other target. The draw back of the approach that I outlined in my previous
post was that it required you to edit your .csproj/.vbproj/etc file itself. So if
you had a scenario where you were building multiple projects then you would have to
edit all of the project files. In this post I’ll describe how you can perform the
same customization without having to edit the project file itself. Note this blog
is in response to a question on <a href="http://stackoverflow.com/q/11667510/105999" target="_blank">StackOverflow
Determine if MSBuild CoreCompile will run and call custom target</a>.
</p>
        <p>
Before we get to the solution for this particular case let me describe an extensibility
hook that the C# and VB projects have. Most of the logic for building C# and VB projects
is captured in the MSBuild targets file at C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets.
If you take a look in that file you will notice at the top an import looking like
the one below.
</p>
        <pre class="brush: xml;">&lt;Import Project="$(CustomBeforeMicrosoftCommonTargets)" Condition="'$(CustomBeforeMicrosoftCommonTargets)' != '' and Exists('$(CustomBeforeMicrosoftCommonTargets)')"/&gt;</pre>
        <p>
This statement will import a file (located at the value for CustomBeforeMicrosoftCommonTargets)
if the property is not empty and the file exists. The default value for CustomBeforeMicrosoftCommonTargets
is <font face="Consolas">C:\Program Files (x86)\MSBuild\v4.0\Custom.Before.Microsoft.Common.targets</font>.
So if you drop an MSBuild file at that location it will modify the build process for
every C#/VB project built on that machine. Alternatively if you do not want (or cannot
due to ACLs) then you can drop the file somewhere else and then specify its location
by overriding the CustomBeforeMicrosoftCommonTargets property. This is the approach
that I will take here. I have created a sample solution which consists of two projects
ProjA and ProjB. I also have a build script, build.proj, to automate the build for
this. Below is the entire contents of build.proj.
</p>
        <h4>build.proj
</h4>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
  &lt;PropertyGroup&gt;
    &lt;FileToInject Condition=" '$(FileToInject)'=='' "&gt;$(MSBuildThisFileDirectory)extend-corecompile.proj&lt;/FileToInject&gt;
  &lt;/PropertyGroup&gt;

  &lt;ItemGroup&gt;
    &lt;ProjectsToBuild Include="ProjA\ProjA.csproj"/&gt;
    &lt;ProjectsToBuild Include="ProjB\ProjB.csproj"/&gt;
  &lt;/ItemGroup&gt;

  &lt;Target Name="Build"&gt;
    &lt;MSBuild Projects="@(ProjectsToBuild)"
             Properties="CustomBeforeMicrosoftCommonTargets=$(FileToInject)" /&gt;   
  &lt;/Target&gt;

  &lt;Target Name="Clean"&gt;
    &lt;MSBuild Projects="@(ProjectsToBuild)" Targets="Clean"/&gt;
  &lt;/Target&gt;

  &lt;Target Name="Rebuild" DependsOnTargets="Clean;Build"/&gt;
  
&lt;/Project&gt;</pre>
        <p>
In the Build target above I use the MSBuild task to build both ProjA and ProjB. As
you can see I am passing the property CustomBeforeMicrosoftCommonTargets=$(FileToInject)
which points to extend-corecompile.proj. By passing this property when ProjA, and
ProjB, is built it will automatically import the extend-corecompile.proj file for
the build process. You can see the contents of extend-corecompile.proj below.
</p>
        <h4>extend-corecompile.proj
</h4>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
  &lt;PropertyGroup&gt;
    &lt;TargetsTriggeredByCompilation&gt;
      $(TargetsTriggeredByCompilation);
      MyCustomTarget
    &lt;/TargetsTriggeredByCompilation&gt;
  &lt;/PropertyGroup&gt;

  &lt;Target Name="MyCustomTarget"&gt;
    &lt;Message Text="MyCustomTarget called" Importance ="high"/&gt;
  &lt;/Target&gt;
  
&lt;/Project&gt;</pre>
        <p>
This project file uses the technique outlined in <a href="http://sedodream.com/2012/05/14/MSBuildHowToExecuteATargetAfterCoreCompile.aspx" target="_blank">my
previous blog post</a> to execute the MyCustomTarget only if CoreCompile is executed.
</p>
        <p>
Note: You can get the latest version of this sample at <a href="https://github.com/sayedihashimi/sayed-samples/tree/master/ExtBuildMultiple">https://github.com/sayedihashimi/sayed-samples/tree/master/ExtBuildMultiple</a>.
</p>
        <p>
Sayed Ibrahim Hashimi | <a href="http://twitter.com/sayedihashimi" target="_blank">SayedIHashimi</a></p>
      </body>
      <title>MSBuild how to execute a target after CoreCompile part 2</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,7f2bfbcc-e5ac-4547-af65-83ce74f80feb.aspx</guid>
      <link>http://sedodream.com/2012/07/28/MSBuildHowToExecuteATargetAfterCoreCompilePart2.aspx</link>
      <pubDate>Sat, 28 Jul 2012 23:27:47 GMT</pubDate>
      <description>&lt;p&gt;
A couple of months ago I wrote a blog post &lt;a href="http://sedodream.com/2012/05/14/MSBuildHowToExecuteATargetAfterCoreCompile.aspx" target="_blank"&gt;MSBuild
how to execute a target after CoreCompile&lt;/a&gt; in which I describe how you can execute
a target if the CoreCompile target is executed, if CoreCompile is skipped then so
will your other target. The draw back of the approach that I outlined in my previous
post was that it required you to edit your .csproj/.vbproj/etc file itself. So if
you had a scenario where you were building multiple projects then you would have to
edit all of the project files. In this post I’ll describe how you can perform the
same customization without having to edit the project file itself. Note this blog
is in response to a question on &lt;a href="http://stackoverflow.com/q/11667510/105999" target="_blank"&gt;StackOverflow
Determine if MSBuild CoreCompile will run and call custom target&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Before we get to the solution for this particular case let me describe an extensibility
hook that the C# and VB projects have. Most of the logic for building C# and VB projects
is captured in the MSBuild targets file at C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets.
If you take a look in that file you will notice at the top an import looking like
the one below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Import Project=&amp;quot;$(CustomBeforeMicrosoftCommonTargets)&amp;quot; Condition=&amp;quot;'$(CustomBeforeMicrosoftCommonTargets)' != '' and Exists('$(CustomBeforeMicrosoftCommonTargets)')&amp;quot;/&amp;gt;&lt;/pre&gt;
&lt;p&gt;
This statement will import a file (located at the value for CustomBeforeMicrosoftCommonTargets)
if the property is not empty and the file exists. The default value for CustomBeforeMicrosoftCommonTargets
is &lt;font face="Consolas"&gt;C:\Program Files (x86)\MSBuild\v4.0\Custom.Before.Microsoft.Common.targets&lt;/font&gt;.
So if you drop an MSBuild file at that location it will modify the build process for
every C#/VB project built on that machine. Alternatively if you do not want (or cannot
due to ACLs) then you can drop the file somewhere else and then specify its location
by overriding the CustomBeforeMicrosoftCommonTargets property. This is the approach
that I will take here. I have created a sample solution which consists of two projects
ProjA and ProjB. I also have a build script, build.proj, to automate the build for
this. Below is the entire contents of build.proj.
&lt;/p&gt;
&lt;h4&gt;build.proj
&lt;/h4&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; DefaultTargets=&amp;quot;Build&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;FileToInject Condition=&amp;quot; '$(FileToInject)'=='' &amp;quot;&amp;gt;$(MSBuildThisFileDirectory)extend-corecompile.proj&amp;lt;/FileToInject&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;

  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;ProjectsToBuild Include=&amp;quot;ProjA\ProjA.csproj&amp;quot;/&amp;gt;
    &amp;lt;ProjectsToBuild Include=&amp;quot;ProjB\ProjB.csproj&amp;quot;/&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;

  &amp;lt;Target Name=&amp;quot;Build&amp;quot;&amp;gt;
    &amp;lt;MSBuild Projects=&amp;quot;@(ProjectsToBuild)&amp;quot;
             Properties=&amp;quot;CustomBeforeMicrosoftCommonTargets=$(FileToInject)&amp;quot; /&amp;gt;   
  &amp;lt;/Target&amp;gt;

  &amp;lt;Target Name=&amp;quot;Clean&amp;quot;&amp;gt;
    &amp;lt;MSBuild Projects=&amp;quot;@(ProjectsToBuild)&amp;quot; Targets=&amp;quot;Clean&amp;quot;/&amp;gt;
  &amp;lt;/Target&amp;gt;

  &amp;lt;Target Name=&amp;quot;Rebuild&amp;quot; DependsOnTargets=&amp;quot;Clean;Build&amp;quot;/&amp;gt;
  
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
In the Build target above I use the MSBuild task to build both ProjA and ProjB. As
you can see I am passing the property CustomBeforeMicrosoftCommonTargets=$(FileToInject)
which points to extend-corecompile.proj. By passing this property when ProjA, and
ProjB, is built it will automatically import the extend-corecompile.proj file for
the build process. You can see the contents of extend-corecompile.proj below.
&lt;/p&gt;
&lt;h4&gt;extend-corecompile.proj
&lt;/h4&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;TargetsTriggeredByCompilation&amp;gt;
      $(TargetsTriggeredByCompilation);
      MyCustomTarget
    &amp;lt;/TargetsTriggeredByCompilation&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;

  &amp;lt;Target Name=&amp;quot;MyCustomTarget&amp;quot;&amp;gt;
    &amp;lt;Message Text=&amp;quot;MyCustomTarget called&amp;quot; Importance =&amp;quot;high&amp;quot;/&amp;gt;
  &amp;lt;/Target&amp;gt;
  
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
This project file uses the technique outlined in &lt;a href="http://sedodream.com/2012/05/14/MSBuildHowToExecuteATargetAfterCoreCompile.aspx" target="_blank"&gt;my
previous blog post&lt;/a&gt; to execute the MyCustomTarget only if CoreCompile is executed.
&lt;/p&gt;
&lt;p&gt;
Note: You can get the latest version of this sample at &lt;a href="https://github.com/sayedihashimi/sayed-samples/tree/master/ExtBuildMultiple"&gt;https://github.com/sayedihashimi/sayed-samples/tree/master/ExtBuildMultiple&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | &lt;a href="http://twitter.com/sayedihashimi" target="_blank"&gt;SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,7f2bfbcc-e5ac-4547-af65-83ce74f80feb.aspx</comments>
      <category>MSBuild</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=f6513821-efe2-4c6a-928a-43ce9cc77b36</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,f6513821-efe2-4c6a-928a-43ce9cc77b36.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,f6513821-efe2-4c6a-928a-43ce9cc77b36.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f6513821-efe2-4c6a-928a-43ce9cc77b36</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I was on StackOverflow today and noticed a <a href="http://stackoverflow.com/q/10555649/105999" target="_blank">question</a> along
these lines “<a href="http://stackoverflow.com/q/10555649/105999" target="_blank">How
to I create a target which is executed when CoreCompile is, and that is skipped when
CoreCompile is skipped</a>?” Below is my answer.
</p>
        <p>
This is a tricky problem to solve for the general case, but it is pretty easy in your
case because CoreCompile has special built in support for this scenario. Before I
go into the details of how you can accomplish this with CoreCompile let me explain
how it works in general.
</p>
        <h3>Explanation of the general case
</h3>
        <p>
In MSBuild targets are skipped due to Incremental Building. Incremental Build is driven
purely off of the Inputs and Outputs attributes on the Target itself. The inputs are
a list of files that the target will "use" and the outputs are a list of
files that are "generated" by the target. I'm using quotes because its a
loose concept not a concrete one. To simplify it you can just treat inputs/outputs
as lists of files. When the target is about to be executed MSBuild will take the inputs
and compare the timestamps of them to the outputs. If all the outputs are newer then
the inputs then the target will be skipped. (FYI If you want to know what happens
when only some outputs are out-of-date read my blog at<a href="http://sedodream.com/2010/09/23/MSBuildYouveHeardOfIncrementalBuildingButHaveYouHeardOfPartialBuilding.aspx">http://sedodream.com/2010/09/23/MSBuildYouveHeardOfIncrementalBuildingButHaveYouHeardOfPartialBuilding.aspx</a>).
</p>
        <p>
In any case if you want a target to be skipped you have to craft your Inputs/Outputs
correctly. In your case you want to skip your target whenever the CoreCompile is skipped,
so at the surface it would seem that you could simply copy the Inputs/Outputs of CoreCompile
but that doesn't work. It doesn't work because when CoreCompile is executed the files
may be out-of-date but that target itself brings them up-to-date. Then when you target
is executed since they are all up-to-date it will be skipped. You would have to copy
the Inputs/Outputs and append an additional file to inputs/outputs which you target
creates. This would ensure that your target wouldn't get skipped during that first
pass.
</p>
        <h3>Specific solution for CoreCompile
</h3>
        <p>
If you take a look at the project file you will see towards the bottom that the file
Microsoft.Common.targets is Imported, this file will then import the language specific
.targets file. For example it will Import either Microsoft.CSharp.targets or Microsoft.VisualBasic.targets
(if you are using C# or VB). In those .targets files you will find CoreCompile defined.
In the definition for CoreCompile you will find the following at the end.
</p>
        <pre class="brush: xml;">&lt;CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/&gt;</pre>
        <p>
This will call all the targets defined in the <code>TargetsTriggeredByCompilation</code> property.
So if you want your target to be called whenever CoreCompile is <strong>executed</strong> you
can extend that property. Here is how to do that.
</p>
        <pre class="brush: xml;">&lt;PropertyGroup&gt;
  &lt;TargetsTriggeredByCompilation&gt;
    $(TargetsTriggeredByCompilation);
    MyCustomTarget
  &lt;/TargetsTriggeredByCompilation&gt;
&lt;/PropertyGroup&gt;

&lt;Target Name="MyCustomTarget"&gt;
  &lt;Message Text="MyCustomTarget called" Importance ="high"/&gt;
&lt;/Target&gt;</pre>
        <p>
In this case I define the property <strong>TargetsTriggeredByCompilation</strong> and
I append MyCustomTarget to it. It's very important that you include the <strong>$(TargetsTriggeredByCompilation);</strong> there,
if you don't then you won't be appending but overwriting. So if anyone else used this
technique you'd wipe out their target.
</p>
        <p>
Below is an image showing where I build once and CoreCompile and MyCustomTarget are
executed. Then the second build CoreCompile is skipped any MyCustomTarget is never
called.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/MSBuild-how-to-execute-a-target-after-Co_11A58/build-output_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="build-output" border="0" alt="build-output" src="http://sedodream.com/content/binary/Windows-Live-Writer/MSBuild-how-to-execute-a-target-after-Co_11A58/build-output_thumb.png" width="1189" height="621" />
          </a>
        </p>
        <p>
 
</p>
        <p>
Sayed Ibrahim Hashimi <a href="http://twitter.com/sayedihashimi" target="_blank">@SayedIHashimi</a></p>
      </body>
      <title>MSBuild how to execute a target after CoreCompile</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,f6513821-efe2-4c6a-928a-43ce9cc77b36.aspx</guid>
      <link>http://sedodream.com/2012/05/14/MSBuildHowToExecuteATargetAfterCoreCompile.aspx</link>
      <pubDate>Mon, 14 May 2012 03:14:13 GMT</pubDate>
      <description>&lt;p&gt;
I was on StackOverflow today and noticed a &lt;a href="http://stackoverflow.com/q/10555649/105999" target="_blank"&gt;question&lt;/a&gt; along
these lines “&lt;a href="http://stackoverflow.com/q/10555649/105999" target="_blank"&gt;How
to I create a target which is executed when CoreCompile is, and that is skipped when
CoreCompile is skipped&lt;/a&gt;?” Below is my answer.
&lt;/p&gt;
&lt;p&gt;
This is a tricky problem to solve for the general case, but it is pretty easy in your
case because CoreCompile has special built in support for this scenario. Before I
go into the details of how you can accomplish this with CoreCompile let me explain
how it works in general.
&lt;/p&gt;
&lt;h3&gt;Explanation of the general case
&lt;/h3&gt;
&lt;p&gt;
In MSBuild targets are skipped due to Incremental Building. Incremental Build is driven
purely off of the Inputs and Outputs attributes on the Target itself. The inputs are
a list of files that the target will &amp;quot;use&amp;quot; and the outputs are a list of
files that are &amp;quot;generated&amp;quot; by the target. I'm using quotes because its a
loose concept not a concrete one. To simplify it you can just treat inputs/outputs
as lists of files. When the target is about to be executed MSBuild will take the inputs
and compare the timestamps of them to the outputs. If all the outputs are newer then
the inputs then the target will be skipped. (FYI If you want to know what happens
when only some outputs are out-of-date read my blog at&lt;a href="http://sedodream.com/2010/09/23/MSBuildYouveHeardOfIncrementalBuildingButHaveYouHeardOfPartialBuilding.aspx"&gt;http://sedodream.com/2010/09/23/MSBuildYouveHeardOfIncrementalBuildingButHaveYouHeardOfPartialBuilding.aspx&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;
In any case if you want a target to be skipped you have to craft your Inputs/Outputs
correctly. In your case you want to skip your target whenever the CoreCompile is skipped,
so at the surface it would seem that you could simply copy the Inputs/Outputs of CoreCompile
but that doesn't work. It doesn't work because when CoreCompile is executed the files
may be out-of-date but that target itself brings them up-to-date. Then when you target
is executed since they are all up-to-date it will be skipped. You would have to copy
the Inputs/Outputs and append an additional file to inputs/outputs which you target
creates. This would ensure that your target wouldn't get skipped during that first
pass.
&lt;/p&gt;
&lt;h3&gt;Specific solution for CoreCompile
&lt;/h3&gt;
&lt;p&gt;
If you take a look at the project file you will see towards the bottom that the file
Microsoft.Common.targets is Imported, this file will then import the language specific
.targets file. For example it will Import either Microsoft.CSharp.targets or Microsoft.VisualBasic.targets
(if you are using C# or VB). In those .targets files you will find CoreCompile defined.
In the definition for CoreCompile you will find the following at the end.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;CallTarget Targets=&amp;quot;$(TargetsTriggeredByCompilation)&amp;quot; Condition=&amp;quot;'$(TargetsTriggeredByCompilation)' != ''&amp;quot;/&amp;gt;&lt;/pre&gt;
&lt;p&gt;
This will call all the targets defined in the &lt;code&gt;TargetsTriggeredByCompilation&lt;/code&gt; property.
So if you want your target to be called whenever CoreCompile is &lt;strong&gt;executed&lt;/strong&gt; you
can extend that property. Here is how to do that.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;PropertyGroup&amp;gt;
  &amp;lt;TargetsTriggeredByCompilation&amp;gt;
    $(TargetsTriggeredByCompilation);
    MyCustomTarget
  &amp;lt;/TargetsTriggeredByCompilation&amp;gt;
&amp;lt;/PropertyGroup&amp;gt;

&amp;lt;Target Name=&amp;quot;MyCustomTarget&amp;quot;&amp;gt;
  &amp;lt;Message Text=&amp;quot;MyCustomTarget called&amp;quot; Importance =&amp;quot;high&amp;quot;/&amp;gt;
&amp;lt;/Target&amp;gt;&lt;/pre&gt;
&lt;p&gt;
In this case I define the property &lt;strong&gt;TargetsTriggeredByCompilation&lt;/strong&gt; and
I append MyCustomTarget to it. It's very important that you include the &lt;strong&gt;$(TargetsTriggeredByCompilation);&lt;/strong&gt; there,
if you don't then you won't be appending but overwriting. So if anyone else used this
technique you'd wipe out their target.
&lt;/p&gt;
&lt;p&gt;
Below is an image showing where I build once and CoreCompile and MyCustomTarget are
executed. Then the second build CoreCompile is skipped any MyCustomTarget is never
called.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/MSBuild-how-to-execute-a-target-after-Co_11A58/build-output_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="build-output" border="0" alt="build-output" src="http://sedodream.com/content/binary/Windows-Live-Writer/MSBuild-how-to-execute-a-target-after-Co_11A58/build-output_thumb.png" width="1189" height="621" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi &lt;a href="http://twitter.com/sayedihashimi" target="_blank"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,f6513821-efe2-4c6a-928a-43ce9cc77b36.aspx</comments>
      <category>MSBuild</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=604eadfe-46bf-4989-bac8-814e2701e52a</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,604eadfe-46bf-4989-bac8-814e2701e52a.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,604eadfe-46bf-4989-bac8-814e2701e52a.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=604eadfe-46bf-4989-bac8-814e2701e52a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
If you have used the Visual Studio web publish in either VS 2010 or VS 11 to create
Web Deploy packages then you probably know that we parameterize connection strings
in web.config automatically. In case you are not familiar with Web Deploy parameters,
they are a way to declare that you want to easily be able to update a value of something
when publishing the package later on. Connection strings are good examples of something
which typically needs to be updated during publish.
</p>
        <p>
As I previously stated if you create a Web Deploy package in Visual Studio we will
automatically create Web Deploy parameters for all your connection strings in web.config.
Earlier today I saw a <a href="http://stackoverflow.com/questions/10411326/how-to-convert-configsource-to-inline-elements-in-web-config-on-transformation">question
on StackOverflow asking how to parameterize connection strings in non-web.config</a> files
(<em>question actually asked something else, but I think this is what he’s really
wanting</em>). I created a sample showing how to do this. Below is what the connectionStrings
element looks like in web.config.
</p>
        <pre class="brush: xml;">&lt;connectionStrings configSource="connectionStrings.config" /&gt;</pre>
        <p>
And here is connectionStrings.config
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;connectionStrings&gt;
  &lt;clear/&gt;
  &lt;add name="ApplicationServices"
           connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
           providerName="System.Data.SqlClient" /&gt;
  &lt;add name="OtherConnectionString"
       connectionString="data source=.\SQLExpress;Integrated Security=SSPI;Initial Catalog=foo"
       providerName="System.Data.SqlClient"/&gt;
&lt;/connectionStrings&gt;</pre>
        <p>
In order to parameterize these connection strings you will have to extend the Web
Publish Pipeline. To do that create a file named <strong>{project-name}.wpp.targets</strong> in
the root of the project in which you are working (for VS 11 projects you can place
all this directly inside of the .pubxml files). This will be an MSBuild file which
will get imported into the build/publish process. Below is the file which needs to
be created.
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;

  &lt;ItemGroup&gt;
    &lt;!-- Here we need to declare MSDeploy parameters for connection strings in connectionStrings.config --&gt;
    &lt;MsDeployDeclareParameters Include="ApplicationServices-ConnectionString" &gt;
      &lt;Kind&gt;XmlFile&lt;/Kind&gt;
      &lt;Scope&gt;connectionStrings.config$&lt;/Scope&gt;
      &lt;Match&gt;/connectionStrings/add[@name='ApplicationServices']/@connectionString&lt;/Match&gt;
      &lt;Description&gt;Connection string for ApplicationServices&lt;/Description&gt;
      &lt;DefaultValue&gt;data source=(localhost);Initial Catalog=AppServices&lt;/DefaultValue&gt;
      &lt;Tags&gt;SqlConnectionString&lt;/Tags&gt;
    &lt;/MsDeployDeclareParameters&gt;

    &lt;MsDeployDeclareParameters Include="OtherConnectionString-ConnectionString" &gt;
      &lt;Kind&gt;XmlFile&lt;/Kind&gt;
      &lt;Scope&gt;connectionStrings.config$&lt;/Scope&gt;
      &lt;Match&gt;/connectionStrings/add[@name='OtherConnectionString']/@connectionString&lt;/Match&gt;
      &lt;Description&gt;Connection string for OtherConnectionString&lt;/Description&gt;
      &lt;DefaultValue&gt;data source=(localhost);Initial Catalog=OtherDb&lt;/DefaultValue&gt;
      &lt;Tags&gt;SqlConnectionString&lt;/Tags&gt;
    &lt;/MsDeployDeclareParameters&gt;
  &lt;/ItemGroup&gt;

&lt;/Project&gt;</pre>
        <p>
Here you can see that I am creating values for MSDeployDeclareParameters. When you
package/publish this item list is used to create the MSDeploy parameters. Below is
an explanation of the metadata values each contain.
</p>
        <ul>
          <li>
Kind = for this case it will always be Xmlfile, <a href="http://technet.microsoft.com/en-us/library/dd569084(v=WS.10).aspx">learn
more</a></li>
          <li>
Scope = a regular expression to the file which needs to be modified</li>
          <li>
Match = an XPath expression to the attribute/element to be updated</li>
          <li>
Description = optional description (this will show up in the IIS manager if the pkg
is imported)</li>
          <li>
DefaultValue = optional default value for the for the parameter</li>
          <li>
Tags = optional, for connection strings use SqlConnectionString</li>
        </ul>
        <p>
After you create this file you will need to close/re-open VS (it caches imported .targets
files). Then you can create a web deploy package. When you do so these new parameters
will be declared. In my case I then imported this in the IIS manager and here is the
dialog which shows up for the parameters.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/VS-Web-Publish-How-to-parameteriz.config_C47E/SNAGHTML94cce08.png">
            <img title="SNAGHTML94cce08" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="SNAGHTML94cce08" src="http://sedodream.com/content/binary/Windows-Live-Writer/VS-Web-Publish-How-to-parameteriz.config_C47E/SNAGHTML94cce08_thumb.png" width="691" height="525" />
          </a>
        </p>
        <p>
As you can see the Application Path parameter is shown there as well as my custom
connection string values. When I update the values in the text box and opened connectionStrings.config
on my web server they were the values I entered in the dialog box.
</p>
        <p>
FYI I have uploaded this sample to my github account at <a href="https://github.com/sayedihashimi/sayed-samples/tree/master/ParameterizeConStringConfig">ParameterizeConStringConfig</a>.
</p>
        <p>
Sayed Ibrahim Hashimi <a href="http://twitter.com/sayedihashimi">@SayedIHashimi</a></p>
      </body>
      <title>VS Web Publish: How to parameterize connection strings outside of web.config</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,604eadfe-46bf-4989-bac8-814e2701e52a.aspx</guid>
      <link>http://sedodream.com/2012/05/13/VSWebPublishHowToParameterizeConnectionStringsOutsideOfWebconfig.aspx</link>
      <pubDate>Sun, 13 May 2012 21:18:03 GMT</pubDate>
      <description>&lt;p&gt;
If you have used the Visual Studio web publish in either VS 2010 or VS 11 to create
Web Deploy packages then you probably know that we parameterize connection strings
in web.config automatically. In case you are not familiar with Web Deploy parameters,
they are a way to declare that you want to easily be able to update a value of something
when publishing the package later on. Connection strings are good examples of something
which typically needs to be updated during publish.
&lt;/p&gt;
&lt;p&gt;
As I previously stated if you create a Web Deploy package in Visual Studio we will
automatically create Web Deploy parameters for all your connection strings in web.config.
Earlier today I saw a &lt;a href="http://stackoverflow.com/questions/10411326/how-to-convert-configsource-to-inline-elements-in-web-config-on-transformation"&gt;question
on StackOverflow asking how to parameterize connection strings in non-web.config&lt;/a&gt; files
(&lt;em&gt;question actually asked something else, but I think this is what he’s really
wanting&lt;/em&gt;). I created a sample showing how to do this. Below is what the connectionStrings
element looks like in web.config.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;connectionStrings configSource=&amp;quot;connectionStrings.config&amp;quot; /&amp;gt;&lt;/pre&gt;
&lt;p&gt;
And here is connectionStrings.config
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;
&amp;lt;connectionStrings&amp;gt;
  &amp;lt;clear/&amp;gt;
  &amp;lt;add name=&amp;quot;ApplicationServices&amp;quot;
           connectionString=&amp;quot;data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true&amp;quot;
           providerName=&amp;quot;System.Data.SqlClient&amp;quot; /&amp;gt;
  &amp;lt;add name=&amp;quot;OtherConnectionString&amp;quot;
       connectionString=&amp;quot;data source=.\SQLExpress;Integrated Security=SSPI;Initial Catalog=foo&amp;quot;
       providerName=&amp;quot;System.Data.SqlClient&amp;quot;/&amp;gt;
&amp;lt;/connectionStrings&amp;gt;&lt;/pre&gt;
&lt;p&gt;
In order to parameterize these connection strings you will have to extend the Web
Publish Pipeline. To do that create a file named &lt;strong&gt;{project-name}.wpp.targets&lt;/strong&gt; in
the root of the project in which you are working (for VS 11 projects you can place
all this directly inside of the .pubxml files). This will be an MSBuild file which
will get imported into the build/publish process. Below is the file which needs to
be created.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;

  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;!-- Here we need to declare MSDeploy parameters for connection strings in connectionStrings.config --&amp;gt;
    &amp;lt;MsDeployDeclareParameters Include=&amp;quot;ApplicationServices-ConnectionString&amp;quot; &amp;gt;
      &amp;lt;Kind&amp;gt;XmlFile&amp;lt;/Kind&amp;gt;
      &amp;lt;Scope&amp;gt;connectionStrings.config$&amp;lt;/Scope&amp;gt;
      &amp;lt;Match&amp;gt;/connectionStrings/add[@name='ApplicationServices']/@connectionString&amp;lt;/Match&amp;gt;
      &amp;lt;Description&amp;gt;Connection string for ApplicationServices&amp;lt;/Description&amp;gt;
      &amp;lt;DefaultValue&amp;gt;data source=(localhost);Initial Catalog=AppServices&amp;lt;/DefaultValue&amp;gt;
      &amp;lt;Tags&amp;gt;SqlConnectionString&amp;lt;/Tags&amp;gt;
    &amp;lt;/MsDeployDeclareParameters&amp;gt;

    &amp;lt;MsDeployDeclareParameters Include=&amp;quot;OtherConnectionString-ConnectionString&amp;quot; &amp;gt;
      &amp;lt;Kind&amp;gt;XmlFile&amp;lt;/Kind&amp;gt;
      &amp;lt;Scope&amp;gt;connectionStrings.config$&amp;lt;/Scope&amp;gt;
      &amp;lt;Match&amp;gt;/connectionStrings/add[@name='OtherConnectionString']/@connectionString&amp;lt;/Match&amp;gt;
      &amp;lt;Description&amp;gt;Connection string for OtherConnectionString&amp;lt;/Description&amp;gt;
      &amp;lt;DefaultValue&amp;gt;data source=(localhost);Initial Catalog=OtherDb&amp;lt;/DefaultValue&amp;gt;
      &amp;lt;Tags&amp;gt;SqlConnectionString&amp;lt;/Tags&amp;gt;
    &amp;lt;/MsDeployDeclareParameters&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;

&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Here you can see that I am creating values for MSDeployDeclareParameters. When you
package/publish this item list is used to create the MSDeploy parameters. Below is
an explanation of the metadata values each contain.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Kind = for this case it will always be Xmlfile, &lt;a href="http://technet.microsoft.com/en-us/library/dd569084(v=WS.10).aspx"&gt;learn
more&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
Scope = a regular expression to the file which needs to be modified&lt;/li&gt;
&lt;li&gt;
Match = an XPath expression to the attribute/element to be updated&lt;/li&gt;
&lt;li&gt;
Description = optional description (this will show up in the IIS manager if the pkg
is imported)&lt;/li&gt;
&lt;li&gt;
DefaultValue = optional default value for the for the parameter&lt;/li&gt;
&lt;li&gt;
Tags = optional, for connection strings use SqlConnectionString&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
After you create this file you will need to close/re-open VS (it caches imported .targets
files). Then you can create a web deploy package. When you do so these new parameters
will be declared. In my case I then imported this in the IIS manager and here is the
dialog which shows up for the parameters.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/VS-Web-Publish-How-to-parameteriz.config_C47E/SNAGHTML94cce08.png"&gt;&lt;img title="SNAGHTML94cce08" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="SNAGHTML94cce08" src="http://sedodream.com/content/binary/Windows-Live-Writer/VS-Web-Publish-How-to-parameteriz.config_C47E/SNAGHTML94cce08_thumb.png" width="691" height="525" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
As you can see the Application Path parameter is shown there as well as my custom
connection string values. When I update the values in the text box and opened connectionStrings.config
on my web server they were the values I entered in the dialog box.
&lt;/p&gt;
&lt;p&gt;
FYI I have uploaded this sample to my github account at &lt;a href="https://github.com/sayedihashimi/sayed-samples/tree/master/ParameterizeConStringConfig"&gt;ParameterizeConStringConfig&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi &lt;a href="http://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,604eadfe-46bf-4989-bac8-814e2701e52a.aspx</comments>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
      <category>MSDeploy</category>
      <category>Visual Studio</category>
      <category>Web Deployment Tool</category>
      <category>Web Publishing Pipeline</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=c2bf4342-0153-4f4f-aefe-15abb73f400f</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,c2bf4342-0153-4f4f-aefe-15abb73f400f.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,c2bf4342-0153-4f4f-aefe-15abb73f400f.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c2bf4342-0153-4f4f-aefe-15abb73f400f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In case you are not familiar with <a href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5">SlowCheetah</a>,
it is a Visual Studio extension which allows you to transform app.config files in
the same way that web.config files are. More info on the project page <a href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5">http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5</a>.
</p>
        <p>
I wanted to let everyone know that I have updated <a href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5">SlowCheetah</a> to
support Visual Studio 11 and I have also placed the project on github at <a href="https://github.com/sayedihashimi/slow-cheetah">https://github.com/sayedihashimi/slow-cheetah</a>.
Regarding the VS 11 support there is one known issue that we currently <a href="https://github.com/sayedihashimi/slow-cheetah/issues/1">do
not support the preview functionality on VS 11</a>. This is an item which we will
be fixing for the next release.
</p>
        <p>
 
</p>
        <p>
Thanks, 
<br />
Sayed Ibrahim Hashimi <a href="http://twitter.com/sayedihashimi">@SayedIHashimi</a></p>
        <p>
          <em>Reminder: even though I work for Microsoft this is a personal project and not
formally affiliated with Microsoft</em>
        </p>
      </body>
      <title>SlowCheetah VS 11 support and now on github</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,c2bf4342-0153-4f4f-aefe-15abb73f400f.aspx</guid>
      <link>http://sedodream.com/2012/04/27/SlowCheetahVS11SupportAndNowOnGithub.aspx</link>
      <pubDate>Fri, 27 Apr 2012 18:52:02 GMT</pubDate>
      <description>&lt;p&gt;
In case you are not familiar with &lt;a href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5"&gt;SlowCheetah&lt;/a&gt;,
it is a Visual Studio extension which allows you to transform app.config files in
the same way that web.config files are. More info on the project page &lt;a href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5"&gt;http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I wanted to let everyone know that I have updated &lt;a href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5"&gt;SlowCheetah&lt;/a&gt; to
support Visual Studio 11 and I have also placed the project on github at &lt;a href="https://github.com/sayedihashimi/slow-cheetah"&gt;https://github.com/sayedihashimi/slow-cheetah&lt;/a&gt;.
Regarding the VS 11 support there is one known issue that we currently &lt;a href="https://github.com/sayedihashimi/slow-cheetah/issues/1"&gt;do
not support the preview functionality on VS 11&lt;/a&gt;. This is an item which we will
be fixing for the next release.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Thanks, 
&lt;br /&gt;
Sayed Ibrahim Hashimi &lt;a href="http://twitter.com/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Reminder: even though I work for Microsoft this is a personal project and not
formally affiliated with Microsoft&lt;/em&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,c2bf4342-0153-4f4f-aefe-15abb73f400f.aspx</comments>
      <category>MSBuild</category>
      <category>SlowCheetah</category>
      <category>Visual Studio 11</category>
      <category>Visual Studio 2010</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=f623d885-ebb6-45c8-b0a3-f2d91e400d26</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,f623d885-ebb6-45c8-b0a3-f2d91e400d26.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,f623d885-ebb6-45c8-b0a3-f2d91e400d26.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f623d885-ebb6-45c8-b0a3-f2d91e400d26</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A couple months ago I <a href="http://sedodream.com/2011/12/24/PackageOncePublishAnywhere.aspx" target="_blank">blogged
about a Package-Web</a> which is a NuGet package that extends the web packaging process
in Visual Studio to enable you to create a single package which can be published to
multiple environments (<em>it captures all of your web.config transforms and has the
ability to transform on non-dev machines</em>). Since that release I have updated
the project and tonight I created a video which shows the features a bit you can <a href="http://youtu.be/-LvUJFI8CzM" target="_blank">check
it out on Youtube</a>. It’s embedded below.
</p>
        <iframe height="315" src="http://www.youtube.com/embed/-LvUJFI8CzM" frameborder="0" width="560" allowfullscreen="allowfullscreen">
        </iframe>
        <p>
          <strong>
            <font size="3">You can install this via NuGet, the package name is PackageWeb.</font>
          </strong>
        </p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/Package-web-updated-and-video-below_1440C/image_2.png">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/Package-web-updated-and-video-below_1440C/image_thumb.png" width="745" height="71" />
          </a>
        </p>
        <p>
Package-Web is an open source project and you can find it on my github account at <a href="https://github.com/sayedihashimi/package-web">https://github.com/sayedihashimi/package-web</a>.
</p>
        <p>
Thanks, 
<br />
Sayed Ibrahim Hashimi <a href="https://twitter.com/#!/sayedihashimi" target="_blank">@SayedIHashimi</a></p>
      </body>
      <title>Package web updated and video below</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,f623d885-ebb6-45c8-b0a3-f2d91e400d26.aspx</guid>
      <link>http://sedodream.com/2012/03/14/PackageWebUpdatedAndVideoBelow.aspx</link>
      <pubDate>Wed, 14 Mar 2012 06:08:57 GMT</pubDate>
      <description>&lt;p&gt;
A couple months ago I &lt;a href="http://sedodream.com/2011/12/24/PackageOncePublishAnywhere.aspx" target="_blank"&gt;blogged
about a Package-Web&lt;/a&gt; which is a NuGet package that extends the web packaging process
in Visual Studio to enable you to create a single package which can be published to
multiple environments (&lt;em&gt;it captures all of your web.config transforms and has the
ability to transform on non-dev machines&lt;/em&gt;). Since that release I have updated
the project and tonight I created a video which shows the features a bit you can &lt;a href="http://youtu.be/-LvUJFI8CzM" target="_blank"&gt;check
it out on Youtube&lt;/a&gt;. It’s embedded below.
&lt;/p&gt;
&lt;iframe height="315" src="http://www.youtube.com/embed/-LvUJFI8CzM" frameborder="0" width="560" allowfullscreen="allowfullscreen"&gt;
&lt;/iframe&gt;
&lt;p&gt;
&lt;strong&gt;&lt;font size="3"&gt;You can install this via NuGet, the package name is PackageWeb.&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/Package-web-updated-and-video-below_1440C/image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/Package-web-updated-and-video-below_1440C/image_thumb.png" width="745" height="71" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Package-Web is an open source project and you can find it on my github account at &lt;a href="https://github.com/sayedihashimi/package-web"&gt;https://github.com/sayedihashimi/package-web&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Thanks, 
&lt;br /&gt;
Sayed Ibrahim Hashimi &lt;a href="https://twitter.com/#!/sayedihashimi" target="_blank"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,f623d885-ebb6-45c8-b0a3-f2d91e400d26.aspx</comments>
      <category>MSBuild</category>
      <category>MSDeploy</category>
      <category>Visual Studio</category>
      <category>web</category>
      <category>Web Deployment Tool</category>
      <category>Web Development</category>
      <category>Web Publishing Pipeline</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=d9d1333e-0ff0-4fb4-b92a-72631e92442f</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,d9d1333e-0ff0-4fb4-b92a-72631e92442f.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,d9d1333e-0ff0-4fb4-b92a-72631e92442f.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d9d1333e-0ff0-4fb4-b92a-72631e92442f</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The other day I saw a question on StackOverflow (link in resources below) asking How
you can create a Web Deploy (AKA MSDeploy) package when publishing a ClickOnce project.
The easiest way to do this is to use the Web Deploy command line utility, msdeploy.exe.
With the command line you can easily create an MSDeploy package from a folder with
a command like the following:
</p>
        <pre class="brush: csharp;">    %msdeploy% 
      -verb:sync 
      -source:contentPath="C:\Temp\_NET\WebPackageWithClickOnce\WebPackageWithClickOnce\bin\Debug\app.publish" 
      -dest:package="C:\Temp\_NET\WebPackageWithClickOnce\WebPackageWithClickOnce\bin\Debug\co-pkg.zip"</pre>
        <p>
 
</p>
        <p>
Here you can see that I’m using the sync verb, along with a contentPath provider (<em>which
points to a folder</em>) as the source and the destination is using the package provider,
this point to where I want the package to be stored.
</p>
        <p>
Now that we understand how to create an MSDeploy package from a folder we need to
extend the ClickOnce publish process to create a package. I’m not a ClickOnce expert,
but the ClickOnce publish process is captured in MSBuild so after investigating for
a bit I found the following relevant details.
</p>
        <ul>
          <li>
The ClickOnce publish process is contained in the Microsoft.Common.targets file</li>
          <li>
The ClickOnce publish process is tied together through the <strong>Publish</strong> target</li>
          <li>
ClickOnce prepares the files to be published in a folder under bin named app.publish
which is governed by the MSBuild property <strong>PublishDir</strong></li>
        </ul>
        <p>
Now that we know what target to extend as well as what property we can use to refer
to the folder which has the content we can complete sample. We need to edit the project
file. Below is the full contents which I have placed at the bottom of the project
file (right above &lt;/Project&gt;).
</p>
        <pre class="brush: xml;">  &lt;PropertyGroup&gt;
    &lt;WebDeployPackageName Condition=" '$(WebDeployPackageName)'=='' "&gt;$(MSBuildProjectName).zip&lt;/WebDeployPackageName&gt;
    &lt;!--Unless specified otherwise, the tools will go to HKLM\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\1 to get the installpath for msdeploy.exe.--&gt;
    &lt;MSDeployPath Condition="'$(MSDeployPath)'==''"&gt;$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\3@InstallPath)&lt;/MSDeployPath&gt;
    &lt;MSDeployPath Condition="'$(MSDeployPath)'==''"&gt;$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\2@InstallPath)&lt;/MSDeployPath&gt;
    &lt;MSDeployPath Condition="'$(MSDeployPath)'==''"&gt;$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\1@InstallPath)&lt;/MSDeployPath&gt;
    &lt;MSDeployExe Condition=" '$(MSDeployExe)'=='' "&gt;$(MSDeployPath)msdeploy.exe&lt;/MSDeployExe&gt;
  &lt;/PropertyGroup&gt;
  &lt;Target Name="CreateWebDeployPackage" AfterTargets="Publish" DependsOnTargets="Publish"&gt;
    &lt;!--
    %msdeploy% 
      -verb:sync 
      -source:contentPath="C:\Temp\_NET\WebPackageWithClickOnce\WebPackageWithClickOnce\bin\Debug\app.publish" 
      -dest:package="C:\Temp\_NET\WebPackageWithClickOnce\WebPackageWithClickOnce\bin\Debug\co-pkg.zip"
      --&gt;
    &lt;PropertyGroup&gt;
      &lt;Cmd&gt;"$(MSDeployExe)" -verb:sync -source:contentPath="$(MSBuildProjectDirectory)\$(PublishDir)" -dest:package="$(OutDir)$(WebDeployPackageName)"&lt;/Cmd&gt;
    &lt;/PropertyGroup&gt;
    &lt;Message Text="Creating web deploy package with command: $(Cmd)" /&gt;
    &lt;Exec Command="$(Cmd)" /&gt;
  &lt;/Target&gt;</pre>
        <p>
Here I’ve created a couple properties as well as a new target, CreateWebDeployPackage.
I have declared the property WebDeployPackageName which will be the name (excluding
path) of the Web Deploy package which gets created. This defaults to the name of the
project, but you can override it if you want. Next I define the property, MSDeployPath,
which points to msdeploy.exe. It will pick the latest version.
</p>
        <p>
The CreateWebDeployPackage target just constructs the full command line call which
needs to be executed and invokes it using the Exec MSBuild task. There are a couple
subtle details on the target itself though which are worth pointing out. The target
has declared <strong>AfterTargets=”Publish”</strong> which means that it will be invoked
after the Publish target. It also declares <strong>DependsOnTargets=”Publish”</strong>.
Which means that whenever the target gets invoked that Publish will need to be executed
before <strong>CreateWebDeployPackage</strong>. 
</p>
        <p>
Now that we have defined these updates when you publish your ClickOnce project (wither
through Visual Studio or the command line/build servers) a Web Deploy package will
be generated in the output folder which you can use to incrementally publish your
ClickOnce app to your web server. You can find the latest version of this sample on
my <a href="https://github.com/sayedihashimi/sayed-samples/tree/master/ClickOnceCreateWebPackage">github
repository</a>.
</p>
        <p>
Sayed Ibrahim Hashimi <a href="https://twitter.com/#!/sayedihashimi">@SayedIHashimi</a></p>
        <p>
Resources
</p>
        <ul>
          <li>
StackOverflow question: <a href="http://stackoverflow.com/q/9292986/105999">Create
a clickonce webdeploy package</a></li>
          <li>
            <a href="http://technet.microsoft.com/en-us/library/dd569106(WS.10).aspx">MSDeploy.exe
verb</a>
          </li>
          <li>
            <a href="http://technet.microsoft.com/en-us/library/dd569034(WS.10).aspx">MSDeploy
contentPath provider</a>
          </li>
          <li>
            <a href="http://technet.microsoft.com/en-us/library/dd569019(WS.10).aspx">MSDeploy
package provider</a>
          </li>
          <li>
            <a href="http://msdn.microsoft.com/en-us/library/x8zx72cd.aspx">MSBuild Exec task</a>
          </li>
        </ul>
      </body>
      <title>How to create a Web Deploy package when publishing a ClickOnce project</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,d9d1333e-0ff0-4fb4-b92a-72631e92442f.aspx</guid>
      <link>http://sedodream.com/2012/02/18/HowToCreateAWebDeployPackageWhenPublishingAClickOnceProject.aspx</link>
      <pubDate>Sat, 18 Feb 2012 18:47:30 GMT</pubDate>
      <description>&lt;p&gt;
The other day I saw a question on StackOverflow (link in resources below) asking How
you can create a Web Deploy (AKA MSDeploy) package when publishing a ClickOnce project.
The easiest way to do this is to use the Web Deploy command line utility, msdeploy.exe.
With the command line you can easily create an MSDeploy package from a folder with
a command like the following:
&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;    %msdeploy% 
      -verb:sync 
      -source:contentPath=&amp;quot;C:\Temp\_NET\WebPackageWithClickOnce\WebPackageWithClickOnce\bin\Debug\app.publish&amp;quot; 
      -dest:package=&amp;quot;C:\Temp\_NET\WebPackageWithClickOnce\WebPackageWithClickOnce\bin\Debug\co-pkg.zip&amp;quot;&lt;/pre&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Here you can see that I’m using the sync verb, along with a contentPath provider (&lt;em&gt;which
points to a folder&lt;/em&gt;) as the source and the destination is using the package provider,
this point to where I want the package to be stored.
&lt;/p&gt;
&lt;p&gt;
Now that we understand how to create an MSDeploy package from a folder we need to
extend the ClickOnce publish process to create a package. I’m not a ClickOnce expert,
but the ClickOnce publish process is captured in MSBuild so after investigating for
a bit I found the following relevant details.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
The ClickOnce publish process is contained in the Microsoft.Common.targets file&lt;/li&gt;
&lt;li&gt;
The ClickOnce publish process is tied together through the &lt;strong&gt;Publish&lt;/strong&gt; target&lt;/li&gt;
&lt;li&gt;
ClickOnce prepares the files to be published in a folder under bin named app.publish
which is governed by the MSBuild property &lt;strong&gt;PublishDir&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Now that we know what target to extend as well as what property we can use to refer
to the folder which has the content we can complete sample. We need to edit the project
file. Below is the full contents which I have placed at the bottom of the project
file (right above &amp;lt;/Project&amp;gt;).
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;WebDeployPackageName Condition=&amp;quot; '$(WebDeployPackageName)'=='' &amp;quot;&amp;gt;$(MSBuildProjectName).zip&amp;lt;/WebDeployPackageName&amp;gt;
    &amp;lt;!--Unless specified otherwise, the tools will go to HKLM\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\1 to get the installpath for msdeploy.exe.--&amp;gt;
    &amp;lt;MSDeployPath Condition=&amp;quot;'$(MSDeployPath)'==''&amp;quot;&amp;gt;$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\3@InstallPath)&amp;lt;/MSDeployPath&amp;gt;
    &amp;lt;MSDeployPath Condition=&amp;quot;'$(MSDeployPath)'==''&amp;quot;&amp;gt;$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\2@InstallPath)&amp;lt;/MSDeployPath&amp;gt;
    &amp;lt;MSDeployPath Condition=&amp;quot;'$(MSDeployPath)'==''&amp;quot;&amp;gt;$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\1@InstallPath)&amp;lt;/MSDeployPath&amp;gt;
    &amp;lt;MSDeployExe Condition=&amp;quot; '$(MSDeployExe)'=='' &amp;quot;&amp;gt;$(MSDeployPath)msdeploy.exe&amp;lt;/MSDeployExe&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
  &amp;lt;Target Name=&amp;quot;CreateWebDeployPackage&amp;quot; AfterTargets=&amp;quot;Publish&amp;quot; DependsOnTargets=&amp;quot;Publish&amp;quot;&amp;gt;
    &amp;lt;!--
    %msdeploy% 
      -verb:sync 
      -source:contentPath=&amp;quot;C:\Temp\_NET\WebPackageWithClickOnce\WebPackageWithClickOnce\bin\Debug\app.publish&amp;quot; 
      -dest:package=&amp;quot;C:\Temp\_NET\WebPackageWithClickOnce\WebPackageWithClickOnce\bin\Debug\co-pkg.zip&amp;quot;
      --&amp;gt;
    &amp;lt;PropertyGroup&amp;gt;
      &amp;lt;Cmd&amp;gt;&amp;quot;$(MSDeployExe)&amp;quot; -verb:sync -source:contentPath=&amp;quot;$(MSBuildProjectDirectory)\$(PublishDir)&amp;quot; -dest:package=&amp;quot;$(OutDir)$(WebDeployPackageName)&amp;quot;&amp;lt;/Cmd&amp;gt;
    &amp;lt;/PropertyGroup&amp;gt;
    &amp;lt;Message Text=&amp;quot;Creating web deploy package with command: $(Cmd)&amp;quot; /&amp;gt;
    &amp;lt;Exec Command=&amp;quot;$(Cmd)&amp;quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Here I’ve created a couple properties as well as a new target, CreateWebDeployPackage.
I have declared the property WebDeployPackageName which will be the name (excluding
path) of the Web Deploy package which gets created. This defaults to the name of the
project, but you can override it if you want. Next I define the property, MSDeployPath,
which points to msdeploy.exe. It will pick the latest version.
&lt;/p&gt;
&lt;p&gt;
The CreateWebDeployPackage target just constructs the full command line call which
needs to be executed and invokes it using the Exec MSBuild task. There are a couple
subtle details on the target itself though which are worth pointing out. The target
has declared &lt;strong&gt;AfterTargets=”Publish”&lt;/strong&gt; which means that it will be invoked
after the Publish target. It also declares &lt;strong&gt;DependsOnTargets=”Publish”&lt;/strong&gt;.
Which means that whenever the target gets invoked that Publish will need to be executed
before &lt;strong&gt;CreateWebDeployPackage&lt;/strong&gt;. 
&lt;/p&gt;
&lt;p&gt;
Now that we have defined these updates when you publish your ClickOnce project (wither
through Visual Studio or the command line/build servers) a Web Deploy package will
be generated in the output folder which you can use to incrementally publish your
ClickOnce app to your web server. You can find the latest version of this sample on
my &lt;a href="https://github.com/sayedihashimi/sayed-samples/tree/master/ClickOnceCreateWebPackage"&gt;github
repository&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi &lt;a href="https://twitter.com/#!/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Resources
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
StackOverflow question: &lt;a href="http://stackoverflow.com/q/9292986/105999"&gt;Create
a clickonce webdeploy package&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://technet.microsoft.com/en-us/library/dd569106(WS.10).aspx"&gt;MSDeploy.exe
verb&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://technet.microsoft.com/en-us/library/dd569034(WS.10).aspx"&gt;MSDeploy
contentPath provider&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://technet.microsoft.com/en-us/library/dd569019(WS.10).aspx"&gt;MSDeploy
package provider&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/x8zx72cd.aspx"&gt;MSBuild Exec task&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,d9d1333e-0ff0-4fb4-b92a-72631e92442f.aspx</comments>
      <category>ClickOnce</category>
      <category>IIS</category>
      <category>Microsoft</category>
      <category>MSBuild</category>
      <category>MSDeploy</category>
      <category>web</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=bc2ced18-9064-4f51-9167-05ec5595291c</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,bc2ced18-9064-4f51-9167-05ec5595291c.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,bc2ced18-9064-4f51-9167-05ec5595291c.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=bc2ced18-9064-4f51-9167-05ec5595291c</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I received a customer email asking how they can take their web application/site offline
for the entire duration that a publish is happening from Visual Studio. An easy way
to take your site offline is to drop an app_offline.htm file in the sites root directory.
For more info on that you can read ScottGu’s post, link in below in resources section.
Unfortunately Web Deploy itself doesn’t support this <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-sadsmile" alt="Sad smile" src="http://sedodream.com/content/binary/Windows-Live-Writer/c7d918859eb1_A669/wlEmoticon-sadsmile_2.png" />.
If you want Web Deploy (aka MSDeploy) to natively support this feature please vote
on it at <a href="http://aspnet.uservoice.com/forums/41199-general/suggestions/2499911-take-my-site-app-offline-during-publishing">http://aspnet.uservoice.com/forums/41199-general/suggestions/2499911-take-my-site-app-offline-during-publishing</a>. 
</p>
        <p>
Since Web Deploy doesn’t support this it’s going to be a bit more difficult and it
requires us to perform the following steps:
</p>
        <ol>
          <li>
Publish app_offline.htm</li>
          <li>
Publish the app, and ensure that app_offline.htm is contained inside the payload being
published</li>
          <li>
Delete app_offline.htm</li>
        </ol>
        <p>
#1 will take the app offline before the publish process  begins. 
<br />
#2 will ensure that when we publish that app_offline.htm is not deleted (and therefore
keep the app offline) 
<br />
#3 will delete the app_offline.htm and bring the site back online
</p>
        <p>
Now that we know what needs to be done let’s look at the implementation. First for
the easy part. Create a file in your Web Application Project (WAP) named app_offline-template.htm.
This will be the file which will end up being the app_offline.htm file on your target
server. If you leave it blank your users will get a generic message stating that the
app is offline, but it would be better for you to place <strong>static HTML</strong> (<em>no
ASP.NET markup</em>) inside of that file letting users know that the site will come
back up and whatever other info you think is relevant to your users. When you add
this file you should change the Build Action to None in the Properties grid. This
will make sure that this file itself is not published/packaged. Since the file ends
in .htm it will by default be published. See the image below.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/c7d918859eb1_A669/image_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/c7d918859eb1_A669/image_thumb.png" width="288" height="380" />
          </a>
        </p>
        <p>
Now for the hard part. For Web Application Projects we have a hook into the publish/package
process which we refer to as “wpp.targets”. If you want to extend your publish/package
process you can create a file named {ProjectName}.wpp.targets in the same folder as
the project file itself. Here is the file which I created you can copy and paste the
content into your wpp.targets file. I will explain the significant parts but wanted
to post the entire file for your convince. <em>Note: you can grab my latest version
of this file from my github repo, the link is in the resource section below.</em></p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
  &lt;Target Name="InitalizeAppOffline"&gt;
    &lt;!-- 
    This property needs to be declared inside of target because this is imported before
    the MSDeployPath property is defined as well as others --&gt;
    &lt;PropertyGroup&gt;
      &lt;MSDeployExe Condition=" '$(MSDeployExe)'=='' "&gt;$(MSDeployPath)msdeploy.exe&lt;/MSDeployExe&gt;
    &lt;/PropertyGroup&gt;    
  &lt;/Target&gt;

  &lt;PropertyGroup&gt;
    &lt;PublishAppOfflineToDest&gt;
      InitalizeAppOffline;
    &lt;/PublishAppOfflineToDest&gt;
  &lt;/PropertyGroup&gt;

  &lt;!--
    %msdeploy% 
      -verb:sync 
      -source:contentPath="C:\path\to\app_offline-template.htm" 
      -dest:contentPath="Default Web Site/AppOfflineDemo/app_offline.htm"
  --&gt;

  &lt;!--***********************************************************************
  Make sure app_offline-template.htm gets published as app_offline.htm
  ***************************************************************************--&gt;
  &lt;Target Name="PublishAppOfflineToDest" 
          BeforeTargets="MSDeployPublish" 
          DependsOnTargets="$(PublishAppOfflineToDest)"&gt;
    &lt;ItemGroup&gt;
      &lt;_AoPubAppOfflineSourceProviderSetting Include="contentPath"&gt;
        &lt;Path&gt;$(MSBuildProjectDirectory)\app_offline-template.htm&lt;/Path&gt;
        &lt;EncryptPassword&gt;$(DeployEncryptKey)&lt;/EncryptPassword&gt;
        &lt;WebServerAppHostConfigDirectory&gt;$(_MSDeploySourceWebServerAppHostConfigDirectory)&lt;/WebServerAppHostConfigDirectory&gt;
        &lt;WebServerManifest&gt;$(_MSDeploySourceWebServerManifest)&lt;/WebServerManifest&gt;
        &lt;WebServerDirectory&gt;$(_MSDeploySourceWebServerDirectory)&lt;/WebServerDirectory&gt;
      &lt;/_AoPubAppOfflineSourceProviderSetting&gt;

      &lt;_AoPubAppOfflineDestProviderSetting Include="contentPath"&gt;
        &lt;Path&gt;"$(DeployIisAppPath)/app_offline.htm"&lt;/Path&gt;
        &lt;ComputerName&gt;$(_PublishMsDeployServiceUrl)&lt;/ComputerName&gt;
        &lt;UserName&gt;$(UserName)&lt;/UserName&gt;
        &lt;Password&gt;$(Password)&lt;/Password&gt;
        &lt;EncryptPassword&gt;$(DeployEncryptKey)&lt;/EncryptPassword&gt;
        &lt;IncludeAcls&gt;False&lt;/IncludeAcls&gt;
        &lt;AuthType&gt;$(AuthType)&lt;/AuthType&gt;
        &lt;WebServerAppHostConfigDirectory&gt;$(_MSDeployDestinationWebServerAppHostConfigDirectory)&lt;/WebServerAppHostConfigDirectory&gt;
        &lt;WebServerManifest&gt;$(_MSDeployDestinationWebServerManifest)&lt;/WebServerManifest&gt;
        &lt;WebServerDirectory&gt;$(_MSDeployDestinationWebServerDirectory)&lt;/WebServerDirectory&gt;
      &lt;/_AoPubAppOfflineDestProviderSetting&gt;
    &lt;/ItemGroup&gt;

    &lt;MSdeploy
          MSDeployVersionsToTry="$(_MSDeployVersionsToTry)"
          Verb="sync"
          Source="@(_AoPubAppOfflineSourceProviderSetting)"
          Destination="@(_AoPubAppOfflineDestProviderSetting)"
          EnableRule="DoNotDeleteRule"
          AllowUntrusted="$(AllowUntrustedCertificate)"
          RetryAttempts="$(RetryAttemptsForDeployment)"
          SimpleSetParameterItems="@(_AoArchivePublishSetParam)"
          ExePath="$(MSDeployPath)" /&gt;
  &lt;/Target&gt;

  &lt;!--***********************************************************************
  Make sure app_offline-template.htm gets published as app_offline.htm
  ***************************************************************************--&gt;
  &lt;!-- We need to create a replace rule for app_offline-template.htm-&gt;app_offline.htm for when the app get's published --&gt;
  &lt;ItemGroup&gt;
    &lt;!-- Make sure not to include this file if a package is being created, so condition this on publishing --&gt;
    &lt;FilesForPackagingFromProject Include="app_offline-template.htm" Condition=" '$(DeployTarget)'=='MSDeployPublish' "&gt;
      &lt;DestinationRelativePath&gt;app_offline.htm&lt;/DestinationRelativePath&gt;
    &lt;/FilesForPackagingFromProject&gt;

    &lt;!-- This will prevent app_offline-template.htm from being published --&gt;
    &lt;MsDeploySkipRules Include="SkipAppOfflineTemplate"&gt;
      &lt;ObjectName&gt;filePath&lt;/ObjectName&gt;
      &lt;AbsolutePath&gt;app_offline-template.htm&lt;/AbsolutePath&gt;
    &lt;/MsDeploySkipRules&gt;
  &lt;/ItemGroup&gt;

  &lt;!--***********************************************************************
  When publish is completed we need to delete the app_offline.htm
  ***************************************************************************--&gt;
  &lt;Target Name="DeleteAppOffline" AfterTargets="MSDeployPublish"&gt;
    &lt;!--
    %msdeploy% 
      -verb:delete 
      -dest:contentPath="{IIS-Path}/app_offline.htm",computerName="...",username="...",password="..."
    --&gt;
    &lt;Message Text="************************************************************************" /&gt;
    &lt;Message Text="Calling MSDeploy to delete the app_offline.htm file" Importance="high" /&gt;
    &lt;Message Text="************************************************************************" /&gt;

    &lt;ItemGroup&gt;
      &lt;_AoDeleteAppOfflineDestProviderSetting Include="contentPath"&gt;
        &lt;Path&gt;$(DeployIisAppPath)/app_offline.htm&lt;/Path&gt;
        &lt;ComputerName&gt;$(_PublishMsDeployServiceUrl)&lt;/ComputerName&gt;
        &lt;UserName&gt;$(UserName)&lt;/UserName&gt;
        &lt;Password&gt;$(Password)&lt;/Password&gt;
        &lt;EncryptPassword&gt;$(DeployEncryptKey)&lt;/EncryptPassword&gt;
        &lt;AuthType&gt;$(AuthType)&lt;/AuthType&gt;
        &lt;WebServerAppHostConfigDirectory&gt;$(_MSDeployDestinationWebServerAppHostConfigDirectory)&lt;/WebServerAppHostConfigDirectory&gt;
        &lt;WebServerManifest&gt;$(_MSDeployDestinationWebServerManifest)&lt;/WebServerManifest&gt;
        &lt;WebServerDirectory&gt;$(_MSDeployDestinationWebServerDirectory)&lt;/WebServerDirectory&gt;
      &lt;/_AoDeleteAppOfflineDestProviderSetting&gt;
    &lt;/ItemGroup&gt;
    
    &lt;!-- 
    We cannot use the MSDeploy/VSMSDeploy tasks for delete so we have to call msdeploy.exe directly.
    When they support delete we can just pass in @(_AoDeleteAppOfflineDestProviderSetting) as the dest
    --&gt;
    &lt;PropertyGroup&gt;
      &lt;_Cmd&gt;"$(MSDeployExe)" -verb:delete -dest:contentPath="%(_AoDeleteAppOfflineDestProviderSetting.Path)"&lt;/_Cmd&gt;
      &lt;_Cmd Condition=" '%(_AoDeleteAppOfflineDestProviderSetting.ComputerName)' != '' "&gt;$(_Cmd),computerName="%(_AoDeleteAppOfflineDestProviderSetting.ComputerName)"&lt;/_Cmd&gt;
      &lt;_Cmd Condition=" '%(_AoDeleteAppOfflineDestProviderSetting.UserName)' != '' "&gt;$(_Cmd),username="%(_AoDeleteAppOfflineDestProviderSetting.UserName)"&lt;/_Cmd&gt;
      &lt;_Cmd Condition=" '%(_AoDeleteAppOfflineDestProviderSetting.Password)' != ''"&gt;$(_Cmd),password=$(Password)&lt;/_Cmd&gt;
      &lt;_Cmd Condition=" '%(_AoDeleteAppOfflineDestProviderSetting.AuthType)' != ''"&gt;$(_Cmd),authType="%(_AoDeleteAppOfflineDestProviderSetting.AuthType)"&lt;/_Cmd&gt;
    &lt;/PropertyGroup&gt;

    &lt;Exec Command="$(_Cmd)"/&gt;
  &lt;/Target&gt;  
&lt;/Project&gt;</pre>
        <h3>#1 Publish app_offline.htm
</h3>
        <p>
The implementation for #1 is contained inside the target PublishAppOfflineToDest.
The msdeploy.exe command that we need to get executed is.
</p>
        <p>
          <strong>msdeploy.exe 
<br />
    -source:contentPath='C:\Data\Personal\My Repo\sayed-samples\AppOfflineDemo01\AppOfflineDemo01\app_offline-template.htm' 
<br />
    -dest:contentPath='"Default Web Site/AppOfflineDemo/app_offline.htm"',UserName='sayedha',Password='password-here',ComputerName='computername-here',IncludeAcls='False',AuthType='NTLM'
-verb:sync -enableRule:DoNotDeleteRule</strong>
        </p>
        <p>
In order to do this I will leverage the MSDeploy task. Inside of the PublishAppOfflineToDest
target you can see how this is accomplished by creating an item for both the source
and destination.
</p>
        <h3>#2 Publish the app, and ensure that app_offline.htm is contained inside the payload
being published
</h3>
        <p>
This part is accomplished by the fragment
</p>
        <pre class="brush: xml;">  &lt;!--***********************************************************************
  Make sure app_offline-template.htm gets published as app_offline.htm
  ***************************************************************************--&gt;
  &lt;!-- We need to create a replace rule for app_offline-template.htm-&gt;app_offline.htm for when the app get's published --&gt;
  &lt;ItemGroup&gt;
    &lt;!-- Make sure not to include this file if a package is being created, so condition this on publishing --&gt;
    &lt;FilesForPackagingFromProject Include="app_offline-template.htm" Condition=" '$(DeployTarget)'=='MSDeployPublish' "&gt;
      &lt;DestinationRelativePath&gt;app_offline.htm&lt;/DestinationRelativePath&gt;
    &lt;/FilesForPackagingFromProject&gt;

    &lt;!-- This will prevent app_offline-template.htm from being published --&gt;
    &lt;MsDeploySkipRules Include="SkipAppOfflineTemplate"&gt;
      &lt;ObjectName&gt;filePath&lt;/ObjectName&gt;
      &lt;AbsolutePath&gt;app_offline-template.htm&lt;/AbsolutePath&gt;
    &lt;/MsDeploySkipRules&gt;
  &lt;/ItemGroup&gt;</pre>
        <p>
The item value for FilesForPackagingFromProject here will convert your app_offline-template.htm
to app_offline.htm in the folder from where the publish will be processed. Also there
is a condition on it so that it only happens during publish and not packaging. We
do not want app_offline-template.htm to be in the package (<em>but it’s not the end
of the world if it does either</em>).
</p>
        <p>
The element for MsDeploySkiprules will make sure that app_offline-template.htm itself
doesn’t get published. This may not be required but it shouldn’t hurt.
</p>
        <h3>#3 Delete app_offline.htm
</h3>
        <p>
Now that our app is published we need to delete the app_offline.htm file from the
dest web app. The msdeploy.exe command would be:
</p>
        <p>
%msdeploy% 
<br />
      -verb:delete 
<br />
      -dest:contentPath="{IIS-Path}/app_offline.htm",computerName="...",username="...",password="..." 
<br /></p>
        <p>
This is implemented inside of the DeleteAppOffline target. This target will automatically
get executed after the publish because I have included the attribute <strong>AfterTargets=”MSDeployPublish”</strong>.
In that target you can see that I am building up the msdeploy.exe command directly,
it looks like the MSDeploy task doesn’t support the delete verb. 
</p>
        <p>
If you do try this out please let me know if you run into any issues. I am thinking
to create a Nuget package from this so that you can just install that package. That
would take a bit of work so please let me know if you are interested in that.
</p>
        <h3>Resources
</h3>
        <ol>
          <li>
            <a href="https://github.com/sayedihashimi/sayed-samples/blob/master/AppOfflineDemo01/AppOfflineDemo01/AppOfflineDemo01.wpp.targets">The
latest version of my AppOffline wpp.targets file.</a>
          </li>
          <li>
            <a href="http://weblogs.asp.net/scottgu/archive/2006/04/09/442332.aspx">ScottGu’s
blog on app_offline.htm</a>
          </li>
        </ol>
        <p>
 
</p>
        <p>
Sayed Ibrahim Hashimi <a href="https://twitter.com/#!/sayedihashimi">@SayedIHashimi</a></p>
      </body>
      <title>How to take your web app offline during publishing</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,bc2ced18-9064-4f51-9167-05ec5595291c.aspx</guid>
      <link>http://sedodream.com/2012/01/08/HowToTakeYourWebAppOfflineDuringPublishing.aspx</link>
      <pubDate>Sun, 08 Jan 2012 20:44:39 GMT</pubDate>
      <description>&lt;p&gt;
I received a customer email asking how they can take their web application/site offline
for the entire duration that a publish is happening from Visual Studio. An easy way
to take your site offline is to drop an app_offline.htm file in the sites root directory.
For more info on that you can read ScottGu’s post, link in below in resources section.
Unfortunately Web Deploy itself doesn’t support this &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-sadsmile" alt="Sad smile" src="http://sedodream.com/content/binary/Windows-Live-Writer/c7d918859eb1_A669/wlEmoticon-sadsmile_2.png" /&gt;.
If you want Web Deploy (aka MSDeploy) to natively support this feature please vote
on it at &lt;a href="http://aspnet.uservoice.com/forums/41199-general/suggestions/2499911-take-my-site-app-offline-during-publishing"&gt;http://aspnet.uservoice.com/forums/41199-general/suggestions/2499911-take-my-site-app-offline-during-publishing&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Since Web Deploy doesn’t support this it’s going to be a bit more difficult and it
requires us to perform the following steps:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Publish app_offline.htm&lt;/li&gt;
&lt;li&gt;
Publish the app, and ensure that app_offline.htm is contained inside the payload being
published&lt;/li&gt;
&lt;li&gt;
Delete app_offline.htm&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
#1 will take the app offline before the publish process&amp;#160; begins. 
&lt;br /&gt;
#2 will ensure that when we publish that app_offline.htm is not deleted (and therefore
keep the app offline) 
&lt;br /&gt;
#3 will delete the app_offline.htm and bring the site back online
&lt;/p&gt;
&lt;p&gt;
Now that we know what needs to be done let’s look at the implementation. First for
the easy part. Create a file in your Web Application Project (WAP) named app_offline-template.htm.
This will be the file which will end up being the app_offline.htm file on your target
server. If you leave it blank your users will get a generic message stating that the
app is offline, but it would be better for you to place &lt;strong&gt;static HTML&lt;/strong&gt; (&lt;em&gt;no
ASP.NET markup&lt;/em&gt;) inside of that file letting users know that the site will come
back up and whatever other info you think is relevant to your users. When you add
this file you should change the Build Action to None in the Properties grid. This
will make sure that this file itself is not published/packaged. Since the file ends
in .htm it will by default be published. See the image below.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/c7d918859eb1_A669/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/c7d918859eb1_A669/image_thumb.png" width="288" height="380" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Now for the hard part. For Web Application Projects we have a hook into the publish/package
process which we refer to as “wpp.targets”. If you want to extend your publish/package
process you can create a file named {ProjectName}.wpp.targets in the same folder as
the project file itself. Here is the file which I created you can copy and paste the
content into your wpp.targets file. I will explain the significant parts but wanted
to post the entire file for your convince. &lt;em&gt;Note: you can grab my latest version
of this file from my github repo, the link is in the resource section below.&lt;/em&gt;
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;Project xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
  &amp;lt;Target Name=&amp;quot;InitalizeAppOffline&amp;quot;&amp;gt;
    &amp;lt;!-- 
    This property needs to be declared inside of target because this is imported before
    the MSDeployPath property is defined as well as others --&amp;gt;
    &amp;lt;PropertyGroup&amp;gt;
      &amp;lt;MSDeployExe Condition=&amp;quot; '$(MSDeployExe)'=='' &amp;quot;&amp;gt;$(MSDeployPath)msdeploy.exe&amp;lt;/MSDeployExe&amp;gt;
    &amp;lt;/PropertyGroup&amp;gt;    
  &amp;lt;/Target&amp;gt;

  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;PublishAppOfflineToDest&amp;gt;
      InitalizeAppOffline;
    &amp;lt;/PublishAppOfflineToDest&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;

  &amp;lt;!--
    %msdeploy% 
      -verb:sync 
      -source:contentPath=&amp;quot;C:\path\to\app_offline-template.htm&amp;quot; 
      -dest:contentPath=&amp;quot;Default Web Site/AppOfflineDemo/app_offline.htm&amp;quot;
  --&amp;gt;

  &amp;lt;!--***********************************************************************
  Make sure app_offline-template.htm gets published as app_offline.htm
  ***************************************************************************--&amp;gt;
  &amp;lt;Target Name=&amp;quot;PublishAppOfflineToDest&amp;quot; 
          BeforeTargets=&amp;quot;MSDeployPublish&amp;quot; 
          DependsOnTargets=&amp;quot;$(PublishAppOfflineToDest)&amp;quot;&amp;gt;
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;_AoPubAppOfflineSourceProviderSetting Include=&amp;quot;contentPath&amp;quot;&amp;gt;
        &amp;lt;Path&amp;gt;$(MSBuildProjectDirectory)\app_offline-template.htm&amp;lt;/Path&amp;gt;
        &amp;lt;EncryptPassword&amp;gt;$(DeployEncryptKey)&amp;lt;/EncryptPassword&amp;gt;
        &amp;lt;WebServerAppHostConfigDirectory&amp;gt;$(_MSDeploySourceWebServerAppHostConfigDirectory)&amp;lt;/WebServerAppHostConfigDirectory&amp;gt;
        &amp;lt;WebServerManifest&amp;gt;$(_MSDeploySourceWebServerManifest)&amp;lt;/WebServerManifest&amp;gt;
        &amp;lt;WebServerDirectory&amp;gt;$(_MSDeploySourceWebServerDirectory)&amp;lt;/WebServerDirectory&amp;gt;
      &amp;lt;/_AoPubAppOfflineSourceProviderSetting&amp;gt;

      &amp;lt;_AoPubAppOfflineDestProviderSetting Include=&amp;quot;contentPath&amp;quot;&amp;gt;
        &amp;lt;Path&amp;gt;&amp;quot;$(DeployIisAppPath)/app_offline.htm&amp;quot;&amp;lt;/Path&amp;gt;
        &amp;lt;ComputerName&amp;gt;$(_PublishMsDeployServiceUrl)&amp;lt;/ComputerName&amp;gt;
        &amp;lt;UserName&amp;gt;$(UserName)&amp;lt;/UserName&amp;gt;
        &amp;lt;Password&amp;gt;$(Password)&amp;lt;/Password&amp;gt;
        &amp;lt;EncryptPassword&amp;gt;$(DeployEncryptKey)&amp;lt;/EncryptPassword&amp;gt;
        &amp;lt;IncludeAcls&amp;gt;False&amp;lt;/IncludeAcls&amp;gt;
        &amp;lt;AuthType&amp;gt;$(AuthType)&amp;lt;/AuthType&amp;gt;
        &amp;lt;WebServerAppHostConfigDirectory&amp;gt;$(_MSDeployDestinationWebServerAppHostConfigDirectory)&amp;lt;/WebServerAppHostConfigDirectory&amp;gt;
        &amp;lt;WebServerManifest&amp;gt;$(_MSDeployDestinationWebServerManifest)&amp;lt;/WebServerManifest&amp;gt;
        &amp;lt;WebServerDirectory&amp;gt;$(_MSDeployDestinationWebServerDirectory)&amp;lt;/WebServerDirectory&amp;gt;
      &amp;lt;/_AoPubAppOfflineDestProviderSetting&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;

    &amp;lt;MSdeploy
          MSDeployVersionsToTry=&amp;quot;$(_MSDeployVersionsToTry)&amp;quot;
          Verb=&amp;quot;sync&amp;quot;
          Source=&amp;quot;@(_AoPubAppOfflineSourceProviderSetting)&amp;quot;
          Destination=&amp;quot;@(_AoPubAppOfflineDestProviderSetting)&amp;quot;
          EnableRule=&amp;quot;DoNotDeleteRule&amp;quot;
          AllowUntrusted=&amp;quot;$(AllowUntrustedCertificate)&amp;quot;
          RetryAttempts=&amp;quot;$(RetryAttemptsForDeployment)&amp;quot;
          SimpleSetParameterItems=&amp;quot;@(_AoArchivePublishSetParam)&amp;quot;
          ExePath=&amp;quot;$(MSDeployPath)&amp;quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;

  &amp;lt;!--***********************************************************************
  Make sure app_offline-template.htm gets published as app_offline.htm
  ***************************************************************************--&amp;gt;
  &amp;lt;!-- We need to create a replace rule for app_offline-template.htm-&amp;gt;app_offline.htm for when the app get's published --&amp;gt;
  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;!-- Make sure not to include this file if a package is being created, so condition this on publishing --&amp;gt;
    &amp;lt;FilesForPackagingFromProject Include=&amp;quot;app_offline-template.htm&amp;quot; Condition=&amp;quot; '$(DeployTarget)'=='MSDeployPublish' &amp;quot;&amp;gt;
      &amp;lt;DestinationRelativePath&amp;gt;app_offline.htm&amp;lt;/DestinationRelativePath&amp;gt;
    &amp;lt;/FilesForPackagingFromProject&amp;gt;

    &amp;lt;!-- This will prevent app_offline-template.htm from being published --&amp;gt;
    &amp;lt;MsDeploySkipRules Include=&amp;quot;SkipAppOfflineTemplate&amp;quot;&amp;gt;
      &amp;lt;ObjectName&amp;gt;filePath&amp;lt;/ObjectName&amp;gt;
      &amp;lt;AbsolutePath&amp;gt;app_offline-template.htm&amp;lt;/AbsolutePath&amp;gt;
    &amp;lt;/MsDeploySkipRules&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;

  &amp;lt;!--***********************************************************************
  When publish is completed we need to delete the app_offline.htm
  ***************************************************************************--&amp;gt;
  &amp;lt;Target Name=&amp;quot;DeleteAppOffline&amp;quot; AfterTargets=&amp;quot;MSDeployPublish&amp;quot;&amp;gt;
    &amp;lt;!--
    %msdeploy% 
      -verb:delete 
      -dest:contentPath=&amp;quot;{IIS-Path}/app_offline.htm&amp;quot;,computerName=&amp;quot;...&amp;quot;,username=&amp;quot;...&amp;quot;,password=&amp;quot;...&amp;quot;
    --&amp;gt;
    &amp;lt;Message Text=&amp;quot;************************************************************************&amp;quot; /&amp;gt;
    &amp;lt;Message Text=&amp;quot;Calling MSDeploy to delete the app_offline.htm file&amp;quot; Importance=&amp;quot;high&amp;quot; /&amp;gt;
    &amp;lt;Message Text=&amp;quot;************************************************************************&amp;quot; /&amp;gt;

    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;_AoDeleteAppOfflineDestProviderSetting Include=&amp;quot;contentPath&amp;quot;&amp;gt;
        &amp;lt;Path&amp;gt;$(DeployIisAppPath)/app_offline.htm&amp;lt;/Path&amp;gt;
        &amp;lt;ComputerName&amp;gt;$(_PublishMsDeployServiceUrl)&amp;lt;/ComputerName&amp;gt;
        &amp;lt;UserName&amp;gt;$(UserName)&amp;lt;/UserName&amp;gt;
        &amp;lt;Password&amp;gt;$(Password)&amp;lt;/Password&amp;gt;
        &amp;lt;EncryptPassword&amp;gt;$(DeployEncryptKey)&amp;lt;/EncryptPassword&amp;gt;
        &amp;lt;AuthType&amp;gt;$(AuthType)&amp;lt;/AuthType&amp;gt;
        &amp;lt;WebServerAppHostConfigDirectory&amp;gt;$(_MSDeployDestinationWebServerAppHostConfigDirectory)&amp;lt;/WebServerAppHostConfigDirectory&amp;gt;
        &amp;lt;WebServerManifest&amp;gt;$(_MSDeployDestinationWebServerManifest)&amp;lt;/WebServerManifest&amp;gt;
        &amp;lt;WebServerDirectory&amp;gt;$(_MSDeployDestinationWebServerDirectory)&amp;lt;/WebServerDirectory&amp;gt;
      &amp;lt;/_AoDeleteAppOfflineDestProviderSetting&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;
    
    &amp;lt;!-- 
    We cannot use the MSDeploy/VSMSDeploy tasks for delete so we have to call msdeploy.exe directly.
    When they support delete we can just pass in @(_AoDeleteAppOfflineDestProviderSetting) as the dest
    --&amp;gt;
    &amp;lt;PropertyGroup&amp;gt;
      &amp;lt;_Cmd&amp;gt;&amp;quot;$(MSDeployExe)&amp;quot; -verb:delete -dest:contentPath=&amp;quot;%(_AoDeleteAppOfflineDestProviderSetting.Path)&amp;quot;&amp;lt;/_Cmd&amp;gt;
      &amp;lt;_Cmd Condition=&amp;quot; '%(_AoDeleteAppOfflineDestProviderSetting.ComputerName)' != '' &amp;quot;&amp;gt;$(_Cmd),computerName=&amp;quot;%(_AoDeleteAppOfflineDestProviderSetting.ComputerName)&amp;quot;&amp;lt;/_Cmd&amp;gt;
      &amp;lt;_Cmd Condition=&amp;quot; '%(_AoDeleteAppOfflineDestProviderSetting.UserName)' != '' &amp;quot;&amp;gt;$(_Cmd),username=&amp;quot;%(_AoDeleteAppOfflineDestProviderSetting.UserName)&amp;quot;&amp;lt;/_Cmd&amp;gt;
      &amp;lt;_Cmd Condition=&amp;quot; '%(_AoDeleteAppOfflineDestProviderSetting.Password)' != ''&amp;quot;&amp;gt;$(_Cmd),password=$(Password)&amp;lt;/_Cmd&amp;gt;
      &amp;lt;_Cmd Condition=&amp;quot; '%(_AoDeleteAppOfflineDestProviderSetting.AuthType)' != ''&amp;quot;&amp;gt;$(_Cmd),authType=&amp;quot;%(_AoDeleteAppOfflineDestProviderSetting.AuthType)&amp;quot;&amp;lt;/_Cmd&amp;gt;
    &amp;lt;/PropertyGroup&amp;gt;

    &amp;lt;Exec Command=&amp;quot;$(_Cmd)&amp;quot;/&amp;gt;
  &amp;lt;/Target&amp;gt;  
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;h3&gt;#1 Publish app_offline.htm
&lt;/h3&gt;
&lt;p&gt;
The implementation for #1 is contained inside the target PublishAppOfflineToDest.
The msdeploy.exe command that we need to get executed is.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;msdeploy.exe 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; -source:contentPath='C:\Data\Personal\My Repo\sayed-samples\AppOfflineDemo01\AppOfflineDemo01\app_offline-template.htm' 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; -dest:contentPath='&amp;quot;Default Web Site/AppOfflineDemo/app_offline.htm&amp;quot;',UserName='sayedha',Password='password-here',ComputerName='computername-here',IncludeAcls='False',AuthType='NTLM'
-verb:sync -enableRule:DoNotDeleteRule&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
In order to do this I will leverage the MSDeploy task. Inside of the PublishAppOfflineToDest
target you can see how this is accomplished by creating an item for both the source
and destination.
&lt;/p&gt;
&lt;h3&gt;#2 Publish the app, and ensure that app_offline.htm is contained inside the payload
being published
&lt;/h3&gt;
&lt;p&gt;
This part is accomplished by the fragment
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;  &amp;lt;!--***********************************************************************
  Make sure app_offline-template.htm gets published as app_offline.htm
  ***************************************************************************--&amp;gt;
  &amp;lt;!-- We need to create a replace rule for app_offline-template.htm-&amp;gt;app_offline.htm for when the app get's published --&amp;gt;
  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;!-- Make sure not to include this file if a package is being created, so condition this on publishing --&amp;gt;
    &amp;lt;FilesForPackagingFromProject Include=&amp;quot;app_offline-template.htm&amp;quot; Condition=&amp;quot; '$(DeployTarget)'=='MSDeployPublish' &amp;quot;&amp;gt;
      &amp;lt;DestinationRelativePath&amp;gt;app_offline.htm&amp;lt;/DestinationRelativePath&amp;gt;
    &amp;lt;/FilesForPackagingFromProject&amp;gt;

    &amp;lt;!-- This will prevent app_offline-template.htm from being published --&amp;gt;
    &amp;lt;MsDeploySkipRules Include=&amp;quot;SkipAppOfflineTemplate&amp;quot;&amp;gt;
      &amp;lt;ObjectName&amp;gt;filePath&amp;lt;/ObjectName&amp;gt;
      &amp;lt;AbsolutePath&amp;gt;app_offline-template.htm&amp;lt;/AbsolutePath&amp;gt;
    &amp;lt;/MsDeploySkipRules&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;/pre&gt;
&lt;p&gt;
The item value for FilesForPackagingFromProject here will convert your app_offline-template.htm
to app_offline.htm in the folder from where the publish will be processed. Also there
is a condition on it so that it only happens during publish and not packaging. We
do not want app_offline-template.htm to be in the package (&lt;em&gt;but it’s not the end
of the world if it does either&lt;/em&gt;).
&lt;/p&gt;
&lt;p&gt;
The element for MsDeploySkiprules will make sure that app_offline-template.htm itself
doesn’t get published. This may not be required but it shouldn’t hurt.
&lt;/p&gt;
&lt;h3&gt;#3 Delete app_offline.htm
&lt;/h3&gt;
&lt;p&gt;
Now that our app is published we need to delete the app_offline.htm file from the
dest web app. The msdeploy.exe command would be:
&lt;/p&gt;
&lt;p&gt;
%msdeploy% 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -verb:delete 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -dest:contentPath=&amp;quot;{IIS-Path}/app_offline.htm&amp;quot;,computerName=&amp;quot;...&amp;quot;,username=&amp;quot;...&amp;quot;,password=&amp;quot;...&amp;quot; 
&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
This is implemented inside of the DeleteAppOffline target. This target will automatically
get executed after the publish because I have included the attribute &lt;strong&gt;AfterTargets=”MSDeployPublish”&lt;/strong&gt;.
In that target you can see that I am building up the msdeploy.exe command directly,
it looks like the MSDeploy task doesn’t support the delete verb. 
&lt;/p&gt;
&lt;p&gt;
If you do try this out please let me know if you run into any issues. I am thinking
to create a Nuget package from this so that you can just install that package. That
would take a bit of work so please let me know if you are interested in that.
&lt;/p&gt;
&lt;h3&gt;Resources
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/sayedihashimi/sayed-samples/blob/master/AppOfflineDemo01/AppOfflineDemo01/AppOfflineDemo01.wpp.targets"&gt;The
latest version of my AppOffline wpp.targets file.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://weblogs.asp.net/scottgu/archive/2006/04/09/442332.aspx"&gt;ScottGu’s
blog on app_offline.htm&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi &lt;a href="https://twitter.com/#!/sayedihashimi"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,bc2ced18-9064-4f51-9167-05ec5595291c.aspx</comments>
      <category>IIS</category>
      <category>Microsoft</category>
      <category>MSBuild</category>
      <category>MSDeploy</category>
      <category>Visual Studio 2010</category>
      <category>web</category>
      <category>Web Deployment Tool</category>
      <category>Web Publishing Pipeline</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=c0fa850a-7563-40de-a61a-c7501e28cd9f</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,c0fa850a-7563-40de-a61a-c7501e28cd9f.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,c0fa850a-7563-40de-a61a-c7501e28cd9f.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c0fa850a-7563-40de-a61a-c7501e28cd9f</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <strong>Please read my updated post, the info below is no longer required for some
scenarios <a href="http://sedodream.com/2012/12/24/SlowCheetahBuildServerSupportUpdated.aspx" target="_blank">SlowCheetah
build server support updated 
</a></strong>
        <p>
A few months ago I published a Visual Studio add-in, <a href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5" target="_blank">SlowCheetah
– XML Transforms</a>, which enables you to transform any XML file during a build in
the same way that you can transform the web.config during publish/package for web
projects. Since then I’ve received numerous requests to demonstrate how the transforms
can be kicked in from a CI server. It’s actually pretty easy because all the logic
from a transform perspective is contained inside of MSBuild tasks/targets. The Visual
Studio add-in itself is only delivering the support for gestures/preview.
</p>
        <p>
Before I dive into how to enable this for a CI server let me explain how the plugin
works and then the CI integration will be come much clearer. When you load a project/solution
in Visual Studio for the first time after you installed SlowCheetah a set of files
will be written to %localappdata%\Microsoft\MSBuild\SlowCheetah\v1. Those file are:
</p>
        <p>
 
</p>
        <table border="0" cellspacing="0" cellpadding="2" width="774">
          <tbody>
            <tr>
              <td valign="top" width="258">
                <p align="center">
                  <strong>Name</strong>
                </p>
              </td>
              <td valign="top" width="514">
                <p align="center">
                  <strong>Description</strong>
                </p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="258">
Install-Manifest.xml</td>
              <td valign="top" width="514">
An XML file which describes the files that are installed. This is used by the plugin
itself, you should never have to do anything with this file.</td>
            </tr>
            <tr>
              <td valign="top" width="258">
SlowCheetah.Tasks.dll</td>
              <td valign="top" width="514">
The assembly which contains the MSBuild task which transforms XML files.</td>
            </tr>
            <tr>
              <td valign="top" width="258">
SlowCheetah.Transforms.targets</td>
              <td valign="top" width="514">
The MSBuild file which enables XML file transformation</td>
            </tr>
          </tbody>
        </table>
        <p>
 
</p>
        <p>
The add-in adds the following menu command to any XML file for supported project types.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/S_121C9/image_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/S_121C9/image_thumb.png" width="359" height="144" />
          </a>
        </p>
        <p>
When you click on this for the first time the add-in needs to make some changes to
your project file so you are prompted to accept that. After you do the following changes
are applied to your project file.
</p>
        <ol>
          <li>
A new MSBuild property SlowCheetahTargets is added to the project and it points to
the SlowCheetah.transforms.targets file in %localappdata%</li>
          <li>
An import for that file is added</li>
        </ol>
        <p>
More specifically the elements added to your project file are.
</p>
        <pre class="brush: xml;">&lt;PropertyGroup&gt;
  &lt;SlowCheetahTargets Condition=" '$(SlowCheetahTargets)'=='' "&gt;$(LOCALAPPDATA)\Microsoft\MSBuild\SlowCheetah\v1\SlowCheetah.Transforms.targets&lt;/SlowCheetahTargets&gt;
&lt;/PropertyGroup&gt;

&lt;Import Project="$(SlowCheetahTargets)" Condition="Exists('$(SlowCheetahTargets)')" /&gt;</pre>
        <p>
          <em>Note: If you look at your project file they will not be next to each other. The
property will be towards the top of the project file and the import towards the bottom.</em>
        </p>
        <p>
So now you might have an idea of why this won’t work on your CI server, the file SlowCheetah.Transforms.targets
will not exist in the %localappdata% folder. There is an easy to way to fix this which
doesn’t require any changes to your CI server. Check in the files and update your
import. Here is what I did:
</p>
        <ol>
          <li>
Create a folder named SlowCheetah in the same folder as my solution</li>
          <li>
Added SlowCheetah.Tasks.dll and SlowCheetah.Transforms.targets to that folder</li>
          <li>
Create a solution folder named SlowCheetah in the solution</li>
          <li>
Drag and drop the files from your SlowCheetah folder into the SolutionFolder</li>
          <li>
Updated my project file to point to these files</li>
        </ol>
        <p>
Now your solution should look roughly like the following image.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/S_121C9/image_4.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/S_121C9/image_thumb_1.png" width="285" height="116" />
          </a>
        </p>
        <p>
          <em>Note: Steps #3/#4 are not strictly required</em>
        </p>
        <p>
For #5 you’ll have to edit your project file, don’t worry its an easy modification.
Just follow these steps:
</p>
        <ol>
          <li>
Right click on the project and select unload</li>
          <li>
Right click on the unloaded project and select Edit</li>
          <li>
Update the value for the SlowCheetahTargets import</li>
        </ol>
        <p>
In my case the folder that I placed the files into is 1 directory above the project
itself. So the new value for the property is as follows.
</p>
        <pre class="brush: xml;">&lt;SlowCheetahTargets&gt;$(MSBuildProjectDirectory)\..\SlowCheetah\SlowCheetah.Transforms.targets&lt;/SlowCheetahTargets&gt;</pre>
        <p>
After that I checked in all the files, kicked off a build and viola the files are
transformed. Let me know if you need any more info. 
<br /></p>
        <p>
Sayed Ibrahim Hashimi – <a href="http://twitter.com/sayedihashimi" target="_blank">@SayedIHashimi</a></p>
        <p>
          <em>Note: I work for Microsoft, but these are my own opinions</em>
        </p>
      </body>
      <title>SlowCheetah XML transforms from a CI server</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,c0fa850a-7563-40de-a61a-c7501e28cd9f.aspx</guid>
      <link>http://sedodream.com/2011/12/12/SlowCheetahXMLTransformsFromACIServer.aspx</link>
      <pubDate>Mon, 12 Dec 2011 05:02:42 GMT</pubDate>
      <description>
        &lt;strong&gt;Please read my updated post, the info below is no longer required
for some scenarios &lt;a href="http://sedodream.com/2012/12/24/SlowCheetahBuildServerSupportUpdated.aspx" target="_blank"&gt;SlowCheetah
build server support updated 
&lt;/strong&gt; 
&lt;p&gt;
A few months ago I published a Visual Studio add-in, &lt;a href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5" target="_blank"&gt;SlowCheetah
– XML Transforms&lt;/a&gt;, which enables you to transform any XML file during a build in
the same way that you can transform the web.config during publish/package for web
projects. Since then I’ve received numerous requests to demonstrate how the transforms
can be kicked in from a CI server. It’s actually pretty easy because all the logic
from a transform perspective is contained inside of MSBuild tasks/targets. The Visual
Studio add-in itself is only delivering the support for gestures/preview.
&lt;/p&gt;
&lt;p&gt;
Before I dive into how to enable this for a CI server let me explain how the plugin
works and then the CI integration will be come much clearer. When you load a project/solution
in Visual Studio for the first time after you installed SlowCheetah a set of files
will be written to %localappdata%\Microsoft\MSBuild\SlowCheetah\v1. Those file are:
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;table border="0" cellspacing="0" cellpadding="2" width="774"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="258"&gt;
&lt;p align="center"&gt;
&lt;strong&gt;Name&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="514"&gt;
&lt;p align="center"&gt;
&lt;strong&gt;Description&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="258"&gt;
Install-Manifest.xml&lt;/td&gt;
&lt;td valign="top" width="514"&gt;
An XML file which describes the files that are installed. This is used by the plugin
itself, you should never have to do anything with this file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="258"&gt;
SlowCheetah.Tasks.dll&lt;/td&gt;
&lt;td valign="top" width="514"&gt;
The assembly which contains the MSBuild task which transforms XML files.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="258"&gt;
SlowCheetah.Transforms.targets&lt;/td&gt;
&lt;td valign="top" width="514"&gt;
The MSBuild file which enables XML file transformation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
The add-in adds the following menu command to any XML file for supported project types.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/S_121C9/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/S_121C9/image_thumb.png" width="359" height="144" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
When you click on this for the first time the add-in needs to make some changes to
your project file so you are prompted to accept that. After you do the following changes
are applied to your project file.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
A new MSBuild property SlowCheetahTargets is added to the project and it points to
the SlowCheetah.transforms.targets file in %localappdata%&lt;/li&gt;
&lt;li&gt;
An import for that file is added&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
More specifically the elements added to your project file are.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;PropertyGroup&amp;gt;
  &amp;lt;SlowCheetahTargets Condition=&amp;quot; '$(SlowCheetahTargets)'=='' &amp;quot;&amp;gt;$(LOCALAPPDATA)\Microsoft\MSBuild\SlowCheetah\v1\SlowCheetah.Transforms.targets&amp;lt;/SlowCheetahTargets&amp;gt;
&amp;lt;/PropertyGroup&amp;gt;

&amp;lt;Import Project=&amp;quot;$(SlowCheetahTargets)&amp;quot; Condition=&amp;quot;Exists('$(SlowCheetahTargets)')&amp;quot; /&amp;gt;&lt;/pre&gt;
&lt;p&gt;
&lt;em&gt;Note: If you look at your project file they will not be next to each other. The
property will be towards the top of the project file and the import towards the bottom.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
So now you might have an idea of why this won’t work on your CI server, the file SlowCheetah.Transforms.targets
will not exist in the %localappdata% folder. There is an easy to way to fix this which
doesn’t require any changes to your CI server. Check in the files and update your
import. Here is what I did:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Create a folder named SlowCheetah in the same folder as my solution&lt;/li&gt;
&lt;li&gt;
Added SlowCheetah.Tasks.dll and SlowCheetah.Transforms.targets to that folder&lt;/li&gt;
&lt;li&gt;
Create a solution folder named SlowCheetah in the solution&lt;/li&gt;
&lt;li&gt;
Drag and drop the files from your SlowCheetah folder into the SolutionFolder&lt;/li&gt;
&lt;li&gt;
Updated my project file to point to these files&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Now your solution should look roughly like the following image.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/S_121C9/image_4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/S_121C9/image_thumb_1.png" width="285" height="116" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Note: Steps #3/#4 are not strictly required&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
For #5 you’ll have to edit your project file, don’t worry its an easy modification.
Just follow these steps:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Right click on the project and select unload&lt;/li&gt;
&lt;li&gt;
Right click on the unloaded project and select Edit&lt;/li&gt;
&lt;li&gt;
Update the value for the SlowCheetahTargets import&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
In my case the folder that I placed the files into is 1 directory above the project
itself. So the new value for the property is as follows.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;SlowCheetahTargets&amp;gt;$(MSBuildProjectDirectory)\..\SlowCheetah\SlowCheetah.Transforms.targets&amp;lt;/SlowCheetahTargets&amp;gt;&lt;/pre&gt;
&lt;p&gt;
After that I checked in all the files, kicked off a build and viola the files are
transformed. Let me know if you need any more info. 
&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi – &lt;a href="http://twitter.com/sayedihashimi" target="_blank"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Note: I work for Microsoft, but these are my own opinions&lt;/em&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,c0fa850a-7563-40de-a61a-c7501e28cd9f.aspx</comments>
      <category>MSBuild</category>
      <category>SlowCheetah</category>
      <category>Visual Studio</category>
      <category>Visual Studio 2010</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=7b98b9ee-5391-4ba5-9f64-bcbbe815035c</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,7b98b9ee-5391-4ba5-9f64-bcbbe815035c.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,7b98b9ee-5391-4ba5-9f64-bcbbe815035c.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=7b98b9ee-5391-4ba5-9f64-bcbbe815035c</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>Note: I’d like to thank Tom Dykstra for helping me put this together</em>
        </p>
        <h3>Overview
</h3>
        <p>
In this tutorial you'll see how to use a <em>web deployment package</em> package to
deploy an application. A deployment package is a <em>.zip</em> file that includes
all of the content and metadata that's required to deploy an application. 
</p>
        <p>
Deployment packages are often used in enterprise environments. This is because a developer
or a continuous integration server can create the package without needing to know
things like passwords that are stored in <em>Web.config</em> files. Only the server
administrator who actually installs the package needs to know those passwords, and
that person can enter the details at installation time.
</p>
        <p>
In a smaller organization that doesn't have separate people for these roles, there's
less need for deployment packages. But you can also use deployment packages as a way
to back up and restore the state of an application. After you use a deployment package
to deploy, you can save the package,. Then if a subsequent deployment has a problem,
you can quickly and easily restore the application state to the earlier state by reinstalling
the earlier package. (This scenario is more complicated if database changes are involved,
however.)
</p>
        <p>
This tutorial shows how to use Visual Studio to create a package and IIS Manager to
install it. For information about how to create and install packages using the command
line, see <a href="http://msdn.microsoft.com/en-us/library/bb386521.aspx">ASP.NET
Deployment Content Map</a> on the MSDN web site.
</p>
        <p>
To keep things relatively simple, this example assumes you have already deployed the
application and its databases, and you only need to deploy a code update. You have
made the code update, and you are ready to deploy it first to your test environment
(IIS on your local computer) and then to your hosting provider. You have a Test build
configuration that you use for the test environment and you use the Release build
configuration for the production environment. In the example, the name of the Visual
Studio project is ContosoUniversity, and instructions for its initial deployment can
be found in a series of tutorials that will be published in December on the ASP.NET
web site. 
</p>
        <p>
The hosting provider shown, Cytanium.com, is one of many that are available, and its
use here does not constitute an endorsement or recommendation.
</p>
        <blockquote>
          <p>
            <strong>Note</strong> The following example uses separate packages for the test and
production environments, but you can also create a single deployment package that
can be used for both environments. This would require that you use Web Deploy parameters
instead of <em>Web.config</em> transformations for <em>Web.config</em> file changes
that depend on deployment destination. For information about how to use Web Deploy
parameters, see <a href="http://msdn.microsoft.com/en-us/library/ff398068.aspx">How
to: Use Parameters to Configure Deployment Settings When a Package is Installed</a>.
</p>
        </blockquote>
        <h3>Configuring the Deployment Package
</h3>
        <p>
In this section, you'll configure settings for the deployment package. Some of these
settings are the same ones that you set also for one-click publish, others are only
for deployment packages. 
</p>
        <p>
Open the <strong>Package/Publish Web</strong> tab of the <strong>Project Properties</strong> window
and select the <strong>Test</strong> build configuration.
</p>
        <p>
For this deployment you aren't making any database changes, so clear <strong>Include
all databases configured in Package/Publish SQL tab</strong>. Make sure <strong>Exclude
files from the App_Data folder</strong> is selected.
</p>
        <p>
Review the settings in the section labeled <strong>Web Deployment Package Settings</strong>:
</p>
        <ul>
          <li>
By default, deployment packages are created as <em>.zip</em> files. You don't need
to change this setting. 
</li>
          <li>
By default, deployment packages are created in the project's <em>obj\Test\Package</em> folder.
You don't need to change this setting. 
</li>
          <li>
The default IIS web application name is the name of the project with "_deploy"
appended to it. Remove that suffix. You want the application to be named just ContosoUniversity
in IIS on your computer. 
</li>
          <li>
For this tutorial you're not deploying IIS settings, so you don't need to enter a
password for that. 
</li>
        </ul>
        <p>
The <strong>Package/Publish Web</strong> tab now looks like this:
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Package_Publish_Web_tab_Test_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Package_Publish_Web_tab_Test" border="0" alt="Package_Publish_Web_tab_Test" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Package_Publish_Web_tab_Test_thumb.png" width="632" height="767" />
          </a>
        </p>
        <p>
You also need to configure settings for deploying to the production environment. Select
the <strong>Release</strong> build configuration to do that.
</p>
        <p>
Change <strong>IIS Web site/application name to use on the destination server</strong> to
a string that will serve as a reminder of what you need to do later when this value
is displayed in the IIS Manager UI: "[clear this field]". The text box on
this page won't stay cleared even if you clear it, so entering this note to yourself
will remind you to clear this value later when you deploy. When you deploy to your
hosting provider, you will connect to a site, not to a server, and in this case you
want to deploy to the root of the site.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Package_Publish_Web_tab_Release_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Package_Publish_Web_tab_Release" border="0" alt="Package_Publish_Web_tab_Release" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Package_Publish_Web_tab_Release_thumb.png" width="634" height="769" />
          </a>
        </p>
        <h4>Creating a Deployment Package for the Test Environment
</h4>
        <p>
To create a deployment package, first make sure you've selected the right build configuration.
In the <strong>Solution Configurations</strong> drop-down box, select <strong>Test</strong>.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Solution_Configurations_dropdown_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Solution_Configurations_dropdown" border="0" alt="Solution_Configurations_dropdown" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Solution_Configurations_dropdown_thumb.png" width="559" height="95" />
          </a>
        </p>
        <p>
In <strong>Solution Explorer</strong>, right-click the project that you want to build
the package for and then select <strong>Build Deployment Package</strong>.
</p>
        <p>
The <strong>Output</strong> window reports successful a build and publish (package
creation) and tells you where the package was created.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Output_Window_package_creation_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Output_Window_package_creation" border="0" alt="Output_Window_package_creation" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Output_Window_package_creation_thumb.png" width="653" height="228" />
          </a>
        </p>
        <h4>Installing the Deployment Package in the Test Environment
</h4>
        <p>
The next step is to install the deployment package in IIS on your development computer. 
</p>
        <p>
Run <strong>IIS Manager</strong>. In the <strong>Connections</strong> pane of the <strong>IIS
Manager</strong> window, expand the local server node, expand the <strong>Sites</strong> node,
and select <strong>Default Web Site</strong>. Then in the <strong>Actions</strong> pane,
click <strong>Import Application</strong>. (If you don't see an <strong>Import Application</strong> link,
the most likely reason is that you have not installed Web Deploy. You can use the <a href="http://www.microsoft.com/web/downloads/platform.aspx">Web
Platform Installer</a> to install both IIS and Web Deploy.)
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Default_Web_Site_in_inetmgr_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Default_Web_Site_in_inetmgr" border="0" alt="Default_Web_Site_in_inetmgr" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Default_Web_Site_in_inetmgr_thumb.png" width="607" height="464" />
          </a>
        </p>
        <p>
In the <strong>Select the Package</strong> wizard step, navigate to the location of
the package you just created. By default, that's the <em>obj\Test\Package</em> folder
in your ContosoUniversity project folder. (A package created with the <strong>Release</strong> build
configuration would be in <em>obj\Release\Package</em>.)
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Package_dialog_box_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Select_the_Package_dialog_box" border="0" alt="Select_the_Package_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Package_dialog_box_thumb.png" width="650" height="500" />
          </a>
        </p>
        <p>
Click <strong>Next</strong>. The <strong>Select the Contents of the Package</strong> step
is displayed.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Contents_of_the_Package_dialog_box_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Select_the_Contents_of_the_Package_dialog_box" border="0" alt="Select_the_Contents_of_the_Package_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Contents_of_the_Package_dialog_box_thumb.png" width="650" height="500" />
          </a>
        </p>
        <p>
Click <strong>Next</strong>. 
</p>
        <p>
The step that allows you to enter parameter values is displayed. The <strong>Application
Path</strong> value defaults to "ContosoUniversity", because that's what
you entered on the <strong>Package/Publish Web</strong> tab of the <strong>Project
Properties</strong> window.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Enter_Application_Package_Information_dialog_box_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Enter_Application_Package_Information_dialog_box" border="0" alt="Enter_Application_Package_Information_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Enter_Application_Package_Information_dialog_box_thumb.png" width="650" height="500" />
          </a>
        </p>
        <p>
Click <strong>Next</strong>. 
</p>
        <p>
The wizard asks if you want to delete files at the destination that aren't in the
source. 
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Overwrite_Existing_Files_dialog_box_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Overwrite_Existing_Files_dialog_box" border="0" alt="Overwrite_Existing_Files_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Overwrite_Existing_Files_dialog_box_thumb.png" width="650" height="500" />
          </a>
        </p>
        <p>
In this case you haven't deleted any files that you want to delete at the destination,
so the default (no deletions) is okay. Click <strong>Next</strong>. 
</p>
        <p>
          <strong>IIS Manager</strong> installs the package and reports its status.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Installation_Progress_and_Summary_dialog_box_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Installation_Progress_and_Summary_dialog_box" border="0" alt="Installation_Progress_and_Summary_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Installation_Progress_and_Summary_dialog_box_thumb.png" width="650" height="500" />
          </a>
        </p>
        <p>
Click <strong>Finish</strong>. 
</p>
        <p>
Open a browser and run the application in test by going to the URL <code><a href="http://localhost/ContosoUniversity">http://localhost/ContosoUniversity</a></code>. 
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Instructors_page_with_separate_name_fields_Test_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Instructors_page_with_separate_name_fields_Test" border="0" alt="Instructors_page_with_separate_name_fields_Test" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Instructors_page_with_separate_name_fields_Test_thumb.png" width="653" height="336" />
          </a>
        </p>
        <h4>Installing IIS Manager for Remote Administration
</h4>
        <p>
The process for deploying to production is similar except that you create the package
using the Release build configuration, and you install it in <strong>IIS Manager</strong> using
a remote connection to the hosting provider. But first you have to install the <strong>IIS
Manager</strong> feature that facilitates remote connections.
</p>
        <p>
Click the following link to use the Web Platform Installer for this task:
</p>
        <ul>
          <li>
            <a href="http://go.microsoft.com/?linkid=9655670">IIS Manager for Remote Administration
v1.1</a>
          </li>
        </ul>
        <h4>Connecting to Your Site at the Hosting Provider
</h4>
        <p>
After you install the <strong>IIS Manager for Remote Administration</strong>, run <strong>IIS
Manager</strong>. You see a new <strong>Start Page</strong> in <strong>IIS Manager</strong> that
has several <strong>Connect to ...</strong> links in a <strong>Connection tasks</strong> box.
(These options are also available from the <strong>File</strong> menu.)
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/IIS_Manager_Remote_Admin_Start_Page_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IIS_Manager_Remote_Admin_Start_Page" border="0" alt="IIS_Manager_Remote_Admin_Start_Page" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/IIS_Manager_Remote_Admin_Start_Page_thumb.png" width="628" height="413" />
          </a>
        </p>
        <p>
In <strong>IIS Manager</strong>, click <strong>Connect to a site</strong>. In the <strong>Specify
Site Connection Details</strong> step, enter the <strong>Server name</strong> and <strong>Site
name</strong> values that are assigned to you by your provider, and then click <strong>Next</strong>.
For a hosting account at Cytanium.com, you get the server name from <strong>Service
URL</strong> in the Visual Studio 2010 section of the welcome email. The site name
is indicated by "Site/application" in the same section of the email. 
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Specify_Site_Connection_Details_dialog_box_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Specify_Site_Connection_Details_dialog_box" border="0" alt="Specify_Site_Connection_Details_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Specify_Site_Connection_Details_dialog_box_thumb.png" width="650" height="500" />
          </a>
        </p>
        <p>
In the <strong>Provide Credentials</strong> step, enter the user name and password
assigned by the provider, and then click <strong>Next</strong>:
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Provide_Credentials_dialog_box_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Provide_Credentials_dialog_box" border="0" alt="Provide_Credentials_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Provide_Credentials_dialog_box_thumb.png" width="650" height="500" />
          </a>
        </p>
        <p>
You might see a <strong>Server Certificate Alert</strong> dialog box. If you're sure
that you've entered the correct server and site name, click <strong>Connect</strong>.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Server_Certificate_Alert_dialog_box_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Server_Certificate_Alert_dialog_box" border="0" alt="Server_Certificate_Alert_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Server_Certificate_Alert_dialog_box_thumb.png" width="402" height="289" />
          </a>
        </p>
        <p>
In the <strong>Specify a Connection Name</strong> step, click <strong>Finish</strong>.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Specify_a_Connection_Name_dialog_box_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Specify_a_Connection_Name_dialog_box" border="0" alt="Specify_a_Connection_Name_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Specify_a_Connection_Name_dialog_box_thumb.png" width="650" height="500" />
          </a>
        </p>
        <p>
After <strong>IIS Manager</strong> connects to the provider's server, a <strong>New
Feature Available</strong> dialog box might appear that lists administration features
available for download. Click <strong>Cancel</strong> — you've already installed everything
you need for this deployment.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/New_Feature_Available_dialog_box_Cytanium_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="New_Feature_Available_dialog_box_Cytanium" border="0" alt="New_Feature_Available_dialog_box_Cytanium" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/New_Feature_Available_dialog_box_Cytanium_thumb.png" width="610" height="419" />
          </a>
        </p>
        <p>
After the <strong>New Feature Available</strong> box closes, the <strong>IIS Manager</strong> window
appears. There's now a node in the <strong>Connections</strong> pane for the site
at the hosting provider.
</p>
        <h4>Creating a Package for the Production Site
</h4>
        <p>
The next step is to create a deployment package for the production environment. In
the Visual Studio <strong>Solution Configurations</strong> drop-down box, select the
Release build configuration.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Solution_Configurations_dropdown_Release_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Solution_Configurations_dropdown_Release" border="0" alt="Solution_Configurations_dropdown_Release" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Solution_Configurations_dropdown_Release_thumb.png" width="554" height="93" />
          </a>
        </p>
        <p>
In <strong>Solution Explorer</strong>, right-click the <strong>ContosoUniversity</strong> project
and then select <strong>Build Deployment Package</strong>.
</p>
        <p>
The <strong>Output</strong> window reports a successful build and publish (package
creation), and it tells you that the package is created in the <em>obj\Release\Package</em> folder
in your project folder.
</p>
        <h4>Installing the Package in the Production Environment
</h4>
        <p>
Now you can install the package in the production environment. In the <strong>IIS
Manager</strong><strong>Connections</strong> pane, select the new connection you
added earlier. Then click <strong>Import Application</strong>, which will walk you
through the same process you followed earlier when you deployed to the test environment. 
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/IIS_Manager_with_provider_site_selected_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IIS_Manager_with_provider_site_selected" border="0" alt="IIS_Manager_with_provider_site_selected" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/IIS_Manager_with_provider_site_selected_thumb.png" width="646" height="521" />
          </a>
        </p>
        <p>
In the <strong>Select the Package</strong> step, select the package that you just
created:
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Package_dialog_box_Prod_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Select_the_Package_dialog_box_Prod" border="0" alt="Select_the_Package_dialog_box_Prod" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Package_dialog_box_Prod_thumb.png" width="650" height="500" />
          </a>
        </p>
        <p>
In the <strong>Select the Contents of the Package</strong> step, leave all the check
boxes selected and click <strong>Next</strong>:
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Contents_of_the_Package_dialog_box_Prod_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Select_the_Contents_of_the_Package_dialog_box_Prod" border="0" alt="Select_the_Contents_of_the_Package_dialog_box_Prod" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Contents_of_the_Package_dialog_box_Prod_thumb.png" width="650" height="500" />
          </a>
        </p>
        <p>
In the <strong>Enter Application Package Information</strong> step, clear the <strong>Application
Path</strong> and click <strong>Next</strong>:
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Enter_Application_Package_Information_dialog_box_Prod_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Enter_Application_Package_Information_dialog_box_Prod" border="0" alt="Enter_Application_Package_Information_dialog_box_Prod" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Enter_Application_Package_Information_dialog_box_Prod_thumb.png" width="641" height="491" />
          </a>
        </p>
        <p>
The wizard asks if you want to delete files at the destination that aren't in the
source. 
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Overwrite_Existing_Files_dialog_box_4.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Overwrite_Existing_Files_dialog_box" border="0" alt="Overwrite_Existing_Files_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Overwrite_Existing_Files_dialog_box_thumb_1.png" width="650" height="500" />
          </a>
        </p>
        <p>
You don't need to have anything deleted, so just click <strong>Next</strong>. 
</p>
        <p>
When you get the warning about installing to the root folder, click <strong>OK</strong>:
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Installation_in_root_folder_warning_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Installation_in_root_folder_warning" border="0" alt="Installation_in_root_folder_warning" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Installation_in_root_folder_warning_thumb.png" width="530" height="219" />
          </a>
        </p>
        <p>
Package installation begins. When it's done, the <strong>Installation Progress and
Summary</strong> dialog box is shown:
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Installation_Progress_and_Summary_dialog_box_4.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Installation_Progress_and_Summary_dialog_box" border="0" alt="Installation_Progress_and_Summary_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Installation_Progress_and_Summary_dialog_box_thumb_1.png" width="650" height="500" />
          </a>
        </p>
        <p>
Click <strong>Finish</strong>. Your application has been deployed to the hosting provider's
server, and you can test by browsing to your public site's URL.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Instructors_page_with_separate_name_fields_Prod_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Instructors_page_with_separate_name_fields_Prod" border="0" alt="Instructors_page_with_separate_name_fields_Prod" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Instructors_page_with_separate_name_fields_Prod_thumb.png" width="616" height="294" />
          </a>
        </p>
        <p>
You've now seen how to deploy an application update by manually creating and installing
a deployment package. For information about how to create and install packages from
the command line in order to be able to integrate them into a continuous integration
process, see the <a href="http://msdn.microsoft.com/en-us/library/bb386521.aspx">ASP.NET
Deployment Content Map</a> on the MSDN web site.
</p>
        <p>
Sayed Ibrahim Hashimi – <a href="http://twitter.com/#!/sayedihashimi" target="_blank">@SayedIHashimi</a></p>
        <p>
ddd
</p>
      </body>
      <title>Using a Web Deploy package to deploy to IIS on the dev box and to a third party host</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,7b98b9ee-5391-4ba5-9f64-bcbbe815035c.aspx</guid>
      <link>http://sedodream.com/2011/11/08/UsingAWebDeployPackageToDeployToIISOnTheDevBoxAndToAThirdPartyHost.aspx</link>
      <pubDate>Tue, 08 Nov 2011 05:11:43 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;Note: I’d like to thank Tom Dykstra for helping me put this together&lt;/em&gt;
&lt;/p&gt;
&lt;h3&gt;Overview
&lt;/h3&gt;
&lt;p&gt;
In this tutorial you'll see how to use a &lt;em&gt;web deployment package&lt;/em&gt; package to
deploy an application. A deployment package is a &lt;em&gt;.zip&lt;/em&gt; file that includes
all of the content and metadata that's required to deploy an application. 
&lt;/p&gt;
&lt;p&gt;
Deployment packages are often used in enterprise environments. This is because a developer
or a continuous integration server can create the package without needing to know
things like passwords that are stored in &lt;em&gt;Web.config&lt;/em&gt; files. Only the server
administrator who actually installs the package needs to know those passwords, and
that person can enter the details at installation time.
&lt;/p&gt;
&lt;p&gt;
In a smaller organization that doesn't have separate people for these roles, there's
less need for deployment packages. But you can also use deployment packages as a way
to back up and restore the state of an application. After you use a deployment package
to deploy, you can save the package,. Then if a subsequent deployment has a problem,
you can quickly and easily restore the application state to the earlier state by reinstalling
the earlier package. (This scenario is more complicated if database changes are involved,
however.)
&lt;/p&gt;
&lt;p&gt;
This tutorial shows how to use Visual Studio to create a package and IIS Manager to
install it. For information about how to create and install packages using the command
line, see &lt;a href="http://msdn.microsoft.com/en-us/library/bb386521.aspx"&gt;ASP.NET
Deployment Content Map&lt;/a&gt; on the MSDN web site.
&lt;/p&gt;
&lt;p&gt;
To keep things relatively simple, this example assumes you have already deployed the
application and its databases, and you only need to deploy a code update. You have
made the code update, and you are ready to deploy it first to your test environment
(IIS on your local computer) and then to your hosting provider. You have a Test build
configuration that you use for the test environment and you use the Release build
configuration for the production environment. In the example, the name of the Visual
Studio project is ContosoUniversity, and instructions for its initial deployment can
be found in a series of tutorials that will be published in December on the ASP.NET
web site. 
&lt;/p&gt;
&lt;p&gt;
The hosting provider shown, Cytanium.com, is one of many that are available, and its
use here does not constitute an endorsement or recommendation.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;Note&lt;/strong&gt; The following example uses separate packages for the test and
production environments, but you can also create a single deployment package that
can be used for both environments. This would require that you use Web Deploy parameters
instead of &lt;em&gt;Web.config&lt;/em&gt; transformations for &lt;em&gt;Web.config&lt;/em&gt; file changes
that depend on deployment destination. For information about how to use Web Deploy
parameters, see &lt;a href="http://msdn.microsoft.com/en-us/library/ff398068.aspx"&gt;How
to: Use Parameters to Configure Deployment Settings When a Package is Installed&lt;/a&gt;.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;h3&gt;Configuring the Deployment Package
&lt;/h3&gt;
&lt;p&gt;
In this section, you'll configure settings for the deployment package. Some of these
settings are the same ones that you set also for one-click publish, others are only
for deployment packages. 
&lt;/p&gt;
&lt;p&gt;
Open the &lt;strong&gt;Package/Publish Web&lt;/strong&gt; tab of the &lt;strong&gt;Project Properties&lt;/strong&gt; window
and select the &lt;strong&gt;Test&lt;/strong&gt; build configuration.
&lt;/p&gt;
&lt;p&gt;
For this deployment you aren't making any database changes, so clear &lt;strong&gt;Include
all databases configured in Package/Publish SQL tab&lt;/strong&gt;. Make sure &lt;strong&gt;Exclude
files from the App_Data folder&lt;/strong&gt; is selected.
&lt;/p&gt;
&lt;p&gt;
Review the settings in the section labeled &lt;strong&gt;Web Deployment Package Settings&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
By default, deployment packages are created as &lt;em&gt;.zip&lt;/em&gt; files. You don't need
to change this setting. 
&lt;/li&gt;
&lt;li&gt;
By default, deployment packages are created in the project's &lt;em&gt;obj\Test\Package&lt;/em&gt; folder.
You don't need to change this setting. 
&lt;/li&gt;
&lt;li&gt;
The default IIS web application name is the name of the project with &amp;quot;_deploy&amp;quot;
appended to it. Remove that suffix. You want the application to be named just ContosoUniversity
in IIS on your computer. 
&lt;/li&gt;
&lt;li&gt;
For this tutorial you're not deploying IIS settings, so you don't need to enter a
password for that. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The &lt;strong&gt;Package/Publish Web&lt;/strong&gt; tab now looks like this:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Package_Publish_Web_tab_Test_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Package_Publish_Web_tab_Test" border="0" alt="Package_Publish_Web_tab_Test" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Package_Publish_Web_tab_Test_thumb.png" width="632" height="767" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
You also need to configure settings for deploying to the production environment. Select
the &lt;strong&gt;Release&lt;/strong&gt; build configuration to do that.
&lt;/p&gt;
&lt;p&gt;
Change &lt;strong&gt;IIS Web site/application name to use on the destination server&lt;/strong&gt; to
a string that will serve as a reminder of what you need to do later when this value
is displayed in the IIS Manager UI: &amp;quot;[clear this field]&amp;quot;. The text box on
this page won't stay cleared even if you clear it, so entering this note to yourself
will remind you to clear this value later when you deploy. When you deploy to your
hosting provider, you will connect to a site, not to a server, and in this case you
want to deploy to the root of the site.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Package_Publish_Web_tab_Release_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Package_Publish_Web_tab_Release" border="0" alt="Package_Publish_Web_tab_Release" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Package_Publish_Web_tab_Release_thumb.png" width="634" height="769" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h4&gt;Creating a Deployment Package for the Test Environment
&lt;/h4&gt;
&lt;p&gt;
To create a deployment package, first make sure you've selected the right build configuration.
In the &lt;strong&gt;Solution Configurations&lt;/strong&gt; drop-down box, select &lt;strong&gt;Test&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Solution_Configurations_dropdown_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Solution_Configurations_dropdown" border="0" alt="Solution_Configurations_dropdown" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Solution_Configurations_dropdown_thumb.png" width="559" height="95" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
In &lt;strong&gt;Solution Explorer&lt;/strong&gt;, right-click the project that you want to build
the package for and then select &lt;strong&gt;Build Deployment Package&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
The &lt;strong&gt;Output&lt;/strong&gt; window reports successful a build and publish (package
creation) and tells you where the package was created.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Output_Window_package_creation_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Output_Window_package_creation" border="0" alt="Output_Window_package_creation" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Output_Window_package_creation_thumb.png" width="653" height="228" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h4&gt;Installing the Deployment Package in the Test Environment
&lt;/h4&gt;
&lt;p&gt;
The next step is to install the deployment package in IIS on your development computer. 
&lt;/p&gt;
&lt;p&gt;
Run &lt;strong&gt;IIS Manager&lt;/strong&gt;. In the &lt;strong&gt;Connections&lt;/strong&gt; pane of the &lt;strong&gt;IIS
Manager&lt;/strong&gt; window, expand the local server node, expand the &lt;strong&gt;Sites&lt;/strong&gt; node,
and select &lt;strong&gt;Default Web Site&lt;/strong&gt;. Then in the &lt;strong&gt;Actions&lt;/strong&gt; pane,
click &lt;strong&gt;Import Application&lt;/strong&gt;. (If you don't see an &lt;strong&gt;Import Application&lt;/strong&gt; link,
the most likely reason is that you have not installed Web Deploy. You can use the &lt;a href="http://www.microsoft.com/web/downloads/platform.aspx"&gt;Web
Platform Installer&lt;/a&gt; to install both IIS and Web Deploy.)
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Default_Web_Site_in_inetmgr_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Default_Web_Site_in_inetmgr" border="0" alt="Default_Web_Site_in_inetmgr" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Default_Web_Site_in_inetmgr_thumb.png" width="607" height="464" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
In the &lt;strong&gt;Select the Package&lt;/strong&gt; wizard step, navigate to the location of
the package you just created. By default, that's the &lt;em&gt;obj\Test\Package&lt;/em&gt; folder
in your ContosoUniversity project folder. (A package created with the &lt;strong&gt;Release&lt;/strong&gt; build
configuration would be in &lt;em&gt;obj\Release\Package&lt;/em&gt;.)
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Package_dialog_box_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Select_the_Package_dialog_box" border="0" alt="Select_the_Package_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Package_dialog_box_thumb.png" width="650" height="500" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Click &lt;strong&gt;Next&lt;/strong&gt;. The &lt;strong&gt;Select the Contents of the Package&lt;/strong&gt; step
is displayed.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Contents_of_the_Package_dialog_box_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Select_the_Contents_of_the_Package_dialog_box" border="0" alt="Select_the_Contents_of_the_Package_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Contents_of_the_Package_dialog_box_thumb.png" width="650" height="500" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Click &lt;strong&gt;Next&lt;/strong&gt;. 
&lt;/p&gt;
&lt;p&gt;
The step that allows you to enter parameter values is displayed. The &lt;strong&gt;Application
Path&lt;/strong&gt; value defaults to &amp;quot;ContosoUniversity&amp;quot;, because that's what
you entered on the &lt;strong&gt;Package/Publish Web&lt;/strong&gt; tab of the &lt;strong&gt;Project
Properties&lt;/strong&gt; window.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Enter_Application_Package_Information_dialog_box_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Enter_Application_Package_Information_dialog_box" border="0" alt="Enter_Application_Package_Information_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Enter_Application_Package_Information_dialog_box_thumb.png" width="650" height="500" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Click &lt;strong&gt;Next&lt;/strong&gt;. 
&lt;/p&gt;
&lt;p&gt;
The wizard asks if you want to delete files at the destination that aren't in the
source. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Overwrite_Existing_Files_dialog_box_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Overwrite_Existing_Files_dialog_box" border="0" alt="Overwrite_Existing_Files_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Overwrite_Existing_Files_dialog_box_thumb.png" width="650" height="500" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
In this case you haven't deleted any files that you want to delete at the destination,
so the default (no deletions) is okay. Click &lt;strong&gt;Next&lt;/strong&gt;. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;IIS Manager&lt;/strong&gt; installs the package and reports its status.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Installation_Progress_and_Summary_dialog_box_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Installation_Progress_and_Summary_dialog_box" border="0" alt="Installation_Progress_and_Summary_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Installation_Progress_and_Summary_dialog_box_thumb.png" width="650" height="500" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Click &lt;strong&gt;Finish&lt;/strong&gt;. 
&lt;/p&gt;
&lt;p&gt;
Open a browser and run the application in test by going to the URL &lt;code&gt;&lt;a href="http://localhost/ContosoUniversity"&gt;http://localhost/ContosoUniversity&lt;/a&gt;&lt;/code&gt;. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Instructors_page_with_separate_name_fields_Test_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Instructors_page_with_separate_name_fields_Test" border="0" alt="Instructors_page_with_separate_name_fields_Test" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Instructors_page_with_separate_name_fields_Test_thumb.png" width="653" height="336" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h4&gt;Installing IIS Manager for Remote Administration
&lt;/h4&gt;
&lt;p&gt;
The process for deploying to production is similar except that you create the package
using the Release build configuration, and you install it in &lt;strong&gt;IIS Manager&lt;/strong&gt; using
a remote connection to the hosting provider. But first you have to install the &lt;strong&gt;IIS
Manager&lt;/strong&gt; feature that facilitates remote connections.
&lt;/p&gt;
&lt;p&gt;
Click the following link to use the Web Platform Installer for this task:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://go.microsoft.com/?linkid=9655670"&gt;IIS Manager for Remote Administration
v1.1&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Connecting to Your Site at the Hosting Provider
&lt;/h4&gt;
&lt;p&gt;
After you install the &lt;strong&gt;IIS Manager for Remote Administration&lt;/strong&gt;, run &lt;strong&gt;IIS
Manager&lt;/strong&gt;. You see a new &lt;strong&gt;Start Page&lt;/strong&gt; in &lt;strong&gt;IIS Manager&lt;/strong&gt; that
has several &lt;strong&gt;Connect to ...&lt;/strong&gt; links in a &lt;strong&gt;Connection tasks&lt;/strong&gt; box.
(These options are also available from the &lt;strong&gt;File&lt;/strong&gt; menu.)
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/IIS_Manager_Remote_Admin_Start_Page_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IIS_Manager_Remote_Admin_Start_Page" border="0" alt="IIS_Manager_Remote_Admin_Start_Page" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/IIS_Manager_Remote_Admin_Start_Page_thumb.png" width="628" height="413" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
In &lt;strong&gt;IIS Manager&lt;/strong&gt;, click &lt;strong&gt;Connect to a site&lt;/strong&gt;. In the &lt;strong&gt;Specify
Site Connection Details&lt;/strong&gt; step, enter the &lt;strong&gt;Server name&lt;/strong&gt; and &lt;strong&gt;Site
name&lt;/strong&gt; values that are assigned to you by your provider, and then click &lt;strong&gt;Next&lt;/strong&gt;.
For a hosting account at Cytanium.com, you get the server name from &lt;strong&gt;Service
URL&lt;/strong&gt; in the Visual Studio 2010 section of the welcome email. The site name
is indicated by &amp;quot;Site/application&amp;quot; in the same section of the email. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Specify_Site_Connection_Details_dialog_box_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Specify_Site_Connection_Details_dialog_box" border="0" alt="Specify_Site_Connection_Details_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Specify_Site_Connection_Details_dialog_box_thumb.png" width="650" height="500" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
In the &lt;strong&gt;Provide Credentials&lt;/strong&gt; step, enter the user name and password
assigned by the provider, and then click &lt;strong&gt;Next&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Provide_Credentials_dialog_box_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Provide_Credentials_dialog_box" border="0" alt="Provide_Credentials_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Provide_Credentials_dialog_box_thumb.png" width="650" height="500" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
You might see a &lt;strong&gt;Server Certificate Alert&lt;/strong&gt; dialog box. If you're sure
that you've entered the correct server and site name, click &lt;strong&gt;Connect&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Server_Certificate_Alert_dialog_box_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Server_Certificate_Alert_dialog_box" border="0" alt="Server_Certificate_Alert_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Server_Certificate_Alert_dialog_box_thumb.png" width="402" height="289" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
In the &lt;strong&gt;Specify a Connection Name&lt;/strong&gt; step, click &lt;strong&gt;Finish&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Specify_a_Connection_Name_dialog_box_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Specify_a_Connection_Name_dialog_box" border="0" alt="Specify_a_Connection_Name_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Specify_a_Connection_Name_dialog_box_thumb.png" width="650" height="500" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
After &lt;strong&gt;IIS Manager&lt;/strong&gt; connects to the provider's server, a &lt;strong&gt;New
Feature Available&lt;/strong&gt; dialog box might appear that lists administration features
available for download. Click &lt;strong&gt;Cancel&lt;/strong&gt; — you've already installed everything
you need for this deployment.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/New_Feature_Available_dialog_box_Cytanium_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="New_Feature_Available_dialog_box_Cytanium" border="0" alt="New_Feature_Available_dialog_box_Cytanium" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/New_Feature_Available_dialog_box_Cytanium_thumb.png" width="610" height="419" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
After the &lt;strong&gt;New Feature Available&lt;/strong&gt; box closes, the &lt;strong&gt;IIS Manager&lt;/strong&gt; window
appears. There's now a node in the &lt;strong&gt;Connections&lt;/strong&gt; pane for the site
at the hosting provider.
&lt;/p&gt;
&lt;h4&gt;Creating a Package for the Production Site
&lt;/h4&gt;
&lt;p&gt;
The next step is to create a deployment package for the production environment. In
the Visual Studio &lt;strong&gt;Solution Configurations&lt;/strong&gt; drop-down box, select the
Release build configuration.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Solution_Configurations_dropdown_Release_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Solution_Configurations_dropdown_Release" border="0" alt="Solution_Configurations_dropdown_Release" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Solution_Configurations_dropdown_Release_thumb.png" width="554" height="93" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
In &lt;strong&gt;Solution Explorer&lt;/strong&gt;, right-click the &lt;strong&gt;ContosoUniversity&lt;/strong&gt; project
and then select &lt;strong&gt;Build Deployment Package&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
The &lt;strong&gt;Output&lt;/strong&gt; window reports a successful build and publish (package
creation), and it tells you that the package is created in the &lt;em&gt;obj\Release\Package&lt;/em&gt; folder
in your project folder.
&lt;/p&gt;
&lt;h4&gt;Installing the Package in the Production Environment
&lt;/h4&gt;
&lt;p&gt;
Now you can install the package in the production environment. In the &lt;strong&gt;IIS
Manager&lt;/strong&gt; &lt;strong&gt;Connections&lt;/strong&gt; pane, select the new connection you
added earlier. Then click &lt;strong&gt;Import Application&lt;/strong&gt;, which will walk you
through the same process you followed earlier when you deployed to the test environment. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/IIS_Manager_with_provider_site_selected_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IIS_Manager_with_provider_site_selected" border="0" alt="IIS_Manager_with_provider_site_selected" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/IIS_Manager_with_provider_site_selected_thumb.png" width="646" height="521" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
In the &lt;strong&gt;Select the Package&lt;/strong&gt; step, select the package that you just
created:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Package_dialog_box_Prod_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Select_the_Package_dialog_box_Prod" border="0" alt="Select_the_Package_dialog_box_Prod" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Package_dialog_box_Prod_thumb.png" width="650" height="500" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
In the &lt;strong&gt;Select the Contents of the Package&lt;/strong&gt; step, leave all the check
boxes selected and click &lt;strong&gt;Next&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Contents_of_the_Package_dialog_box_Prod_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Select_the_Contents_of_the_Package_dialog_box_Prod" border="0" alt="Select_the_Contents_of_the_Package_dialog_box_Prod" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Select_the_Contents_of_the_Package_dialog_box_Prod_thumb.png" width="650" height="500" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
In the &lt;strong&gt;Enter Application Package Information&lt;/strong&gt; step, clear the &lt;strong&gt;Application
Path&lt;/strong&gt; and click &lt;strong&gt;Next&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Enter_Application_Package_Information_dialog_box_Prod_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Enter_Application_Package_Information_dialog_box_Prod" border="0" alt="Enter_Application_Package_Information_dialog_box_Prod" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Enter_Application_Package_Information_dialog_box_Prod_thumb.png" width="641" height="491" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The wizard asks if you want to delete files at the destination that aren't in the
source. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Overwrite_Existing_Files_dialog_box_4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Overwrite_Existing_Files_dialog_box" border="0" alt="Overwrite_Existing_Files_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Overwrite_Existing_Files_dialog_box_thumb_1.png" width="650" height="500" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
You don't need to have anything deleted, so just click &lt;strong&gt;Next&lt;/strong&gt;. 
&lt;/p&gt;
&lt;p&gt;
When you get the warning about installing to the root folder, click &lt;strong&gt;OK&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Installation_in_root_folder_warning_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Installation_in_root_folder_warning" border="0" alt="Installation_in_root_folder_warning" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Installation_in_root_folder_warning_thumb.png" width="530" height="219" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Package installation begins. When it's done, the &lt;strong&gt;Installation Progress and
Summary&lt;/strong&gt; dialog box is shown:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Installation_Progress_and_Summary_dialog_box_4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Installation_Progress_and_Summary_dialog_box" border="0" alt="Installation_Progress_and_Summary_dialog_box" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Installation_Progress_and_Summary_dialog_box_thumb_1.png" width="650" height="500" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Click &lt;strong&gt;Finish&lt;/strong&gt;. Your application has been deployed to the hosting provider's
server, and you can test by browsing to your public site's URL.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Instructors_page_with_separate_name_fields_Prod_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Instructors_page_with_separate_name_fields_Prod" border="0" alt="Instructors_page_with_separate_name_fields_Prod" src="http://sedodream.com/content/binary/Windows-Live-Writer/b763f270a538_125B5/Instructors_page_with_separate_name_fields_Prod_thumb.png" width="616" height="294" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
You've now seen how to deploy an application update by manually creating and installing
a deployment package. For information about how to create and install packages from
the command line in order to be able to integrate them into a continuous integration
process, see the &lt;a href="http://msdn.microsoft.com/en-us/library/bb386521.aspx"&gt;ASP.NET
Deployment Content Map&lt;/a&gt; on the MSDN web site.
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi – &lt;a href="http://twitter.com/#!/sayedihashimi" target="_blank"&gt;@SayedIHashimi&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
ddd
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,7b98b9ee-5391-4ba5-9f64-bcbbe815035c.aspx</comments>
      <category>IIS</category>
      <category>MSBuild</category>
      <category>MSDeploy</category>
      <category>web</category>
      <category>Web Deployment Tool</category>
      <category>Web Development</category>
      <category>Web Publishing Pipeline</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=4f8fb902-f71e-42d6-8c41-86395a415be2</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,4f8fb902-f71e-42d6-8c41-86395a415be2.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,4f8fb902-f71e-42d6-8c41-86395a415be2.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=4f8fb902-f71e-42d6-8c41-86395a415be2</wfw:commentRss>
      <slash:comments>18</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
When I talk to people about the XDT (web.config) transforms that web projects support
for package/publish one of the most common questions is “Does this work for non-web
projects?” Unfortunately the answer is No, but myself and a friend of mine (Chuck
England) have created a Visual Studio add in which enables just this. You can find
it in the Visual Studio gallery under the name <a href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5" target="_blank">SlowCheetah
– XML Transforms</a>. Here is an overview of the features of the add in.
</p>
        <ol>
          <li>
Add tooling to desktop project to create XDT transforms</li>
          <li>
Transform app.config for desktop projects based on build configuration</li>
          <li>
Transform any XML file to the output folder base on build configuration</li>
          <li>
Add tooling to enable previewing XDT transforms</li>
          <li>
For web projects easily transform other XML files during package/publish</li>
        </ol>
        <p>
After you install the add in you will get the following menu item when you right click
any XML file.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/Add-Transform01_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Add-Transform01" border="0" alt="Add-Transform01" src="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/Add-Transform01_thumb.png" width="347" height="241" />
          </a>
        </p>
        <p>
For each build configuration defined you will get a transform created as a child item.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/App-Config_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="App-Config" border="0" alt="App-Config" src="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/App-Config_thumb.png" width="215" height="53" />
          </a>
        </p>
        <p>
These files are stub XDT transforms. You can place your transform content in those
files and they will be executed when you debug/run your application. For example if
your app.config contained the following.
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;configuration&gt;
  &lt;appSettings&gt;
    &lt;add key="appName" value="WPF Demo-Debug-default"/&gt;
    &lt;add key="url" value="http://localhost:8080/Default/"/&gt;
    &lt;add key="email" value="demo-default@contoso.com"/&gt;
  &lt;/appSettings&gt;

  &lt;connectionStrings&gt;
    &lt;clear /&gt;
    &lt;add name="RecordsDb" connectionString=".\SQLExpress;Initial Catalog=RecordsDb-Default;Integrated Security=true"/&gt;
  &lt;/connectionStrings&gt;

&lt;/configuration&gt;</pre>
        <p>
And your app.debug.config contained
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;!-- For more information on using transformations 
     see the web.comfig examples at http://go.microsoft.com/fwlink/?LinkId=214134. --&gt;
&lt;configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"&gt;

  &lt;appSettings&gt;
    &lt;add key="appName" value="WPF Demo-Debug" xdt:Transform="Replace" xdt:Locator="Match(key)"/&gt;
    &lt;add key="url" value="http://localhost:8080/" xdt:Transform="Replace" xdt:Locator="Match(key)"/&gt;
    &lt;add key="email" value="debug@contoso.com" xdt:Transform="Replace" xdt:Locator="Match(key)"/&gt;
  &lt;/appSettings&gt;

  &lt;connectionStrings&gt;
    &lt;add name="RecordsDb" connectionString=".\SQLExpress;Initial Catalog=RecordsDb;Integrated Security=true"
         xdt:Transform="Replace" xdt:Locator="Match(name)"/&gt;
  &lt;/connectionStrings&gt;

&lt;/configuration&gt;</pre>
        <p>
When you run your application the config file created will contain the following.
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;configuration&gt;
  &lt;appSettings&gt;
    &lt;add key="appName" value="WPF Demo-Debug"/&gt;
    &lt;add key="url" value="http://localhost:8080/"/&gt;
    &lt;add key="email" value="debug@contoso.com"/&gt;
  &lt;/appSettings&gt;

  &lt;connectionStrings&gt;
    &lt;clear/&gt;
    &lt;add name="RecordsDb" connectionString=".\SQLExpress;Initial Catalog=RecordsDb;Integrated Security=true"/&gt;
  &lt;/connectionStrings&gt;

&lt;/configuration&gt;</pre>
        <h3>Transforming other files
</h3>
        <p>
You are not limited to transforming app.config, you can transform any XML file. When
you create a transform for an arbitrary XML file when you run your application the
transformed XML file will be dropped into the output (bin) folder of your application.
</p>
        <h3>Previewing Transforms
</h3>
        <p>
You can easily preview transform results as well. After you have created the transform
file you can right click on it and select Preview Transform.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/Preview-Transform-Command_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Preview-Transform-Command" border="0" alt="Preview-Transform-Command" src="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/Preview-Transform-Command_thumb.png" width="325" height="239" />
          </a>
        </p>
        <p>
After you click it you should see the following.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/Preview-Transform-Diff_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Preview-Transform-Diff" border="0" alt="Preview-Transform-Diff" src="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/Preview-Transform-Diff_thumb.png" width="944" height="484" />
          </a>
        </p>
        <p>
 
</p>
        <p>
I hope you guys find this useful. Let me know if you have any feedback on this!
</p>
        <p>
          <em>
            <strong>Note: This add in was created by me and a friend of mine, these are not
created nor supported by Microsoft.</strong>
          </em>
        </p>
        <p>
Sayed Ibrahim Hashimi – <a href="http://twitter.com/#!/sayedihashimi" target="_blank">@sayedihashimi</a></p>
      </body>
      <title>App.config transform Visual Studio Add in</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,4f8fb902-f71e-42d6-8c41-86395a415be2.aspx</guid>
      <link>http://sedodream.com/2011/08/17/AppconfigTransformVisualStudioAddIn.aspx</link>
      <pubDate>Wed, 17 Aug 2011 05:25:37 GMT</pubDate>
      <description>&lt;p&gt;
When I talk to people about the XDT (web.config) transforms that web projects support
for package/publish one of the most common questions is “Does this work for non-web
projects?” Unfortunately the answer is No, but myself and a friend of mine (Chuck
England) have created a Visual Studio add in which enables just this. You can find
it in the Visual Studio gallery under the name &lt;a href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5" target="_blank"&gt;SlowCheetah
– XML Transforms&lt;/a&gt;. Here is an overview of the features of the add in.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Add tooling to desktop project to create XDT transforms&lt;/li&gt;
&lt;li&gt;
Transform app.config for desktop projects based on build configuration&lt;/li&gt;
&lt;li&gt;
Transform any XML file to the output folder base on build configuration&lt;/li&gt;
&lt;li&gt;
Add tooling to enable previewing XDT transforms&lt;/li&gt;
&lt;li&gt;
For web projects easily transform other XML files during package/publish&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
After you install the add in you will get the following menu item when you right click
any XML file.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/Add-Transform01_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Add-Transform01" border="0" alt="Add-Transform01" src="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/Add-Transform01_thumb.png" width="347" height="241" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
For each build configuration defined you will get a transform created as a child item.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/App-Config_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="App-Config" border="0" alt="App-Config" src="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/App-Config_thumb.png" width="215" height="53" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
These files are stub XDT transforms. You can place your transform content in those
files and they will be executed when you debug/run your application. For example if
your app.config contained the following.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;
&amp;lt;configuration&amp;gt;
  &amp;lt;appSettings&amp;gt;
    &amp;lt;add key=&amp;quot;appName&amp;quot; value=&amp;quot;WPF Demo-Debug-default&amp;quot;/&amp;gt;
    &amp;lt;add key=&amp;quot;url&amp;quot; value=&amp;quot;http://localhost:8080/Default/&amp;quot;/&amp;gt;
    &amp;lt;add key=&amp;quot;email&amp;quot; value=&amp;quot;demo-default@contoso.com&amp;quot;/&amp;gt;
  &amp;lt;/appSettings&amp;gt;

  &amp;lt;connectionStrings&amp;gt;
    &amp;lt;clear /&amp;gt;
    &amp;lt;add name=&amp;quot;RecordsDb&amp;quot; connectionString=&amp;quot;.\SQLExpress;Initial Catalog=RecordsDb-Default;Integrated Security=true&amp;quot;/&amp;gt;
  &amp;lt;/connectionStrings&amp;gt;

&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;
And your app.debug.config contained
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;
&amp;lt;!-- For more information on using transformations 
     see the web.comfig examples at http://go.microsoft.com/fwlink/?LinkId=214134. --&amp;gt;
&amp;lt;configuration xmlns:xdt=&amp;quot;http://schemas.microsoft.com/XML-Document-Transform&amp;quot;&amp;gt;

  &amp;lt;appSettings&amp;gt;
    &amp;lt;add key=&amp;quot;appName&amp;quot; value=&amp;quot;WPF Demo-Debug&amp;quot; xdt:Transform=&amp;quot;Replace&amp;quot; xdt:Locator=&amp;quot;Match(key)&amp;quot;/&amp;gt;
    &amp;lt;add key=&amp;quot;url&amp;quot; value=&amp;quot;http://localhost:8080/&amp;quot; xdt:Transform=&amp;quot;Replace&amp;quot; xdt:Locator=&amp;quot;Match(key)&amp;quot;/&amp;gt;
    &amp;lt;add key=&amp;quot;email&amp;quot; value=&amp;quot;debug@contoso.com&amp;quot; xdt:Transform=&amp;quot;Replace&amp;quot; xdt:Locator=&amp;quot;Match(key)&amp;quot;/&amp;gt;
  &amp;lt;/appSettings&amp;gt;

  &amp;lt;connectionStrings&amp;gt;
    &amp;lt;add name=&amp;quot;RecordsDb&amp;quot; connectionString=&amp;quot;.\SQLExpress;Initial Catalog=RecordsDb;Integrated Security=true&amp;quot;
         xdt:Transform=&amp;quot;Replace&amp;quot; xdt:Locator=&amp;quot;Match(name)&amp;quot;/&amp;gt;
  &amp;lt;/connectionStrings&amp;gt;

&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;
When you run your application the config file created will contain the following.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;configuration&amp;gt;
  &amp;lt;appSettings&amp;gt;
    &amp;lt;add key=&amp;quot;appName&amp;quot; value=&amp;quot;WPF Demo-Debug&amp;quot;/&amp;gt;
    &amp;lt;add key=&amp;quot;url&amp;quot; value=&amp;quot;http://localhost:8080/&amp;quot;/&amp;gt;
    &amp;lt;add key=&amp;quot;email&amp;quot; value=&amp;quot;debug@contoso.com&amp;quot;/&amp;gt;
  &amp;lt;/appSettings&amp;gt;

  &amp;lt;connectionStrings&amp;gt;
    &amp;lt;clear/&amp;gt;
    &amp;lt;add name=&amp;quot;RecordsDb&amp;quot; connectionString=&amp;quot;.\SQLExpress;Initial Catalog=RecordsDb;Integrated Security=true&amp;quot;/&amp;gt;
  &amp;lt;/connectionStrings&amp;gt;

&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;h3&gt;Transforming other files
&lt;/h3&gt;
&lt;p&gt;
You are not limited to transforming app.config, you can transform any XML file. When
you create a transform for an arbitrary XML file when you run your application the
transformed XML file will be dropped into the output (bin) folder of your application.
&lt;/p&gt;
&lt;h3&gt;Previewing Transforms
&lt;/h3&gt;
&lt;p&gt;
You can easily preview transform results as well. After you have created the transform
file you can right click on it and select Preview Transform.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/Preview-Transform-Command_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Preview-Transform-Command" border="0" alt="Preview-Transform-Command" src="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/Preview-Transform-Command_thumb.png" width="325" height="239" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
After you click it you should see the following.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/Preview-Transform-Diff_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Preview-Transform-Diff" border="0" alt="Preview-Transform-Diff" src="http://sedodream.com/content/binary/Windows-Live-Writer/eb1580ca95bc_136F0/Preview-Transform-Diff_thumb.png" width="944" height="484" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
I hope you guys find this useful. Let me know if you have any feedback on this!
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;Note: This add in was created by me and a friend of mine, these are not
created nor supported by Microsoft.&lt;/strong&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi – &lt;a href="http://twitter.com/#!/sayedihashimi" target="_blank"&gt;@sayedihashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,4f8fb902-f71e-42d6-8c41-86395a415be2.aspx</comments>
      <category>MSBuild</category>
      <category>Visual Studio 2010</category>
      <category>XDT</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=a20039d2-0ae3-484e-a1b3-ebd8855719f0</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,a20039d2-0ae3-484e-a1b3-ebd8855719f0.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,a20039d2-0ae3-484e-a1b3-ebd8855719f0.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a20039d2-0ae3-484e-a1b3-ebd8855719f0</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today someone sent me an email asking how to call the <a href="http://msdn.microsoft.com/en-us/library/14tx8hby.aspx" target="_blank">System.Environment.GetFolderPath</a> method
passing in the value of <a href="http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx" target="_blank">MyDocuments</a> for
the value of the folder parameter. I was expecting the below to do the trick.
</p>
        <pre class="brush: xml;">&lt;Project ToolsVersion="4.0" 
         DefaultTargets="Demo" 
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;

  &lt;PropertyGroup&gt;
    &lt;Tempfile02&gt;$([System.Environment]::GetFolderPath(System.Environment.SpecialFolder.MyDocuments))&lt;/Tempfile02&gt;
  &lt;/PropertyGroup&gt;

  &lt;Target Name="Demo"&gt;
    &lt;Message Text="TempFile01: $(TempFile02)"/&gt;
  &lt;/Target&gt;

&lt;/Project&gt;</pre>
        <p>
To my surprise I was faced with the following error.
</p>
        <p>
          <font face="Courier New">Build started 3/20/2011 6:20:36 PM.</font>
        </p>
        <p>
          <font face="Courier New">Project "C:\temp\_NET\msbuild\PropFunction01.proj"
on node 1 (default targets).</font>
        </p>
        <p>
          <font face="Courier New">C:\temp\_NET\msbuild\PropFunction01.proj(20,5): error MSB4186:
Invalid static method invocation syntax: "[System.Environment]::GetFolderPath(System.Environment.Spec
ialFolder.MyDocuments)". Requested value 'System.Environment.MyDocuments' was
not found. Static method invocation should be of the form: $([FullTypeName]::Method()),
e.g. $([System.IO.Path]::Combine(`a`, `b`)).</font>
        </p>
        <p>
          <font face="Courier New">Done Building Project "C:\temp\_NET\msbuild\PropFunction01.proj"
(default targets) -- FAILED.</font>
        </p>
        <p>
          <font face="Courier New">Build FAILED.</font>
        </p>
        <p>
So I sent an email to the MSBuild team asking “WTF why doesn’t this work?!”, and Dan
Moseley (a lead dev there) sent me a snippet that worked, its below.
</p>
        <pre class="brush: xml;">&lt;Project ToolsVersion="4.0" DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;

  &lt;PropertyGroup&gt;
    &lt;Tempfile02&gt;$([System.Environment]::GetFolderPath(SpecialFolder.MyDocuments))&lt;/Tempfile02&gt;
  &lt;/PropertyGroup&gt;

  &lt;Target Name="Demo"&gt;
    &lt;Message Text="TempFile01: $(TempFile02)"/&gt;
  &lt;/Target&gt;

&lt;/Project&gt;</pre>
        <p>
 
</p>
        <p>
In that snippet instead of using the fully qualified class name of <font face="Courier New">System.Environment.SpecialFolder.MyDocuments</font>,
for some reason you have to use the shortened name of just SpecialFolder.MyDocuments.
It seems like a bug to me, but at least there is a work around!
</p>
        <h4>Resources
</h4>
        <ul>
          <li>
            <a href="http://sedodream.com/2010/03/07/MSBuild40PropertyFunctionsPart1.aspx" target="_blank">Property
Functions Part 1</a>
          </li>
          <li>
            <a href="http://msdn.microsoft.com/en-us/library/dd633440.aspx" target="_blank">Property
Functions MSDN Reference</a>
          </li>
          <li>
            <a href="http://blogs.msdn.com/b/msbuild/archive/2010/04/02/msbuild-property-functions.aspx" target="_blank">Property
Functions: MSBuild Team Blog</a>
          </li>
        </ul>
        <p>
Sayed Ibrahim Hashimi – <a href="http://twitter.com/sayedihashimi" target="_blank">@sayedihashimi</a></p>
      </body>
      <title>Property Functions: GetFolderPath</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,a20039d2-0ae3-484e-a1b3-ebd8855719f0.aspx</guid>
      <link>http://sedodream.com/2011/03/21/PropertyFunctionsGetFolderPath.aspx</link>
      <pubDate>Mon, 21 Mar 2011 01:27:44 GMT</pubDate>
      <description>&lt;p&gt;
Today someone sent me an email asking how to call the &lt;a href="http://msdn.microsoft.com/en-us/library/14tx8hby.aspx" target="_blank"&gt;System.Environment.GetFolderPath&lt;/a&gt; method
passing in the value of &lt;a href="http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx" target="_blank"&gt;MyDocuments&lt;/a&gt; for
the value of the folder parameter. I was expecting the below to do the trick.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; 
         DefaultTargets=&amp;quot;Demo&amp;quot; 
         xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;

  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;Tempfile02&amp;gt;$([System.Environment]::GetFolderPath(System.Environment.SpecialFolder.MyDocuments))&amp;lt;/Tempfile02&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;

  &amp;lt;Target Name=&amp;quot;Demo&amp;quot;&amp;gt;
    &amp;lt;Message Text=&amp;quot;TempFile01: $(TempFile02)&amp;quot;/&amp;gt;
  &amp;lt;/Target&amp;gt;

&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
To my surprise I was faced with the following error.
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;Build started 3/20/2011 6:20:36 PM.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;Project &amp;quot;C:\temp\_NET\msbuild\PropFunction01.proj&amp;quot;
on node 1 (default targets).&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;C:\temp\_NET\msbuild\PropFunction01.proj(20,5): error MSB4186:
Invalid static method invocation syntax: &amp;quot;[System.Environment]::GetFolderPath(System.Environment.Spec
ialFolder.MyDocuments)&amp;quot;. Requested value 'System.Environment.MyDocuments' was
not found. Static method invocation should be of the form: $([FullTypeName]::Method()),
e.g. $([System.IO.Path]::Combine(`a`, `b`)).&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;Done Building Project &amp;quot;C:\temp\_NET\msbuild\PropFunction01.proj&amp;quot;
(default targets) -- FAILED.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;Build FAILED.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
So I sent an email to the MSBuild team asking “WTF why doesn’t this work?!”, and Dan
Moseley (a lead dev there) sent me a snippet that worked, its below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; DefaultTargets=&amp;quot;Demo&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;

  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;Tempfile02&amp;gt;$([System.Environment]::GetFolderPath(SpecialFolder.MyDocuments))&amp;lt;/Tempfile02&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;

  &amp;lt;Target Name=&amp;quot;Demo&amp;quot;&amp;gt;
    &amp;lt;Message Text=&amp;quot;TempFile01: $(TempFile02)&amp;quot;/&amp;gt;
  &amp;lt;/Target&amp;gt;

&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
In that snippet instead of using the fully qualified class name of &lt;font face="Courier New"&gt;System.Environment.SpecialFolder.MyDocuments&lt;/font&gt;,
for some reason you have to use the shortened name of just SpecialFolder.MyDocuments.
It seems like a bug to me, but at least there is a work around!
&lt;/p&gt;
&lt;h4&gt;Resources
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://sedodream.com/2010/03/07/MSBuild40PropertyFunctionsPart1.aspx" target="_blank"&gt;Property
Functions Part 1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/dd633440.aspx" target="_blank"&gt;Property
Functions MSDN Reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://blogs.msdn.com/b/msbuild/archive/2010/04/02/msbuild-property-functions.aspx" target="_blank"&gt;Property
Functions: MSBuild Team Blog&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi – &lt;a href="http://twitter.com/sayedihashimi" target="_blank"&gt;@sayedihashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,a20039d2-0ae3-484e-a1b3-ebd8855719f0.aspx</comments>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
      <category>Visual Studio 2010</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=d158f2b8-cdee-4257-86cd-401362deeff2</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,d158f2b8-cdee-4257-86cd-401362deeff2.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,d158f2b8-cdee-4257-86cd-401362deeff2.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d158f2b8-cdee-4257-86cd-401362deeff2</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Back in November I participated in <a href="http://virtualtechdays.com/">Virtual Tech
Days</a> which is an online conference presented by Microsoft. In the session I discussed
the enhancements to web deployment using Visual Studio 2010 and MSDeploy. Some of
the topics which I covered includ:
</p>
        <ul>
          <li>
web.conig (XDT) transforms 
</li>
          <li>
How to publish to local file system using Visual Studio 
</li>
          <li>
How to publish to a 3rd party host using Visual Studio via MSDeploy 
</li>
          <li>
How to publish to local IIS server using the .cmd file generated by Visual Studio 
</li>
          <li>
How to use msdeploy.exe to delete IIS applications 
</li>
          <li>
How to use the IIS Manager to import web packages 
</li>
          <li>
How to use msdeploy.exe to deploy a web package to the local IIS server 
</li>
          <li>
How to use msdeploy.exe to deploy a web package to a remove IIS server 
</li>
          <li>
How to use msdeploy.exe to deploy a web package &amp; set parameters using SetParameters.xml
to a remote IIS server 
</li>
        </ul>
        <p>
You can download the video &amp; all of my sample files at <a href="http://virtualtechdays.com/pastevents_2010november.aspx">http://virtualtechdays.com/pastevents_2010november.aspx</a>.
In the samples you will find all of the scripts that I used and a bunch of others
which I didn’t have time to cover. Enjoy!
</p>
        <p>
Sayed Ibrahim Hashimi <a href="http://twitter.com/sayedihashimi">@sayedihashimi</a></p>
      </body>
      <title>Video on Web Deployment using Visual Studio 2010 and MSDeploy</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,d158f2b8-cdee-4257-86cd-401362deeff2.aspx</guid>
      <link>http://sedodream.com/2011/01/08/VideoOnWebDeploymentUsingVisualStudio2010AndMSDeploy.aspx</link>
      <pubDate>Sat, 08 Jan 2011 20:34:08 GMT</pubDate>
      <description>
&lt;p&gt;
Back in November I participated in &lt;a href="http://virtualtechdays.com/"&gt;Virtual Tech
Days&lt;/a&gt; which is an online conference presented by Microsoft. In the session I discussed
the enhancements to web deployment using Visual Studio 2010 and MSDeploy. Some of
the topics which I covered includ:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
web.conig (XDT) transforms 
&lt;/li&gt;
&lt;li&gt;
How to publish to local file system using Visual Studio 
&lt;/li&gt;
&lt;li&gt;
How to publish to a 3rd party host using Visual Studio via MSDeploy 
&lt;/li&gt;
&lt;li&gt;
How to publish to local IIS server using the .cmd file generated by Visual Studio 
&lt;/li&gt;
&lt;li&gt;
How to use msdeploy.exe to delete IIS applications 
&lt;/li&gt;
&lt;li&gt;
How to use the IIS Manager to import web packages 
&lt;/li&gt;
&lt;li&gt;
How to use msdeploy.exe to deploy a web package to the local IIS server 
&lt;/li&gt;
&lt;li&gt;
How to use msdeploy.exe to deploy a web package to a remove IIS server 
&lt;/li&gt;
&lt;li&gt;
How to use msdeploy.exe to deploy a web package &amp;amp; set parameters using SetParameters.xml
to a remote IIS server 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
You can download the video &amp;amp; all of my sample files at &lt;a href="http://virtualtechdays.com/pastevents_2010november.aspx"&gt;http://virtualtechdays.com/pastevents_2010november.aspx&lt;/a&gt;.
In the samples you will find all of the scripts that I used and a bunch of others
which I didn’t have time to cover. Enjoy!
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi &lt;a href="http://twitter.com/sayedihashimi"&gt;@sayedihashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,d158f2b8-cdee-4257-86cd-401362deeff2.aspx</comments>
      <category>Config-Transformation</category>
      <category>IIS</category>
      <category>MSBuild</category>
      <category>MSDeploy</category>
      <category>speaking</category>
      <category>Visual Studio</category>
      <category>Visual Studio 2010</category>
      <category>web</category>
      <category>Web Deployment Tool</category>
      <category>Web Development</category>
      <category>Web Publishing Pipeline</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=dbdd0002-7b3c-47b1-b891-9c361b087af6</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,dbdd0002-7b3c-47b1-b891-9c361b087af6.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,dbdd0002-7b3c-47b1-b891-9c361b087af6.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=dbdd0002-7b3c-47b1-b891-9c361b087af6</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
One of the really cool features that we shipped for Visual Studio 2010 was <a href="http://msdn.microsoft.com/en-us/library/dd465326.aspx" target="_blank">web.config
(XDT) transformations</a>. Because the transformations are so simple and straightforward
one of the first questions that someone asks after using it is “how can I use this
in my other projects?” Unfortunately this feature is only built into the Web Application
Projects (WAP). But it is very easy to reuse this because we just rely on an MSBuild
task to do the heavy lifting for us. I received an email from that basically went
like this 
</p>
        <blockquote>
          <p>
            <em>“Hi, I would like to use XDT transformations on my WPF project for both the app.config
file as well as my unity.xml file. How can I do this?”</em>
          </p>
        </blockquote>
        <p>
So one answer is to modify your project file to use the TransformXml task as I have
blogged previously about (link below). But I thought that since this was such a common
problem that I should go ahead and create a .targets file which would solve the above
problem and could be re-used by anyone.
</p>
        <p>
Let me clarify the scenario a bit before we dive into the details of the solution.
I have create a sample Wpf project, named Wpf01. Inside of that project I have created
these files:
</p>
        <ul>
          <li>
app.confog</li>
          <ul>
            <li>
app.debug.config</li>
            <li>
app.release.config</li>
          </ul>
          <li>
Sample01.xml</li>
          <ul>
            <li>
Sample01.debug.xml</li>
            <li>
Sample01.release.xml</li>
          </ul>
          <li>
Sub\Sub\Sub01.xml</li>
          <ul>
            <li>
Sub\Sub\Sub01.debug.xml</li>
            <li>
Sub\Sub\Sub01.release.xml</li>
          </ul>
        </ul>
        <p>
Take a look at the image below (note: I manually edited the project file to make the
file nest under each other, I will explain that shortly)
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/XDT.config-Transforms-in-non-web-project_11EA1/image_2.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/XDT.config-Transforms-in-non-web-project_11EA1/image_thumb.png" width="237" height="397" />
          </a>
        </p>
        <p>
The files with .debug/.release are transform files. When I build I expect the following
to happen:
</p>
        <ol>
          <li>
Transform app.config with app.{Configuration}.config and write file to output folder
with the correct name i.e. Wpf01.exe.config instead of just app.config</li>
          <li>
Transform Sample01.xml with Sample01.{Configuration}.config and write it to output
folder with the name Sample01.config</li>
          <li>
Transform Sub\Sub\Sub01.xml with Sub\Sub\Sub01.{Configuration}.config and write it
to the output folder with the name Sub\Sub\Sub01.xml</li>
          <li>
None of my source files should change</li>
        </ol>
        <h3>Usage
</h3>
        <p>
Before I get into the solution let me explain how to use the solution first because
if you are not interested in the MSBuild details you can skip over that <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://sedodream.com/content/binary/Windows-Live-Writer/XDT.config-Transforms-in-non-web-project_11EA1/wlEmoticon-smile_2.png" /></p>
        <ol>
          <li>
You must have installed Web projects with Visual Studio on the machine (it contains
the TransformXmll task).</li>
          <li>
Create the folder %ProgramFiles (x86)%\MSBuild\Custom. If you want to share this across
team members then see my note at the end of this blog.</li>
          <li>
Download TransformFiles.targets (link below) and place the file into the folder %ProgramFiles
(x86)%\MSBuild\Custom.</li>
          <li>
Edit your project file (right click on the project Unload Project, right click again
and pick edit)</li>
          <li>
At the end of the project file place the element <strong>&lt;Import Project="$(MSBuildExtensionsPath)\Custom\TransformFiles.targets"
/&gt;</strong> immediately above the closing &lt;/Project&gt; tag</li>
          <li>
For files that you want transformed a metadata value of TransformOnBuild to true.
See below on what this means.</li>
          <li>
Build and take a look at files in your output directory</li>
        </ol>
        <p>
For #5 lets examine the sample that I created. In this sample I had an app.config
file. When I first created the project the entry in the project file for app.config
looked like the following.
</p>
        <pre class="brush: xml;">&lt;None Include="app.config" /&gt;</pre>
        <p>
So what you need to do is to add a new metadata value as described above for that.
So it will turn into the following.
</p>
        <pre class="brush: xml;">&lt;None Include="app.config"&gt;
  &lt;TransformOnBuild&gt;true&lt;/TransformOnBuild&gt;
&lt;/None&gt;</pre>
        <p>
The transform targets will look for items that have this value declared on them and
then during build it will transform them, if the transform file exists in the same
folder as the file itself. You will need to add TransfromOnBuild to all the files
that you want to transform. So in my case I added it to app.config, Sample01.xml and
Sub01.xml. Note you should not add this to the transform files themselves because
you will just waste your own time. After you do this you should perform a build then
take a look at the output directory for your transformed files. The app.config should
write out the the correct file and the others as expected.
</p>
        <h3>Nest transforms under the source file
</h3>
        <p>
You might have noticed that in the image above that the transform files are nested
under the files themselves. To do this you need to add the DependentUpon metadata
value to the child items. For instance for app.config the child items look like the
following.
</p>
        <pre class="brush: xml;">&lt;None Include="app.debug.config"&gt;
  &lt;DependentUpon&gt;app.config&lt;/DependentUpon&gt;
&lt;/None&gt;
&lt;None Include="app.release.config"&gt;
  &lt;DependentUpon&gt;app.config&lt;/DependentUpon&gt;
&lt;/None&gt;</pre>
        <h3>Implementation
</h3>
        <p>
If you are wondering how this works then this is the section for you. TransformFile.targets
has 2 targets; DiscoverFilesToTransform and TransformAllFiles. DiscoverFilesToTransform
looks through a set of items (None, Content, and Resource). Inside of DiscoverFilesToTransform
I look for values with the %(TransformOnBuild)==true. After all of those are collected
I identify if there is an app.config file being transformed and if so it is placed
into a specific item list and all others go into another item list.
</p>
        <p>
Inside of TransformAllFiles the TransformXml task is used to transform all of the
files. This target injects itself into the build process by having the attribute <em>AfterTargets="Build;_CopyAppConfigFile"</em>.
So whenever the Build or _CopyAppConfigFile targets are called the TransformAllFiles
target will execute.
</p>
        <p>
Here if the full code for this file.
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
  &lt;UsingTask TaskName="TransformXml"
         AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/&gt;
  
  &lt;ItemDefinitionGroup&gt;
    &lt;!-- Set the default value to false here --&gt;
    &lt;None&gt;
      &lt;TransformOnBuild&gt;false&lt;/TransformOnBuild&gt;
    &lt;/None&gt;    
    &lt;Content&gt;
      &lt;TransformOnBuild&gt;false&lt;/TransformOnBuild&gt;
    &lt;/Content&gt;    
    &lt;Resource&gt;
      &lt;TransformOnBuild&gt;false&lt;/TransformOnBuild&gt;
    &lt;/Resource&gt;
    &lt;EmbeddedResource&gt;
      &lt;TransformOnBuild&gt;false&lt;/TransformOnBuild&gt;
    &lt;/EmbeddedResource&gt;
    
    &lt;_FilesToTransform&gt;
      &lt;IsAppConfig&gt;false&lt;/IsAppConfig&gt;
    &lt;/_FilesToTransform&gt;
  &lt;/ItemDefinitionGroup&gt;

  &lt;PropertyGroup&gt;
    &lt;TransformAllFilesDependsOn&gt;
      DiscoverFilesToTransform;
    &lt;/TransformAllFilesDependsOn&gt;
  &lt;/PropertyGroup&gt;
  &lt;Target Name="TransformAllFiles" DependsOnTargets="$(TransformAllFilesDependsOn)" AfterTargets="Build;_CopyAppConfigFile"&gt;
    &lt;!-- Now we have the item list _FilesToTransformNotAppConfig and _AppConfigToTransform item lists --&gt;
    &lt;!-- Transform the app.config file --&gt;    
    &lt;ItemGroup&gt;
      &lt;_AppConfigTarget Include="@(AppConfigWithTargetPath-&gt;'$(OutDir)%(TargetPath)')" /&gt;
    &lt;/ItemGroup&gt;
    
    &lt;PropertyGroup&gt;
      &lt;_AppConfigDest&gt;@(_AppConfigTarget-&gt;'%(FullPath)')&lt;/_AppConfigDest&gt;
    &lt;/PropertyGroup&gt;

    &lt;MakeDir Directories="@(_FilesToTransformNotAppConfig-&gt;'$(OutDir)%(RelativeDir)')"
             Condition="Exists('%(RelativeDir)%(Filename).$(Configuration)%(Extension)')"/&gt;
    
    &lt;TransformXml Source="@(_AppConfigToTransform-&gt;'%(FullPath)')"
                  Transform="%(RelativeDir)%(Filename).$(Configuration)%(Extension)"
                  Destination="$(_AppConfigDest)"
                  Condition=" Exists('%(RelativeDir)%(Filename).$(Configuration)%(Extension)') " /&gt;

    
    &lt;TransformXml Source="@(_FilesToTransformNotAppConfig-&gt;'%(FullPath)')"
                  Transform="%(RelativeDir)%(Filename).$(Configuration)%(Extension)"
                  Destination="@(_FilesToTransformNotAppConfig-&gt;'$(OutDir)%(RelativeDir)%(Filename)%(Extension)')"
                  Condition=" Exists('%(RelativeDir)%(Filename).$(Configuration)%(Extension)') " /&gt;
  &lt;/Target&gt;
  
  &lt;Target Name="DiscoverFilesToTransform"&gt;
    &lt;!-- 
    This will look through items list: None &amp; Content for those
    with Metadata &lt;TransformOnBuild&gt;True&lt;/TransformOnBuild&gt;
    --&gt;
    &lt;ItemGroup&gt;
      &lt;_FilesToTransform Include="@(None);@(Content);@(Resource);@(EmbeddedResource)"
                         Condition=" '%(TransformOnBuild)' == 'true' "/&gt;
    &lt;/ItemGroup&gt;    

    &lt;PropertyGroup&gt;
      &lt;_AppConfigFullPath&gt;@(AppConfigWithTargetPath-&gt;'%(RootDir)%(Directory)%(Filename)%(Extension)')&lt;/_AppConfigFullPath&gt;
    &lt;/PropertyGroup&gt;

    &lt;!-- Now look to see if any of these are the app.config file --&gt;
    &lt;ItemGroup&gt;
      &lt;_FilesToTransform Condition=" '%(FullPath)'=='$(_AppConfigFullPath)' "&gt;
        &lt;IsAppConfig&gt;true&lt;/IsAppConfig&gt;
      &lt;/_FilesToTransform&gt;
    &lt;/ItemGroup&gt;
          
    &lt;ItemGroup&gt;
      &lt;_FilesToTransformNotAppConfig Include="@(_FilesToTransform)"
                                     Condition=" '%(IsAppConfig)'!='true'"/&gt;
      
      &lt;_AppConfigToTransform  Include="@(_FilesToTransform)"
                              Condition=" '%(IsAppConfig)'=='true'"/&gt;
    &lt;/ItemGroup&gt;
  &lt;/Target&gt;
&lt;/Project&gt;</pre>
        <h3>Gaps
</h3>
        <p>
With most things found on blogs there are some gaps Those are described here.
</p>
        <p>
          <u>Clean build</u> =&gt; It’s a best practice to delete files upon clean, but in this
case I am not. This would be pretty easy to add, if you are interested let us know
and I will update the sample.
</p>
        <p>
          <u>Incremental build</u> =&gt; The transforms will run every time you build even if
the outputs are up to date, if this is an issue for you let us know and I will update
the sample.
</p>
        <h3>Sharing with team members
</h3>
        <p>
If you want to share with team members instead of placing this into %ProgramFiles
(x86)% just place it into a folder in version control then change the <em>&lt;Import</em> statement
to point to that file instead of using MSBuildExtensionPath.
</p>
        <h3> 
</h3>
        <p>
          <font style="background-color: #ffff00">If you end up using this please let us know
what is your experience with it.</font>
        </p>
        <h3>Resources
</h3>
        <ul>
          <li>
            <a href="http://sedotech.com/Content/samples/TransformFiles.targets" target="_blank">TransformFiles.targets</a>
          </li>
          <li>
            <a href="http://sedotech.com/Content/samples/TransformExample.zip" target="_blank">Transform
Sample</a>
          </li>
          <li>
            <a href="http://sedodream.com/2010/04/26/ConfigTransformationsOutsideOfWebAppBuilds.aspx">Config
transformations outside of web app builds</a>
          </li>
          <li>
            <a href="http://sedodream.com/2010/09/09/ExtendingXMLWebconfigConfigTransformation.aspx">Extending
XML (web.config) Config transformation</a>
          </li>
          <li>
            <a href="http://sedodream.com/2010/11/11/ASPNETWebApplicationPublishPackageTokenizingParameters.aspx">ASP.NET
Web Application: Publish/Package Tokenizing Parameters</a>
          </li>
        </ul>
        <p>
Sayed Ibrahim Hashimi <a href="http://twitter.com/sayedihashimi" target="_blank">@sayedihashimi</a></p>
      </body>
      <title>XDT (web.config) Transforms in non-web projects</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,dbdd0002-7b3c-47b1-b891-9c361b087af6.aspx</guid>
      <link>http://sedodream.com/2010/11/18/XDTWebconfigTransformsInNonwebProjects.aspx</link>
      <pubDate>Thu, 18 Nov 2010 05:41:09 GMT</pubDate>
      <description>&lt;p&gt;
One of the really cool features that we shipped for Visual Studio 2010 was &lt;a href="http://msdn.microsoft.com/en-us/library/dd465326.aspx" target="_blank"&gt;web.config
(XDT) transformations&lt;/a&gt;. Because the transformations are so simple and straightforward
one of the first questions that someone asks after using it is “how can I use this
in my other projects?” Unfortunately this feature is only built into the Web Application
Projects (WAP). But it is very easy to reuse this because we just rely on an MSBuild
task to do the heavy lifting for us. I received an email from that basically went
like this 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;“Hi, I would like to use XDT transformations on my WPF project for both the app.config
file as well as my unity.xml file. How can I do this?”&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
So one answer is to modify your project file to use the TransformXml task as I have
blogged previously about (link below). But I thought that since this was such a common
problem that I should go ahead and create a .targets file which would solve the above
problem and could be re-used by anyone.
&lt;/p&gt;
&lt;p&gt;
Let me clarify the scenario a bit before we dive into the details of the solution.
I have create a sample Wpf project, named Wpf01. Inside of that project I have created
these files:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
app.confog&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
app.debug.config&lt;/li&gt;
&lt;li&gt;
app.release.config&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
Sample01.xml&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
Sample01.debug.xml&lt;/li&gt;
&lt;li&gt;
Sample01.release.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
Sub\Sub\Sub01.xml&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
Sub\Sub\Sub01.debug.xml&lt;/li&gt;
&lt;li&gt;
Sub\Sub\Sub01.release.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;
Take a look at the image below (note: I manually edited the project file to make the
file nest under each other, I will explain that shortly)
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/XDT.config-Transforms-in-non-web-project_11EA1/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/XDT.config-Transforms-in-non-web-project_11EA1/image_thumb.png" width="237" height="397" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The files with .debug/.release are transform files. When I build I expect the following
to happen:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Transform app.config with app.{Configuration}.config and write file to output folder
with the correct name i.e. Wpf01.exe.config instead of just app.config&lt;/li&gt;
&lt;li&gt;
Transform Sample01.xml with Sample01.{Configuration}.config and write it to output
folder with the name Sample01.config&lt;/li&gt;
&lt;li&gt;
Transform Sub\Sub\Sub01.xml with Sub\Sub\Sub01.{Configuration}.config and write it
to the output folder with the name Sub\Sub\Sub01.xml&lt;/li&gt;
&lt;li&gt;
None of my source files should change&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Usage
&lt;/h3&gt;
&lt;p&gt;
Before I get into the solution let me explain how to use the solution first because
if you are not interested in the MSBuild details you can skip over that &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://sedodream.com/content/binary/Windows-Live-Writer/XDT.config-Transforms-in-non-web-project_11EA1/wlEmoticon-smile_2.png" /&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
You must have installed Web projects with Visual Studio on the machine (it contains
the TransformXmll task).&lt;/li&gt;
&lt;li&gt;
Create the folder %ProgramFiles (x86)%\MSBuild\Custom. If you want to share this across
team members then see my note at the end of this blog.&lt;/li&gt;
&lt;li&gt;
Download TransformFiles.targets (link below) and place the file into the folder %ProgramFiles
(x86)%\MSBuild\Custom.&lt;/li&gt;
&lt;li&gt;
Edit your project file (right click on the project Unload Project, right click again
and pick edit)&lt;/li&gt;
&lt;li&gt;
At the end of the project file place the element &lt;strong&gt;&amp;lt;Import Project=&amp;quot;$(MSBuildExtensionsPath)\Custom\TransformFiles.targets&amp;quot;
/&amp;gt;&lt;/strong&gt; immediately above the closing &amp;lt;/Project&amp;gt; tag&lt;/li&gt;
&lt;li&gt;
For files that you want transformed a metadata value of TransformOnBuild to true.
See below on what this means.&lt;/li&gt;
&lt;li&gt;
Build and take a look at files in your output directory&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
For #5 lets examine the sample that I created. In this sample I had an app.config
file. When I first created the project the entry in the project file for app.config
looked like the following.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;None Include=&amp;quot;app.config&amp;quot; /&amp;gt;&lt;/pre&gt;
&lt;p&gt;
So what you need to do is to add a new metadata value as described above for that.
So it will turn into the following.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;None Include=&amp;quot;app.config&amp;quot;&amp;gt;
  &amp;lt;TransformOnBuild&amp;gt;true&amp;lt;/TransformOnBuild&amp;gt;
&amp;lt;/None&amp;gt;&lt;/pre&gt;
&lt;p&gt;
The transform targets will look for items that have this value declared on them and
then during build it will transform them, if the transform file exists in the same
folder as the file itself. You will need to add TransfromOnBuild to all the files
that you want to transform. So in my case I added it to app.config, Sample01.xml and
Sub01.xml. Note you should not add this to the transform files themselves because
you will just waste your own time. After you do this you should perform a build then
take a look at the output directory for your transformed files. The app.config should
write out the the correct file and the others as expected.
&lt;/p&gt;
&lt;h3&gt;Nest transforms under the source file
&lt;/h3&gt;
&lt;p&gt;
You might have noticed that in the image above that the transform files are nested
under the files themselves. To do this you need to add the DependentUpon metadata
value to the child items. For instance for app.config the child items look like the
following.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;None Include=&amp;quot;app.debug.config&amp;quot;&amp;gt;
  &amp;lt;DependentUpon&amp;gt;app.config&amp;lt;/DependentUpon&amp;gt;
&amp;lt;/None&amp;gt;
&amp;lt;None Include=&amp;quot;app.release.config&amp;quot;&amp;gt;
  &amp;lt;DependentUpon&amp;gt;app.config&amp;lt;/DependentUpon&amp;gt;
&amp;lt;/None&amp;gt;&lt;/pre&gt;
&lt;h3&gt;Implementation
&lt;/h3&gt;
&lt;p&gt;
If you are wondering how this works then this is the section for you. TransformFile.targets
has 2 targets; DiscoverFilesToTransform and TransformAllFiles. DiscoverFilesToTransform
looks through a set of items (None, Content, and Resource). Inside of DiscoverFilesToTransform
I look for values with the %(TransformOnBuild)==true. After all of those are collected
I identify if there is an app.config file being transformed and if so it is placed
into a specific item list and all others go into another item list.
&lt;/p&gt;
&lt;p&gt;
Inside of TransformAllFiles the TransformXml task is used to transform all of the
files. This target injects itself into the build process by having the attribute &lt;em&gt;AfterTargets=&amp;quot;Build;_CopyAppConfigFile&amp;quot;&lt;/em&gt;.
So whenever the Build or _CopyAppConfigFile targets are called the TransformAllFiles
target will execute.
&lt;/p&gt;
&lt;p&gt;
Here if the full code for this file.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;Project xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
  &amp;lt;UsingTask TaskName=&amp;quot;TransformXml&amp;quot;
         AssemblyFile=&amp;quot;$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll&amp;quot;/&amp;gt;
  
  &amp;lt;ItemDefinitionGroup&amp;gt;
    &amp;lt;!-- Set the default value to false here --&amp;gt;
    &amp;lt;None&amp;gt;
      &amp;lt;TransformOnBuild&amp;gt;false&amp;lt;/TransformOnBuild&amp;gt;
    &amp;lt;/None&amp;gt;    
    &amp;lt;Content&amp;gt;
      &amp;lt;TransformOnBuild&amp;gt;false&amp;lt;/TransformOnBuild&amp;gt;
    &amp;lt;/Content&amp;gt;    
    &amp;lt;Resource&amp;gt;
      &amp;lt;TransformOnBuild&amp;gt;false&amp;lt;/TransformOnBuild&amp;gt;
    &amp;lt;/Resource&amp;gt;
    &amp;lt;EmbeddedResource&amp;gt;
      &amp;lt;TransformOnBuild&amp;gt;false&amp;lt;/TransformOnBuild&amp;gt;
    &amp;lt;/EmbeddedResource&amp;gt;
    
    &amp;lt;_FilesToTransform&amp;gt;
      &amp;lt;IsAppConfig&amp;gt;false&amp;lt;/IsAppConfig&amp;gt;
    &amp;lt;/_FilesToTransform&amp;gt;
  &amp;lt;/ItemDefinitionGroup&amp;gt;

  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;TransformAllFilesDependsOn&amp;gt;
      DiscoverFilesToTransform;
    &amp;lt;/TransformAllFilesDependsOn&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
  &amp;lt;Target Name=&amp;quot;TransformAllFiles&amp;quot; DependsOnTargets=&amp;quot;$(TransformAllFilesDependsOn)&amp;quot; AfterTargets=&amp;quot;Build;_CopyAppConfigFile&amp;quot;&amp;gt;
    &amp;lt;!-- Now we have the item list _FilesToTransformNotAppConfig and _AppConfigToTransform item lists --&amp;gt;
    &amp;lt;!-- Transform the app.config file --&amp;gt;    
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;_AppConfigTarget Include=&amp;quot;@(AppConfigWithTargetPath-&amp;gt;'$(OutDir)%(TargetPath)')&amp;quot; /&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;
    
    &amp;lt;PropertyGroup&amp;gt;
      &amp;lt;_AppConfigDest&amp;gt;@(_AppConfigTarget-&amp;gt;'%(FullPath)')&amp;lt;/_AppConfigDest&amp;gt;
    &amp;lt;/PropertyGroup&amp;gt;

    &amp;lt;MakeDir Directories=&amp;quot;@(_FilesToTransformNotAppConfig-&amp;gt;'$(OutDir)%(RelativeDir)')&amp;quot;
             Condition=&amp;quot;Exists('%(RelativeDir)%(Filename).$(Configuration)%(Extension)')&amp;quot;/&amp;gt;
    
    &amp;lt;TransformXml Source=&amp;quot;@(_AppConfigToTransform-&amp;gt;'%(FullPath)')&amp;quot;
                  Transform=&amp;quot;%(RelativeDir)%(Filename).$(Configuration)%(Extension)&amp;quot;
                  Destination=&amp;quot;$(_AppConfigDest)&amp;quot;
                  Condition=&amp;quot; Exists('%(RelativeDir)%(Filename).$(Configuration)%(Extension)') &amp;quot; /&amp;gt;

    
    &amp;lt;TransformXml Source=&amp;quot;@(_FilesToTransformNotAppConfig-&amp;gt;'%(FullPath)')&amp;quot;
                  Transform=&amp;quot;%(RelativeDir)%(Filename).$(Configuration)%(Extension)&amp;quot;
                  Destination=&amp;quot;@(_FilesToTransformNotAppConfig-&amp;gt;'$(OutDir)%(RelativeDir)%(Filename)%(Extension)')&amp;quot;
                  Condition=&amp;quot; Exists('%(RelativeDir)%(Filename).$(Configuration)%(Extension)') &amp;quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;
  
  &amp;lt;Target Name=&amp;quot;DiscoverFilesToTransform&amp;quot;&amp;gt;
    &amp;lt;!-- 
    This will look through items list: None &amp;amp; Content for those
    with Metadata &amp;lt;TransformOnBuild&amp;gt;True&amp;lt;/TransformOnBuild&amp;gt;
    --&amp;gt;
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;_FilesToTransform Include=&amp;quot;@(None);@(Content);@(Resource);@(EmbeddedResource)&amp;quot;
                         Condition=&amp;quot; '%(TransformOnBuild)' == 'true' &amp;quot;/&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;    

    &amp;lt;PropertyGroup&amp;gt;
      &amp;lt;_AppConfigFullPath&amp;gt;@(AppConfigWithTargetPath-&amp;gt;'%(RootDir)%(Directory)%(Filename)%(Extension)')&amp;lt;/_AppConfigFullPath&amp;gt;
    &amp;lt;/PropertyGroup&amp;gt;

    &amp;lt;!-- Now look to see if any of these are the app.config file --&amp;gt;
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;_FilesToTransform Condition=&amp;quot; '%(FullPath)'=='$(_AppConfigFullPath)' &amp;quot;&amp;gt;
        &amp;lt;IsAppConfig&amp;gt;true&amp;lt;/IsAppConfig&amp;gt;
      &amp;lt;/_FilesToTransform&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;
          
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;_FilesToTransformNotAppConfig Include=&amp;quot;@(_FilesToTransform)&amp;quot;
                                     Condition=&amp;quot; '%(IsAppConfig)'!='true'&amp;quot;/&amp;gt;
      
      &amp;lt;_AppConfigToTransform  Include=&amp;quot;@(_FilesToTransform)&amp;quot;
                              Condition=&amp;quot; '%(IsAppConfig)'=='true'&amp;quot;/&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;
  &amp;lt;/Target&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;h3&gt;Gaps
&lt;/h3&gt;
&lt;p&gt;
With most things found on blogs there are some gaps Those are described here.
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Clean build&lt;/u&gt; =&amp;gt; It’s a best practice to delete files upon clean, but in this
case I am not. This would be pretty easy to add, if you are interested let us know
and I will update the sample.
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Incremental build&lt;/u&gt; =&amp;gt; The transforms will run every time you build even if
the outputs are up to date, if this is an issue for you let us know and I will update
the sample.
&lt;/p&gt;
&lt;h3&gt;Sharing with team members
&lt;/h3&gt;
&lt;p&gt;
If you want to share with team members instead of placing this into %ProgramFiles
(x86)% just place it into a folder in version control then change the &lt;em&gt;&amp;lt;Import&lt;/em&gt; statement
to point to that file instead of using MSBuildExtensionPath.
&lt;/p&gt;
&lt;h3&gt;&amp;#160;
&lt;/h3&gt;
&lt;p&gt;
&lt;font style="background-color: #ffff00"&gt;If you end up using this please let us know
what is your experience with it.&lt;/font&gt;
&lt;/p&gt;
&lt;h3&gt;Resources
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://sedotech.com/Content/samples/TransformFiles.targets" target="_blank"&gt;TransformFiles.targets&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://sedotech.com/Content/samples/TransformExample.zip" target="_blank"&gt;Transform
Sample&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://sedodream.com/2010/04/26/ConfigTransformationsOutsideOfWebAppBuilds.aspx"&gt;Config
transformations outside of web app builds&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://sedodream.com/2010/09/09/ExtendingXMLWebconfigConfigTransformation.aspx"&gt;Extending
XML (web.config) Config transformation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://sedodream.com/2010/11/11/ASPNETWebApplicationPublishPackageTokenizingParameters.aspx"&gt;ASP.NET
Web Application: Publish/Package Tokenizing Parameters&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi &lt;a href="http://twitter.com/sayedihashimi" target="_blank"&gt;@sayedihashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,dbdd0002-7b3c-47b1-b891-9c361b087af6.aspx</comments>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
      <category>MSDeploy</category>
      <category>Web Publishing Pipeline</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=c74e3388-0bdd-4295-85cb-b9ef0286947a</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,c74e3388-0bdd-4295-85cb-b9ef0286947a.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,c74e3388-0bdd-4295-85cb-b9ef0286947a.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c74e3388-0bdd-4295-85cb-b9ef0286947a</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today I just saw a question posted on stackoverflow.com asking <a href="http://stackoverflow.com/q/4151325/105999" target="_blank">Why
are some Web.config transforms tokenised into SetParameters.xml and others are not</a>?
Let me give some background on this topic for those who are not aware of what the
question is.
</p>
        <p>
With Visual Studio 2010 when you package your application using the Build Deployment
Package context menu option, see image below.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/e49083eab7c6_12533/image_2.png">
            <img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/e49083eab7c6_12533/image_thumb.png" width="352" height="484" />
          </a>
        </p>
        <p>
When build the package by default the package will be created in obj\{Configuration}\Package\{ProjectName}.zip
where {Configuration} is the current build configuration, and {ProjectName} is the
name of the project. So in this case I since I’m building with Debug and the project
name is MvcApplication1 the package will be placed at <strong>obj\Debug\Package\MvcApplication1.zip</strong>.
If you take this package and then import into IIS 7 with the “Import Application”
option shown below. Note: The machine must have the <a href="http://www.iis.net/download/WebDeploy" target="_blank">Web
Deployment Tool</a> (aka MSDeploy) installed.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/e49083eab7c6_12533/image_4.png">
            <img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/e49083eab7c6_12533/image_thumb_1.png" width="218" height="280" />
          </a>
        </p>
        <p>
Once you click on Import Application then browse out to the package you will be shown
a screen which prompts your for parameters. Its shown below.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/Windows-Live-Writer/e49083eab7c6_12533/SNAGHTML2d2664.png">
            <img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML2d2664" border="0" alt="SNAGHTML2d2664" src="http://sedodream.com/content/binary/Windows-Live-Writer/e49083eab7c6_12533/SNAGHTML2d2664_thumb.png" width="681" height="514" />
          </a>
        </p>
        <p>
On this screen you can see that we are prompting for a couple parameter values here.
One is an IIS setting, Application Path, and the other is a connection string which
will be placed inside the web.config file. If your Web Application Project (WAP) 
had 5 different connection strings then they would automatically show up here on this
page. Since connection strings are replaced so often we create parameters for all
connection strings by default. You can define new parameters on your own, quite easily
actually, but that is the topic for another blog post.
</p>
        <p>
Now back to the question. He is asking why do we “tokenize” the connection strings
in web.config. To clarify take a look at my web.config file below.
</p>
        <pre class="brush: xml;">&lt;configuration&gt;
  &lt;appSettings&gt;
    &lt;add key="setting01" value="value01"/&gt;
  &lt;/appSettings&gt;
  
  &lt;connectionStrings&gt;
    &lt;add name="ApplicationServices"
         connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
         providerName="System.Data.SqlClient" /&gt;
  &lt;/connectionStrings&gt;
  
&lt;/configuration&gt;</pre>
        <p>
After I perform a package this will get changed. Take a look @ the web.config file
which resides in the package (you can get to the file at obj\{CofigurationName}\Package\PackageTmp\web.config).
You will see what is shown below.
</p>
        <pre class="brush: xml;">&lt;configuration&gt;
  &lt;appSettings&gt;
    &lt;add key="setting01" value="value01"/&gt;
  &lt;/appSettings&gt;
  &lt;connectionStrings&gt;
    &lt;add name="ApplicationServices"
         connectionString="$(ReplacableToken_ApplicationServices-Web.config Connection String_0)"
         providerName="System.Data.SqlClient" /&gt;
  &lt;/connectionStrings&gt;

&lt;/configuration&gt;</pre>
        <p>
So his question is why is the connection string replaced with $(ReplacableToken_ApplicationServices-Web.config
Connection String_0) and nothing else is? We do this because we do not want you to
accidently copy your web to a location and have it executing SQL statements against
a SQL server which you did not intend. The idea is that you will create a package
that you can deploy to many different environments. So the value that was in your
web.config (or web.debug.config/web.release.config if you are using a <a href="http://blogs.msdn.com/b/webdevtools/archive/2009/05/04/web-deployment-web-config-transformation.aspx?wa=wsignin1.0" target="_blank">web.config
transformation</a>) will not be placed inside the web.config in the package. Instead
those values will be used as defaults in the package itself. We also create a SetParameters.xml
file for you so that you can tweak the values. For my app see the MvcApplication1.SetParameters.xml
file below.
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;parameters&gt;
  &lt;setParameter name="IIS Web Application Name" 
                value="Default Web Site/MvcApplication1_deploy" /&gt;
  &lt;setParameter name="ApplicationServices-Web.config Connection String" 
                value="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" /&gt;
&lt;/parameters&gt;</pre>
        <p>
The idea is that you can deploy your package in 2 ways. Through the IIS Manager which
will prompt you for the parameters or you can deploy using msdeploy.exe with the –setParamFile
switch to specify the path to the SetParameters.xml file. In this case I could create
a QA01.SetParameters.xml file along with a QA02.SetParameters.xml file to deploy my
web to my two QA servers. How do we do this?
</p>
        <h4>How connection strings are tokenized
</h4>
        <p>
You might be wondering how the connection strings are tokenized to begin with. With
Visual Studio 2010 we released web.config transformations, which all you to write
terse web.config transformations inside of files like web.debug.config/web.release.config.
When you package/publish your web these transform files are used to transform your
web.config based on what you expressed in the appropriate transform file. We have
an MSBuild task TransformXml which performs the transformation. We use that same task
to tokenize the connection strings. If you are interested in the details take a look
at %ProgramFiles32%\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets
in the <strong>AutoParameterizationWebConfigConnectionStringsCore</strong> target.
</p>
        <p>
Now what if you do not want the connection string tokenized?
</p>
        <h4>Prevent tokenizing connection strings
</h4>
        <p>
If you want to prevent your web.config connection strings from being tokenized it’s
pretty easy. All we need to do is the add a property to the build/package/publish
process. We can do that in 2 ways. Edit the project file itself or create a file with
the name {ProjectName}.wpp.targets where {ProjectName} is the name of your project.
The second approach is easier so I use that. In my case it would be MvcApplication1.wpp.targets.
The contents of the file are shown below.
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;

  &lt;PropertyGroup&gt;
    &lt;AutoParameterizationWebConfigConnectionStrings&gt;false&lt;/AutoParameterizationWebConfigConnectionStrings&gt;
  &lt;/PropertyGroup&gt;
  
&lt;/Project&gt;

<strong><u>Note:
You may need to reload the project in Visual Studio for this to take effect.</u></strong></pre>
        <p>
Inside of this file I have declared the property, AutoParameterizationWebConfigConnectionStrings,
to be false. This is telling the Web Publishing Pipeline (WPP) that it should not
replace replace the connection strings with tokens, instead leave them as they are.
</p>
        <p>
Questions/Comments???
</p>
        <h4>Other Resources
</h4>
        <ul>
          <li>
            <a href="http://sedodream.com/2010/04/26/ConfigTransformationsOutsideOfWebAppBuilds.aspx">Config
transformations outside of web app builds</a>
          </li>
          <li>
            <a href="http://sedodream.com/2010/09/09/ExtendingXMLWebconfigConfigTransformation.aspx">Extending
XML (web.config) Config transformation</a>
          </li>
        </ul>
      </body>
      <title>ASP.NET Web Application: Publish/Package Tokenizing Parameters</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,c74e3388-0bdd-4295-85cb-b9ef0286947a.aspx</guid>
      <link>http://sedodream.com/2010/11/11/ASPNETWebApplicationPublishPackageTokenizingParameters.aspx</link>
      <pubDate>Thu, 11 Nov 2010 05:41:09 GMT</pubDate>
      <description>&lt;p&gt;
Today I just saw a question posted on stackoverflow.com asking &lt;a href="http://stackoverflow.com/q/4151325/105999" target="_blank"&gt;Why
are some Web.config transforms tokenised into SetParameters.xml and others are not&lt;/a&gt;?
Let me give some background on this topic for those who are not aware of what the
question is.
&lt;/p&gt;
&lt;p&gt;
With Visual Studio 2010 when you package your application using the Build Deployment
Package context menu option, see image below.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/e49083eab7c6_12533/image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/e49083eab7c6_12533/image_thumb.png" width="352" height="484" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
When build the package by default the package will be created in obj\{Configuration}\Package\{ProjectName}.zip
where {Configuration} is the current build configuration, and {ProjectName} is the
name of the project. So in this case I since I’m building with Debug and the project
name is MvcApplication1 the package will be placed at &lt;strong&gt;obj\Debug\Package\MvcApplication1.zip&lt;/strong&gt;.
If you take this package and then import into IIS 7 with the “Import Application”
option shown below. Note: The machine must have the &lt;a href="http://www.iis.net/download/WebDeploy" target="_blank"&gt;Web
Deployment Tool&lt;/a&gt; (aka MSDeploy) installed.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/e49083eab7c6_12533/image_4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/Windows-Live-Writer/e49083eab7c6_12533/image_thumb_1.png" width="218" height="280" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Once you click on Import Application then browse out to the package you will be shown
a screen which prompts your for parameters. Its shown below.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/Windows-Live-Writer/e49083eab7c6_12533/SNAGHTML2d2664.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML2d2664" border="0" alt="SNAGHTML2d2664" src="http://sedodream.com/content/binary/Windows-Live-Writer/e49083eab7c6_12533/SNAGHTML2d2664_thumb.png" width="681" height="514" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
On this screen you can see that we are prompting for a couple parameter values here.
One is an IIS setting, Application Path, and the other is a connection string which
will be placed inside the web.config file. If your Web Application Project (WAP)&amp;#160;
had 5 different connection strings then they would automatically show up here on this
page. Since connection strings are replaced so often we create parameters for all
connection strings by default. You can define new parameters on your own, quite easily
actually, but that is the topic for another blog post.
&lt;/p&gt;
&lt;p&gt;
Now back to the question. He is asking why do we “tokenize” the connection strings
in web.config. To clarify take a look at my web.config file below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;configuration&amp;gt;
  &amp;lt;appSettings&amp;gt;
    &amp;lt;add key=&amp;quot;setting01&amp;quot; value=&amp;quot;value01&amp;quot;/&amp;gt;
  &amp;lt;/appSettings&amp;gt;
  
  &amp;lt;connectionStrings&amp;gt;
    &amp;lt;add name=&amp;quot;ApplicationServices&amp;quot;
         connectionString=&amp;quot;data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true&amp;quot;
         providerName=&amp;quot;System.Data.SqlClient&amp;quot; /&amp;gt;
  &amp;lt;/connectionStrings&amp;gt;
  
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;
After I perform a package this will get changed. Take a look @ the web.config file
which resides in the package (you can get to the file at obj\{CofigurationName}\Package\PackageTmp\web.config).
You will see what is shown below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;configuration&amp;gt;
  &amp;lt;appSettings&amp;gt;
    &amp;lt;add key=&amp;quot;setting01&amp;quot; value=&amp;quot;value01&amp;quot;/&amp;gt;
  &amp;lt;/appSettings&amp;gt;
  &amp;lt;connectionStrings&amp;gt;
    &amp;lt;add name=&amp;quot;ApplicationServices&amp;quot;
         connectionString=&amp;quot;$(ReplacableToken_ApplicationServices-Web.config Connection String_0)&amp;quot;
         providerName=&amp;quot;System.Data.SqlClient&amp;quot; /&amp;gt;
  &amp;lt;/connectionStrings&amp;gt;

&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;
So his question is why is the connection string replaced with $(ReplacableToken_ApplicationServices-Web.config
Connection String_0) and nothing else is? We do this because we do not want you to
accidently copy your web to a location and have it executing SQL statements against
a SQL server which you did not intend. The idea is that you will create a package
that you can deploy to many different environments. So the value that was in your
web.config (or web.debug.config/web.release.config if you are using a &lt;a href="http://blogs.msdn.com/b/webdevtools/archive/2009/05/04/web-deployment-web-config-transformation.aspx?wa=wsignin1.0" target="_blank"&gt;web.config
transformation&lt;/a&gt;) will not be placed inside the web.config in the package. Instead
those values will be used as defaults in the package itself. We also create a SetParameters.xml
file for you so that you can tweak the values. For my app see the MvcApplication1.SetParameters.xml
file below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;parameters&amp;gt;
  &amp;lt;setParameter name=&amp;quot;IIS Web Application Name&amp;quot; 
                value=&amp;quot;Default Web Site/MvcApplication1_deploy&amp;quot; /&amp;gt;
  &amp;lt;setParameter name=&amp;quot;ApplicationServices-Web.config Connection String&amp;quot; 
                value=&amp;quot;data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true&amp;quot; /&amp;gt;
&amp;lt;/parameters&amp;gt;&lt;/pre&gt;
&lt;p&gt;
The idea is that you can deploy your package in 2 ways. Through the IIS Manager which
will prompt you for the parameters or you can deploy using msdeploy.exe with the –setParamFile
switch to specify the path to the SetParameters.xml file. In this case I could create
a QA01.SetParameters.xml file along with a QA02.SetParameters.xml file to deploy my
web to my two QA servers. How do we do this?
&lt;/p&gt;
&lt;h4&gt;How connection strings are tokenized
&lt;/h4&gt;
&lt;p&gt;
You might be wondering how the connection strings are tokenized to begin with. With
Visual Studio 2010 we released web.config transformations, which all you to write
terse web.config transformations inside of files like web.debug.config/web.release.config.
When you package/publish your web these transform files are used to transform your
web.config based on what you expressed in the appropriate transform file. We have
an MSBuild task TransformXml which performs the transformation. We use that same task
to tokenize the connection strings. If you are interested in the details take a look
at %ProgramFiles32%\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets
in the &lt;strong&gt;AutoParameterizationWebConfigConnectionStringsCore&lt;/strong&gt; target.
&lt;/p&gt;
&lt;p&gt;
Now what if you do not want the connection string tokenized?
&lt;/p&gt;
&lt;h4&gt;Prevent tokenizing connection strings
&lt;/h4&gt;
&lt;p&gt;
If you want to prevent your web.config connection strings from being tokenized it’s
pretty easy. All we need to do is the add a property to the build/package/publish
process. We can do that in 2 ways. Edit the project file itself or create a file with
the name {ProjectName}.wpp.targets where {ProjectName} is the name of your project.
The second approach is easier so I use that. In my case it would be MvcApplication1.wpp.targets.
The contents of the file are shown below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;Project xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;

  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;AutoParameterizationWebConfigConnectionStrings&amp;gt;false&amp;lt;/AutoParameterizationWebConfigConnectionStrings&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
  
&amp;lt;/Project&amp;gt;

&lt;strong&gt;&lt;u&gt;Note:
You may need to reload the project in Visual Studio for this to take effect.&lt;/u&gt;&lt;/strong&gt;&lt;/pre&gt;
&lt;p&gt;
Inside of this file I have declared the property, AutoParameterizationWebConfigConnectionStrings,
to be false. This is telling the Web Publishing Pipeline (WPP) that it should not
replace replace the connection strings with tokens, instead leave them as they are.
&lt;/p&gt;
&lt;p&gt;
Questions/Comments???
&lt;/p&gt;
&lt;h4&gt;Other Resources
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://sedodream.com/2010/04/26/ConfigTransformationsOutsideOfWebAppBuilds.aspx"&gt;Config
transformations outside of web app builds&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://sedodream.com/2010/09/09/ExtendingXMLWebconfigConfigTransformation.aspx"&gt;Extending
XML (web.config) Config transformation&lt;/a&gt; 
&lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,c74e3388-0bdd-4295-85cb-b9ef0286947a.aspx</comments>
      <category>asp.net</category>
      <category>Deployment</category>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
      <category>MSDeploy</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=269ec8d3-9d71-400a-bd99-cc3ea5d0c834</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,269ec8d3-9d71-400a-bd99-cc3ea5d0c834.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,269ec8d3-9d71-400a-bd99-cc3ea5d0c834.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=269ec8d3-9d71-400a-bd99-cc3ea5d0c834</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just saw a post on <a href="http://twitter.com/#!/troyahunt/status/29612666076">twitter</a> asking
the question
</p>
        <blockquote>
          <p>
            <strong>
              <em>Is there any easy way to see the underlying MSBuild command when building
in VS2010? Want to see the MSDeploy params. @</em>
            </strong>
            <a href="http://twitter.com/wdeploy">
              <em>wdeploy</em>
            </a>
            <strong>
              <em>?</em>
            </strong>
          </p>
        </blockquote>
        <p>
This is actually pretty easy, but wouldn’t fit into 140 characters, so I decided to
blog it. 
</p>
        <p>
One thing to know is that when you publish from Visual Studio, by default we use the
MSDeploy (AKA Web Deployment Tool) Object Model in order to perform the deployment.
We do this for performance and other reasons. Because of this there is no real msdeploy.exe
command that is being issued. You can however change that behavior. This is controlled
by an MSBuild property <strong>UseMSDeployExe</strong> which is false by default.
In this case since <a href="http://twitter.com/troyahunt">Troy</a> wants to see the
command we will need to set that property to false. There are 2 ways in which you
can do this. You can set it in the project file itself, or you can define it in a
.wpp.targets file. I would recommend the second approach. What you need to do is to
create a file with the name {ProjectName}.wpp.targets in the same directory as the
project where {ProjectName} is the name of the Web Application Project (WAP). When
you do this, during a build or publish the file is automatically imported into the
build process. In my example I have a WAP named WebApplication1.csproj, so I created
the file WebApplication1.wpp.targets and its contents are shown below.
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project ToolsVersion="4.0" DefaultTargets="Build" 
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
  &lt;PropertyGroup&gt;
    &lt;UseMsdeployExe&gt;true&lt;/UseMsdeployExe&gt;
  &lt;/PropertyGroup&gt;
&lt;/Project&gt;</pre>
        <p>
In the snippet above you can see that I defined the property to true. Now there is
one more thing to do, publish the project. Once you publish the project, in the output
window you will see the MSDeploy command which is being used. In my case I published
the project to <strong><em>localhost</em></strong> to the <strong><em>Default Web
Site/Test01</em></strong> application path. You may have to copy the text from the
output window into Notepad and search for msdeploy.exe. The command that was issued
in my case is shown below (<em>with formatting changes for readability</em>).
</p>
        <pre class="brush: plain;">"C:\Program Files (x86)\IIS\Microsoft Web Deploy\msdeploy.exe" 
-source:manifest='C:\temp\_NET\ThrowAway\WebApplication3\WebApplication1\obj\Debug\Package\WebApplication1.SourceManifest.xml' 
-dest:auto,IncludeAcls='False',AuthType='NTLM' 
-verb:sync 
-enableRule:DoNotDeleteRule 
-disableLink:AppPoolExtension 
-disableLink:ContentExtension 
-disableLink:CertificateExtension 
-setParam:kind='ProviderPath',
    scope='IisApp',match='^C:\\temp\\_NET\\ThrowAway\\WebApplication3\\WebApplication1\\obj\\Debug\\Package\\PackageTmp$',
    value='Default Web Site/Test01' 
-setParam:kind='ProviderPath',
    scope='setAcl',
    match='^C:\\temp\\_NET\\ThrowAway\\WebApplication3\\WebApplication1\\obj\\Debug\\Package\\PackageTmp$',
    value='Default Web Site/Test01' 
-retryAttempts=2 </pre>
        <p>
So that’s it, pretty simple.
</p>
        <p>
FYI, if you want more detail you can increase the MSBuild Output Window verbosity
by going to Tools-&gt;Options-&gt;Projects and Solutions-&gt;Build and Run then specifying
a different value for <strong><em>MSBuild project build output verbosity</em></strong>.
</p>
        <p>
Sayed Ibrahim Hashimi - <a href="http://twitter.com/sayedihashimi">@sayedihashimi</a></p>
      </body>
      <title>Web Deploy: How to see the command executed in Visual Studio during publish</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,269ec8d3-9d71-400a-bd99-cc3ea5d0c834.aspx</guid>
      <link>http://sedodream.com/2010/11/04/WebDeployHowToSeeTheCommandExecutedInVisualStudioDuringPublish.aspx</link>
      <pubDate>Thu, 04 Nov 2010 04:03:26 GMT</pubDate>
      <description>&lt;p&gt;
I just saw a post on &lt;a href="http://twitter.com/#!/troyahunt/status/29612666076"&gt;twitter&lt;/a&gt; asking
the question
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;&lt;em&gt;Is there any easy way to see the underlying MSBuild command when building
in VS2010? Want to see the MSDeploy params. @&lt;/em&gt;&lt;/strong&gt;&lt;a href="http://twitter.com/wdeploy"&gt;&lt;em&gt;wdeploy&lt;/em&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt;?&lt;/em&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This is actually pretty easy, but wouldn’t fit into 140 characters, so I decided to
blog it. 
&lt;/p&gt;
&lt;p&gt;
One thing to know is that when you publish from Visual Studio, by default we use the
MSDeploy (AKA Web Deployment Tool) Object Model in order to perform the deployment.
We do this for performance and other reasons. Because of this there is no real msdeploy.exe
command that is being issued. You can however change that behavior. This is controlled
by an MSBuild property &lt;strong&gt;UseMSDeployExe&lt;/strong&gt; which is false by default.
In this case since &lt;a href="http://twitter.com/troyahunt"&gt;Troy&lt;/a&gt; wants to see the
command we will need to set that property to false. There are 2 ways in which you
can do this. You can set it in the project file itself, or you can define it in a
.wpp.targets file. I would recommend the second approach. What you need to do is to
create a file with the name {ProjectName}.wpp.targets in the same directory as the
project where {ProjectName} is the name of the Web Application Project (WAP). When
you do this, during a build or publish the file is automatically imported into the
build process. In my example I have a WAP named WebApplication1.csproj, so I created
the file WebApplication1.wpp.targets and its contents are shown below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; DefaultTargets=&amp;quot;Build&amp;quot; 
         xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;UseMsdeployExe&amp;gt;true&amp;lt;/UseMsdeployExe&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
In the snippet above you can see that I defined the property to true. Now there is
one more thing to do, publish the project. Once you publish the project, in the output
window you will see the MSDeploy command which is being used. In my case I published
the project to &lt;strong&gt;&lt;em&gt;localhost&lt;/em&gt;&lt;/strong&gt; to the &lt;strong&gt;&lt;em&gt;Default Web
Site/Test01&lt;/em&gt;&lt;/strong&gt; application path. You may have to copy the text from the
output window into Notepad and search for msdeploy.exe. The command that was issued
in my case is shown below (&lt;em&gt;with formatting changes for readability&lt;/em&gt;).
&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;&amp;quot;C:\Program Files (x86)\IIS\Microsoft Web Deploy\msdeploy.exe&amp;quot; 
-source:manifest='C:\temp\_NET\ThrowAway\WebApplication3\WebApplication1\obj\Debug\Package\WebApplication1.SourceManifest.xml' 
-dest:auto,IncludeAcls='False',AuthType='NTLM' 
-verb:sync 
-enableRule:DoNotDeleteRule 
-disableLink:AppPoolExtension 
-disableLink:ContentExtension 
-disableLink:CertificateExtension 
-setParam:kind='ProviderPath',
    scope='IisApp',match='^C:\\temp\\_NET\\ThrowAway\\WebApplication3\\WebApplication1\\obj\\Debug\\Package\\PackageTmp$',
    value='Default Web Site/Test01' 
-setParam:kind='ProviderPath',
    scope='setAcl',
    match='^C:\\temp\\_NET\\ThrowAway\\WebApplication3\\WebApplication1\\obj\\Debug\\Package\\PackageTmp$',
    value='Default Web Site/Test01' 
-retryAttempts=2 &lt;/pre&gt;
&lt;p&gt;
So that’s it, pretty simple.
&lt;/p&gt;
&lt;p&gt;
FYI, if you want more detail you can increase the MSBuild Output Window verbosity
by going to Tools-&amp;gt;Options-&amp;gt;Projects and Solutions-&amp;gt;Build and Run then specifying
a different value for &lt;strong&gt;&lt;em&gt;MSBuild project build output verbosity&lt;/em&gt;&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi - &lt;a href="http://twitter.com/sayedihashimi"&gt;@sayedihashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,269ec8d3-9d71-400a-bd99-cc3ea5d0c834.aspx</comments>
      <category>MSBuild</category>
      <category>MSDeploy</category>
      <category>Web Deployment Tool</category>
      <category>Web Development</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=78d0da23-9964-4d5e-b4a7-5930741bab93</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,78d0da23-9964-4d5e-b4a7-5930741bab93.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,78d0da23-9964-4d5e-b4a7-5930741bab93.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=78d0da23-9964-4d5e-b4a7-5930741bab93</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <title>MSBuild: Extending the solution build</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,78d0da23-9964-4d5e-b4a7-5930741bab93.aspx</guid>
      <link>http://sedodream.com/2010/10/22/MSBuildExtendingTheSolutionBuild.aspx</link>
      <pubDate>Fri, 22 Oct 2010 06:14:22 GMT</pubDate>
      <description>&lt;p&gt;
One of the most commonly asked questions that I get is “How can I extend the build
process for my &lt;strong&gt;&lt;u&gt;solution&lt;/u&gt;&lt;/strong&gt;?” In fact I was asked this soo much
that 4 years ago (&lt;em&gt;wow I’ve been dealing with MSBuild for far too long:)&lt;/em&gt; )
I wrote a blog post on &lt;a href="http://sedodream.com/2006/01/17/UseMSBuildToBuildSolutionFiles.aspx"&gt;Use
MSBuild to build Solution files&lt;/a&gt; (&lt;em&gt;no longer recommended technique&lt;/em&gt;) and
that post to this day is one of the most frequently visited ones. Well in the 4+ years
that have passed I’m glad to say that things have changed. The problem is that almost
no one knows about it. Hopefully this blog post will be the start to that changing.
&lt;/p&gt;
&lt;h3&gt;What’s under the covers
&lt;/h3&gt;
&lt;p&gt;
In all versions of Visual Studio, the solution file &lt;strong&gt;is not an MSBuild file&lt;/strong&gt;.
Which sucks for many of us. Essentially the solution build was like a black box.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuildExtendingthesolutionbuild_11AA1/Blackbox_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Blackbox" border="0" alt="Blackbox" src="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuildExtendingthesolutionbuild_11AA1/Blackbox_thumb.jpg" width="244" height="244" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Even in VS2010 it still kinda is, but &lt;strong&gt;&lt;u&gt;there is a hook for us to extend
it built in&lt;/u&gt;&lt;/strong&gt;. Let me explain what happens when you build a solution using
msbuild.exe. When you build a solution using msbuild.exe the solution file is converted
to an MSBuild file in memory then that MSBuild file is used to build the solution
itself. When you build from the command line here is the rough outline of the MSBuild
project that gets built.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;Project toolsversion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" defaulttargets="Build" initialtargets="ValidateSolutionConfiguration;ValidateToolsVersions;ValidateProjects"&gt;
&lt;Import project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportBefore\*" condition="'$(ImportByWildcardBeforeSolution)' != 'false' and exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportBefore')" /&gt;
&lt;Import project="$(MSBuildProjectDirectory)\before.ExtendSolutionBuild.sln.targets" condition="exists('before.ExtendSolutionBuild.sln.targets')" /&gt;
&lt;!-- Properties/Items/Targets here --&gt;
&lt;Import project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportAfter\*" condition="'$(ImportByWildcardBeforeSolution)' != 'false' and exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportAfter')" /&gt;
&lt;Import project="$(MSBuildProjectDirectory)\after.ExtendSolutionBuild.sln.targets" condition="exists('after.ExtendSolutionBuild.sln.targets')" /&gt;
&lt;/Project&gt;
&lt;/pre&gt;
&lt;p&gt;
OK here I have left out the targets and properties because they are irrelevant to
this discussion. Take a look at these import statements. There are two pairs of import
statements ones that are imported before the build is defined and the imports which
are after the build definition. Instead of looking at the first import statement lets
look at the second one, because I think its more compelling and its easier to demo.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;
&lt;Import project="$(MSBuildProjectDirectory)\before.ExtendSolutionBuild.sln.targets" condition="exists('before.ExtendSolutionBuild.sln.targets')" /&gt;
&lt;/pre&gt;
&lt;p&gt;
This statement is pretty simple, if a file with the name of before.ExtendSolutionBuild.sln.targets
exists in the same directory as the ExtendSolutionBuild.sln file then it will be imported
in at the top of the build file. Also there is a corresponding entry for after.ExtendSolutionBuild.sln.targets.
In stead of getting into all the nitty gritty of why two exists let me just boil it
down. You should place properties/items inside of the before targets file, and inside
of the after .targets file you should place targets but its OK to put properties/items
here as well. The most important thing to keep a note of is that you cannot place
anything inside of the before file which relies on any properties/items defined in
the build because they will not be available. Because of this most times you will
just need an after targets file. So in my case I will create a file named after.ExtendSolutionBuild.sln.targets,
this follows the pattern after.{SolutionFile}.sln.targets where {SolutionFile} is
the name of the solution file mine happens to be ExtendSolutionBuild. Every solution
has 4 targets that will be defined.
&lt;/p&gt;
&lt;h4&gt;4 Targets on Every Solution file
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
Build 
&lt;/li&gt;
&lt;li&gt;
Rebuild 
&lt;/li&gt;
&lt;li&gt;
Clean 
&lt;/li&gt;
&lt;li&gt;
Publish 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
So let’s say that I want to extend the build file and inject two targets; GenerateCode
and RunCodeAnalysis. Obviously I want the GenerateCode target to run before anything
is built and the RunCodeAnalysis to be run after everything is built. So in my after.ExtendSolutionBuild.sln.targets
file I place the following content.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;Project toolsversion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
&lt;Target name="GenerateCode" beforetargets="Build"&gt;
&lt;Message text="GenerateCode target running" importance="high" /&gt;
&lt;/Target&gt;
&lt;Target name="RunCodeAnalysis" aftertargets="Build"&gt;
&lt;Message text="GenerateCode target running" importance="high" /&gt;
&lt;/Target&gt;
&lt;/Project&gt;
&lt;/pre&gt;
&lt;p&gt;
You can see here that I am using BeforeTargets=”Build” to make sure that the GenerateCode
target is run before the Bulid target and also the RunCodeAnalysis target uses AfterTargets=”Build”.
So now let’s see what happens when I build my solution from the command line using
msbuild.exe.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuildExtendingthesolutionbuild_11AA1/ExtendSolution01_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ExtendSolution01" border="0" alt="ExtendSolution01" src="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuildExtendingthesolutionbuild_11AA1/ExtendSolution01_thumb.png" width="794" height="651" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
From the figure above you can see that the GenerateCode target was executed before
the build process started and then the RunCodeAnalysis target was executed after the
build. With MSBuild 3.5 and earlier this was simply not possible, and you would have
had to write another build file to do these kinds of things for you. If you are building
solution files from the command then you might be interested in the technique. I would
be interested to hear you feedback and to see how you guys would use this feature.
&lt;/p&gt;
&lt;h5&gt;ImportBefore/ImportAfter
&lt;/h5&gt;
&lt;p&gt;
Now let’s talk briefly about the two that we skipped. If you want an MSBuild file
to be imported for every solution that is build using msbuild.exe for a given machine
then you can place that file in one of the two folders below.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportBefore\ 
&lt;ul&gt;
&lt;li&gt;
%ProgramFiles32%\MSBuild\4.0\SolutionFile\ImportBefore\ 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportAfter\ 
&lt;ul&gt;
&lt;li&gt;
%ProgramFiles32%\MSBuild\4.0\SolutionFile\ImportAfter\ 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
So if you place any file in either of those folders (which don’t exist by default)
then they will automatically be imported for &lt;strong&gt;every solution file which builds
on that machine using msbuild.exe&lt;/strong&gt;. Typically you do not run into many times
where you want to do this, but the times that you do then it is critical and really
hard to work around without something like this. This is useful if you have a build
machine and you want to perform a set of actions for every build.
&lt;/p&gt;
&lt;h5&gt;Resources
&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://sedotech.com/content/files/ExtendSolutionBuild.zip"&gt;ExtendSolutionBuild
sample&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://sedodream.com/2010/03/19/ReplacingSolutionFilesWithMSBuildFiles.aspx"&gt;Replacing
solution files with MSBuild Files&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://sedodream.com/2006/01/17/UseMSBuildToBuildSolutionFiles.aspx"&gt;Use
MSBuild to build Solution files&lt;/a&gt; (Old not recommended now) 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi | @SayedIHashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,78d0da23-9964-4d5e-b4a7-5930741bab93.aspx</comments>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
      <category>Visual Studio 2010</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=68b7e248-b9f5-4d07-bdfe-eb037bcf2cbb</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,68b7e248-b9f5-4d07-bdfe-eb037bcf2cbb.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,68b7e248-b9f5-4d07-bdfe-eb037bcf2cbb.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=68b7e248-b9f5-4d07-bdfe-eb037bcf2cbb</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <strong>
            <u>Warning: What you see below feels hacky to me, but if you find it useful
then use it</u>
          </strong>
        </p>
        <p>
I have heard a lot of questions and confusion regarding web.debug.config and web.release.config.
For example here is just <a href="http://stackoverflow.com/q/3922291/105999">one question
on StackOverflow</a>. The question states:
</p>
        <pre class="brush: plain;">Hello, I want to use the web.config transformation that works fine for publish also for debugging.

When i publish a web app, visual studio automatically transforms the web.config based on my </pre>
        <pre class="brush: plain;">current build configuration. How can i tell visual studio </pre>
        <pre class="brush: plain;">to do the same when i start debugging. On debug start it simply </pre>
        <pre class="brush: plain;">uses the default web.config without transformation.

Any idea?</pre>
        <p>
First let me explain, as I did to that question, the purpose of the files: web.config/web.debug.config/web.release.config. 
</p>
        <p>
          <strong>
            <u>web.config</u>
          </strong>
        </p>
        <p>
This is the config file which developers should use locally. Ideally you should get
this to be standardized. For instance you could use localhost for DB strings, and
what not. You should strive for this to work on dev machines without changes. 
</p>
        <p>
          <strong>
            <u>web.debug.config </u>
          </strong>
        </p>
        <p>
This is the transform that is applied when you publish your application to the development
staging environment. This would make changes to the web.config which are required
for the target environment.
</p>
        <p>
          <strong>
            <u>web.release.config</u>
          </strong>
        </p>
        <p>
This is the transform that is applied when you publish your application to the "production"
environment. Obviously you'll have to be careful with passwords depending on your
application/team.
</p>
        <p>
The problem with transforming the web.config that you are currently running is that
a transform can perform destructive actions to the web.config. For example it may
delete a attributes, delete elements, etc.
</p>
        <h4>Resolution
</h4>
        <p>
Ok, with that out the way not let’s see how we can enable what the question asker
wants to do. To recap, when he builds on a particular configuration he wants a specific
transform to be applied to web.config. So obviously you do not want to maintain a
web.config file, because it is going to be overwritten. So what we need to do is to
create a new file web.template.config, which is just a copy of web.config. Then just
delete web.config by using Windows Explorer (don’t delete using Visual Studio because
we do not want to delete it from the project). <em>Note: If you are using a source
control provider which is integrated into Visual Studio then you probably want to
delete web.config from source control.</em> Also with this we do not want to use web.debug.config
or web.release.config because these already have a well defined role in the Web Publishing
Pipeline so we do not want to disturb that. So instead we will create two new files,
in the same folder as the project and web.template.config, web.dev.debug.config and
web.dev.release.config. The ideas is that these will be the transforms applied when
you debug, or run, your application from Visual Studio. Now we need to hook into the
build/package/publish process to get this all wired up. With Web Application Projects
(WAP) there is an extensibility point that you can create a project file in the same
folder with the name {ProjectName}.wpp.targets where {ProjectName} is the name of
the project. If this file is on disk in the same folder as the WAP then it will automatically
be imported into the project file. So I have created this file. And I have placed
the following content:
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;

  &lt;!-- Make sure web.config will be there even for package/publish --&gt;
  &lt;Target Name="CopyWebTemplateConfig" BeforeTargets="Build"&gt;
    &lt;Copy SourceFiles="web.template.config"
          DestinationFiles="web.config"/&gt;
  &lt;/Target&gt;
  
  &lt;PropertyGroup&gt;
    &lt;PrepareForRunDependsOn&gt;
      $(PrepareForRunDependsOn);
      UpdateWebConfigBeforeRun;
    &lt;/PrepareForRunDependsOn&gt;
  &lt;/PropertyGroup&gt;

  &lt;!-- This target will run right before you run your app in Visual Studio --&gt;
  &lt;Target Name="UpdateWebConfigBeforeRun"&gt;
    &lt;Message Text="Configuration: $(Configuration): web.dev.$(Configuration).config"/&gt;
    &lt;TransformXml Source="web.template.config"
              Transform="web.dev.$(Configuration).config"
              Destination="web.config" /&gt;
  &lt;/Target&gt;

  &lt;!-- Exclude the config template files from the created package --&gt;
  &lt;Target Name="ExcludeCustomConfigTransformFiles" BeforeTargets="ExcludeFilesFromPackage"&gt;
    &lt;ItemGroup&gt;
      &lt;ExcludeFromPackageFiles Include="web.template.config;web.dev.*.config"/&gt;
    &lt;/ItemGroup&gt;
    &lt;Message Text="ExcludeFromPackageFiles: @(ExcludeFromPackageFiles)" Importance="high"/&gt;
  &lt;/Target&gt;
&lt;/Project&gt;</pre>
        <p>
Let me explain this a bit. I have created the CopyWebTemplateConfig target which will
always copy web.template.config to web.config on build, even if you are not debugging
your application in Visual Studio. This is needed because we still need to support
the package/publish process of Visual Studio. Then I extended the property PrepareForRunDependsOn
to include the UpdateWebConfigBeforeRun target. This property is used to identify
the list of targets which needs to be executed before any managed project is run from
Visual Studio. In this target I am using the TransformXml task to transform web.template.config,
using the correct web.dev.***.config file. After that your app starts up using the
correct web.config based on  your build configuration.
</p>
        <p>
After that I have another target ExcludeCustomConfigTransformsFiles, which I inject
into the package/publish process via the attribute <strong>BeforeTargets=”ExcludeFilesFromPackage”</strong>.
This is needed because we do not want these files to be included when the application
is packaged or published.
</p>
        <p>
So that is really all there is to it. To explain the package/publish process a bit
more for this scenario. When you package/publish web.debug.config or web.release.config,
depending on build configuration, will still be used. But ultimately the file that
it is transforming is web.template.config, so you may have to adjust depending on
what you have in that file. Questions/Comments?
</p>
        <p>
Sayed Ibrahim Hashimi - <a href="http://twitter.com/sayedihashimi">@sayedihashimi</a></p>
      </body>
      <title>ASP.NET Web Projects: web.debug.config &amp; web.release.config</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,68b7e248-b9f5-4d07-bdfe-eb037bcf2cbb.aspx</guid>
      <link>http://sedodream.com/2010/10/21/ASPNETWebProjectsWebdebugconfigWebreleaseconfig.aspx</link>
      <pubDate>Thu, 21 Oct 2010 06:13:26 GMT</pubDate>
      <description>&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Warning: What you see below feels hacky to me, but if you find it useful
then use it&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
I have heard a lot of questions and confusion regarding web.debug.config and web.release.config.
For example here is just &lt;a href="http://stackoverflow.com/q/3922291/105999"&gt;one question
on StackOverflow&lt;/a&gt;. The question states:
&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;Hello, I want to use the web.config transformation that works fine for publish also for debugging.

When i publish a web app, visual studio automatically transforms the web.config based on my &lt;/pre&gt;
&lt;pre class="brush: plain;"&gt;current build configuration. How can i tell visual studio &lt;/pre&gt;
&lt;pre class="brush: plain;"&gt;to do the same when i start debugging. On debug start it simply &lt;/pre&gt;
&lt;pre class="brush: plain;"&gt;uses the default web.config without transformation.

Any idea?&lt;/pre&gt;
&lt;p&gt;
First let me explain, as I did to that question, the purpose of the files: web.config/web.debug.config/web.release.config. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;web.config&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
This is the config file which developers should use locally. Ideally you should get
this to be standardized. For instance you could use localhost for DB strings, and
what not. You should strive for this to work on dev machines without changes. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;web.debug.config &lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
This is the transform that is applied when you publish your application to the development
staging environment. This would make changes to the web.config which are required
for the target environment.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;web.release.config&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
This is the transform that is applied when you publish your application to the &amp;quot;production&amp;quot;
environment. Obviously you'll have to be careful with passwords depending on your
application/team.
&lt;/p&gt;
&lt;p&gt;
The problem with transforming the web.config that you are currently running is that
a transform can perform destructive actions to the web.config. For example it may
delete a attributes, delete elements, etc.
&lt;/p&gt;
&lt;h4&gt;Resolution
&lt;/h4&gt;
&lt;p&gt;
Ok, with that out the way not let’s see how we can enable what the question asker
wants to do. To recap, when he builds on a particular configuration he wants a specific
transform to be applied to web.config. So obviously you do not want to maintain a
web.config file, because it is going to be overwritten. So what we need to do is to
create a new file web.template.config, which is just a copy of web.config. Then just
delete web.config by using Windows Explorer (don’t delete using Visual Studio because
we do not want to delete it from the project). &lt;em&gt;Note: If you are using a source
control provider which is integrated into Visual Studio then you probably want to
delete web.config from source control.&lt;/em&gt; Also with this we do not want to use web.debug.config
or web.release.config because these already have a well defined role in the Web Publishing
Pipeline so we do not want to disturb that. So instead we will create two new files,
in the same folder as the project and web.template.config, web.dev.debug.config and
web.dev.release.config. The ideas is that these will be the transforms applied when
you debug, or run, your application from Visual Studio. Now we need to hook into the
build/package/publish process to get this all wired up. With Web Application Projects
(WAP) there is an extensibility point that you can create a project file in the same
folder with the name {ProjectName}.wpp.targets where {ProjectName} is the name of
the project. If this file is on disk in the same folder as the WAP then it will automatically
be imported into the project file. So I have created this file. And I have placed
the following content:
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;

  &amp;lt;!-- Make sure web.config will be there even for package/publish --&amp;gt;
  &amp;lt;Target Name=&amp;quot;CopyWebTemplateConfig&amp;quot; BeforeTargets=&amp;quot;Build&amp;quot;&amp;gt;
    &amp;lt;Copy SourceFiles=&amp;quot;web.template.config&amp;quot;
          DestinationFiles=&amp;quot;web.config&amp;quot;/&amp;gt;
  &amp;lt;/Target&amp;gt;
  
  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;PrepareForRunDependsOn&amp;gt;
      $(PrepareForRunDependsOn);
      UpdateWebConfigBeforeRun;
    &amp;lt;/PrepareForRunDependsOn&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;

  &amp;lt;!-- This target will run right before you run your app in Visual Studio --&amp;gt;
  &amp;lt;Target Name=&amp;quot;UpdateWebConfigBeforeRun&amp;quot;&amp;gt;
    &amp;lt;Message Text=&amp;quot;Configuration: $(Configuration): web.dev.$(Configuration).config&amp;quot;/&amp;gt;
    &amp;lt;TransformXml Source=&amp;quot;web.template.config&amp;quot;
              Transform=&amp;quot;web.dev.$(Configuration).config&amp;quot;
              Destination=&amp;quot;web.config&amp;quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;

  &amp;lt;!-- Exclude the config template files from the created package --&amp;gt;
  &amp;lt;Target Name=&amp;quot;ExcludeCustomConfigTransformFiles&amp;quot; BeforeTargets=&amp;quot;ExcludeFilesFromPackage&amp;quot;&amp;gt;
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;ExcludeFromPackageFiles Include=&amp;quot;web.template.config;web.dev.*.config&amp;quot;/&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;
    &amp;lt;Message Text=&amp;quot;ExcludeFromPackageFiles: @(ExcludeFromPackageFiles)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt;
  &amp;lt;/Target&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Let me explain this a bit. I have created the CopyWebTemplateConfig target which will
always copy web.template.config to web.config on build, even if you are not debugging
your application in Visual Studio. This is needed because we still need to support
the package/publish process of Visual Studio. Then I extended the property PrepareForRunDependsOn
to include the UpdateWebConfigBeforeRun target. This property is used to identify
the list of targets which needs to be executed before any managed project is run from
Visual Studio. In this target I am using the TransformXml task to transform web.template.config,
using the correct web.dev.***.config file. After that your app starts up using the
correct web.config based on&amp;#160; your build configuration.
&lt;/p&gt;
&lt;p&gt;
After that I have another target ExcludeCustomConfigTransformsFiles, which I inject
into the package/publish process via the attribute &lt;strong&gt;BeforeTargets=”ExcludeFilesFromPackage”&lt;/strong&gt;.
This is needed because we do not want these files to be included when the application
is packaged or published.
&lt;/p&gt;
&lt;p&gt;
So that is really all there is to it. To explain the package/publish process a bit
more for this scenario. When you package/publish web.debug.config or web.release.config,
depending on build configuration, will still be used. But ultimately the file that
it is transforming is web.template.config, so you may have to adjust depending on
what you have in that file. Questions/Comments?
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi - &lt;a href="http://twitter.com/sayedihashimi"&gt;@sayedihashimi&lt;/a&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,68b7e248-b9f5-4d07-bdfe-eb037bcf2cbb.aspx</comments>
      <category>MSBuild</category>
      <category>MSDeploy</category>
      <category>Web Publishing Pipeline</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=8ddcb76a-a58a-4b43-a93b-2e52b84e4358</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,8ddcb76a-a58a-4b43-a93b-2e52b84e4358.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,8ddcb76a-a58a-4b43-a93b-2e52b84e4358.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=8ddcb76a-a58a-4b43-a93b-2e52b84e4358</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>MSBuild: Filter list take 2</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,8ddcb76a-a58a-4b43-a93b-2e52b84e4358.aspx</guid>
      <link>http://sedodream.com/2010/10/21/MSBuildFilterListTake2.aspx</link>
      <pubDate>Thu, 21 Oct 2010 06:11:11 GMT</pubDate>
      <description>&lt;p&gt;
Last night I saw this &lt;a href="http://twitter.com/#!/HowardvRooijen/status/27946259453"&gt;tweet&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
@&lt;a href="http://twitter.com/MikeFourie"&gt;MikeFourie&lt;/a&gt; MSBuild Q: given I have @(ProjectOutputs)
how can I get a collection of all *.Unit.dll files?
&lt;/p&gt;
&lt;p&gt;
About a year ago I blogged about &lt;a href="http://sedodream.com/2010/01/22/MSBuild40InlineTasksPart2.aspx"&gt;inline
tasks including a FilterList task&lt;/a&gt;. So for his case the FilterList would work,
but then I was thinking that he should be able to do this with some of the goodness
that was released wtih MSBuild 4.0. Specifically with Property Function and Item Functions.
So I thought about it and whipped up a quick example.
&lt;/p&gt;
&lt;p&gt;
Take a look at the file below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;
&lt;Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" toolsversion="4.0"&gt;
&lt;ItemGroup&gt;
&lt;TargetOutputs include="test.dll;test.unit.dll;a.b.unit.dll" /&gt;
&lt;TargetOutputs include="c.dll;d.exe;a.bdd.unit.dll;end.dll" /&gt;
&lt;/ItemGroup&gt;
&lt;Target name="Demo"&gt;
&lt;Message text="TargetOutputs: @(TargetOutputs)" /&gt;
&lt;ItemGroup&gt;
&lt;UnitTestAssemblies include="%(TargetOutputs.Identity)" condition="'@(TargetOutputs-&gt;Contains(&amp;quot;unit&amp;quot;))'=='True' " /&gt;
&lt;/ItemGroup&gt;
&lt;Message text="UnitTestAssemblies: @(UnitTestAssemblies)" /&gt;
&lt;/Target&gt;
&lt;/Project&gt;
&lt;/pre&gt;
&lt;p&gt;
In this file I have created a dummy item named TargetOutputs and populated it with
a bunch of fake assembly names. Then inside the Demo target, I print out the items
in that list and construct another item list, UnitTestAssemblies. In this declaration
I am including %(TargetOutputs.Identity) with the condition '@(TargetOutputs-&gt;Contains(&amp;quot;unit&amp;quot;))'=='True'.
Let me break this down for you a bit. With Item Functions there is a specific set
of functions that you can call like DirectoryName/Metadata/Distinct/etc &lt;em&gt;(see below
for the reference link for full list)&lt;/em&gt;, but you can also execute any string instance
method. What you need to understand is that it will execute the method for all items
in the list then return a new list with the invocation result. Essentially these are
a new form of Item Transformations. I didn’t want to handle these in bulk, I need
to apply the filter to each individual item value. In order to do that I use the &lt;strong&gt;%(TargetOutputs.Identity)&lt;/strong&gt; which
kicks batching in. Since I can see that the values in the include value are unique
I know that the Identity metadata is unique. So what that means is When I do something
like 
&lt;Message text=”Name: %TargetOutputs.Identity” /&gt;
the message task will be invoked once per item value in TargetOutputs. The same goes
for the item declaration. So in the UnitTestAssemblies item group declaration I can
use a condition of &lt;strong&gt;Condition='@(TargetOutputs-&gt;Contains(&amp;quot;unit&amp;quot;))'=='True'&lt;/strong&gt; ,
because we are know that @(TargetOutputs) will only have 1 value per invocation. With
that condition I only added files that have unit in the name. When you execute the
Demo target the result is shown below.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/Filterlisttake2_11CD8/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/Filterlisttake2_11CD8/image_thumb_1.png" width="791" height="168" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Pretty cool huh? The best part, I managed to fit my reply in 140 characters in this &lt;a href="http://twitter.com/#!/sayedihashimi/status/28368533454"&gt;tweet&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
@&lt;a href="http://twitter.com/HowardvRooijen"&gt;HowardvRooijen&lt;/a&gt; 
&lt;UnitFiles include="%(TargetOutputs.Identity)" condition="'@(TargetOutputs-&gt;Contains("unit"))'=='True' " /&gt;
&lt;/p&gt;
&lt;p&gt;
Anywayz, if you are not following me on twitter you can find me at &lt;a href="http://twitter.com/sayedihashimi"&gt;@sayedihashimi&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Resources
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://sedodream.com/2010/03/07/MSBuild40PropertyFunctionsPart1.aspx"&gt;Property
Functions Part 1&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/dd633440.aspx"&gt;Property Functions
reference&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://sedotech.com/Resources#Batching"&gt;MSBuild Batching Resources&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/ee886422.aspx"&gt;Item Functions Reference&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/ms171476.aspx"&gt;MSBuild Item Transformations&lt;/a&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,8ddcb76a-a58a-4b43-a93b-2e52b84e4358.aspx</comments>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=e68c5a1b-1078-46fd-99d1-206422378c37</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,e68c5a1b-1078-46fd-99d1-206422378c37.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,e68c5a1b-1078-46fd-99d1-206422378c37.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=e68c5a1b-1078-46fd-99d1-206422378c37</wfw:commentRss>
      <title>MSBuild: You’ve heard of incremental building but have you heard of partial building?</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,e68c5a1b-1078-46fd-99d1-206422378c37.aspx</guid>
      <link>http://sedodream.com/2010/09/23/MSBuildYouveHeardOfIncrementalBuildingButHaveYouHeardOfPartialBuilding.aspx</link>
      <pubDate>Thu, 23 Sep 2010 06:05:59 GMT</pubDate>
      <description>&lt;p&gt;
MSBuild supports a concept known as &lt;a href="http://msdn.microsoft.com/en-us/magazine/dd483291.aspx#id0100003"&gt;Incremental
Building&lt;/a&gt; which you may already be familiar with but I will cover it here briefly
but that is not the focus of this post. Incremental building is the concept that you
should only build what is out of date. To support this MSBuild has the attributes,
inputs and outputs on the &lt;a href="http://msdn.microsoft.com/en-us/library/t50z2hka.aspx"&gt;Target
element&lt;/a&gt;. With these attributes you can specify the files that go into a target
(via inputs attribute), and the files that you are expecting to come out of a target
(via outputs attribute). Once you do this MSBuild will compare the timestamp of the
inputs to the outputs and if all outputs are up-to-date (i.e. the inputs are older)
then the target will be skipped. Take a look at the very simple project file below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;
&lt;Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
&lt;ItemGroup&gt;
&lt;Files include="src\01.txt;src\02.txt;src\03.txt;src\04.txt;src\05.txt;" /&gt;
&lt;/ItemGroup&gt;
&lt;PropertyGroup&gt;
&lt;Dest&gt;
dest\
&lt;/Dest&gt;
&lt;/PropertyGroup&gt;
&lt;Target name="CopyFiles" inputs="@(Files)" outputs="@(Files-&gt;'$(Dest)%(Filename)%(Extension)')"&gt;
&lt;Message text="CopyFiles" /&gt;
&lt;Copy sourcefiles="@(Files)" destinationfiles="@(Files-&gt;'$(Dest)%(Filename)%(Extension)')" /&gt;
&lt;/Target&gt;
&lt;Target name="DeleteTwoFiles"&gt;
&lt;Message text="DeleteTwoFiles" /&gt;
&lt;Delete files="$(dest)01.txt;$(dest)02.txt" /&gt;
&lt;/Target&gt;
&lt;/Project&gt;
&lt;/pre&gt;
&lt;p&gt;
In this project file we have two targets; CopyFiles and DeleteTwoFiles. Ignore DeleteTwoFiles
for now. Also take a note that the directory where I’m executing this build has a
folder, src, with the files listed in the Files item. On the CopyFiles target I have
specified the inputs and outputs. The inputs is just @(Files), this are the files
that the target is acting upon. The outputs contains the expression @(Files-&gt;'$(Dest)%(Filename)%(Extension)').
Which is the same expression from the Copy statement. If the Dest folder is empty
and I execute the CopyFiles target the result is shown below.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuildYouveheardofincrementalbuildingbu_13256/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuildYouveheardofincrementalbuildingbu_13256/image_thumb.png" width="795" height="311" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
So just as expected the files were copied over, so its all good. Now what happens
if I execute it again? The output is shown below.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuildYouveheardofincrementalbuildingbu_13256/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuildYouveheardofincrementalbuildingbu_13256/image_thumb_1.png" width="796" height="194" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
So as you can see the target was skipped, the message statement “CopyFiles” was not
executed nor was the copy as a result. So this, in a nutshell, is incremental building.
&lt;/p&gt;
&lt;p&gt;
Now, with the dest folder containing all files, what do you think would happen I execute
the command msbuild.exe PartialBuilding01.proj /t:DeleteTwoFiles;CopyFiles? This command
will first delete two files from the output directory and then call the CopyFiles
target again. Let’s see the result below.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuildYouveheardofincrementalbuildingbu_13256/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuildYouveheardofincrementalbuildingbu_13256/image_thumb_2.png" width="796" height="320" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
When the CopyFiles target was executed you see that statement “Building target ‘CopyFiles’ &lt;strong&gt;&lt;u&gt;partially&lt;/u&gt;&lt;/strong&gt;,
…”. When the time came to execute the target MSBuild examined the inputs and outputs,
it determined that the files 01.txt &amp; 02.txt were out of date (because they didn’t
exist in the target) but 03.txt, 04.txt and 05.txt were up to date. So MSBuild feed
the CopyFiles target a value for the Files item that only contained the 01.txt and
02.txt and let it do its thing. So if you are performing builds which are taking a
lot of time then incremental (and therefore partial) building is your friend!
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,e68c5a1b-1078-46fd-99d1-206422378c37.aspx</comments>
      <category>MSBuild</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=27dcfa0d-f88c-4dc3-ace1-0e0d7ef75c1f</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,27dcfa0d-f88c-4dc3-ace1-0e0d7ef75c1f.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,27dcfa0d-f88c-4dc3-ace1-0e0d7ef75c1f.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=27dcfa0d-f88c-4dc3-ace1-0e0d7ef75c1f</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last week on <a href="http://stackoverflow.com">StackOverflow</a> I answered a question, <a href="http://stackoverflow.com/q/3613714/105999">Make
web.config transformations working locally</a> and in a response to my answer the
question asker asked me if I would be able to a question he posed earlier <a href="http://stackoverflow.com/q/2915329/105999">Advanced
tasks using web.config transformation</a>. Evidently <a href="http://stackoverflow.com/users/80268/diego-c">he</a> is
really interested in config transformations! I don’t blame him, I’m really into them
as well.
</p>
        <p>
In his question he asks (summarizing) can we replace portions of attribute values
instead of this entire attribute? So for instance you have the following in your web.config.
Below is two sets of appSettings one from Dev and the other from Prod (taken from
the original question).
</p>
        <pre class="brush: xml;">&lt;!-- DEV ENTRY --&gt;
&lt;appSettings&gt;
 &lt;add key="serviceName1_WebsService_Url" value="http://wsServiceName1.dev.domain.com/v1.2.3.4/entryPoint.asmx" /&gt;
 &lt;add key="serviceName2_WebsService_Url" value="http://ma1-lab.lab1.domain.com/v1.2.3.4/entryPoint.asmx" /&gt;
&lt;/appSettings&gt;

&lt;!-- PROD ENTRY --&gt;
&lt;appSettings&gt;
 &lt;add key="serviceName1_WebsService_Url" value="http://wsServiceName1.prod.domain.com/v1.2.3.4/entryPoint.asmx" /&gt;
 &lt;add key="serviceName2_WebsService_Url" value="http://ws.ServiceName2.domain.com/v1.2.3.4/entryPoint.asmx" /&gt;
&lt;/appSettings&gt;</pre>
        <p>
In the above we just want to replace dev with prod and ma1-lab.lab1.domain with ws.ServiceName2.domain.
For those wondering currently we have the following transformations out of the box.
</p>
        <ul>
          <li>
Replace – Replaces the entire element</li>
          <li>
Remove – Removes the entire element</li>
          <li>
RemoveAll – Removes all matching elements</li>
          <li>
Insert – Inserts an element</li>
          <li>
SetAttributes – Sets the value of the specified attributes</li>
          <li>
RemoveAttributes – Removes attributes</li>
          <li>
InsertAfter – Inserts an element after another</li>
          <li>
InsertBefore – Inserts an element before another</li>
        </ul>
        <p>
At the end of this article I’ve linked to another blog which has more info about these
transformations. So it sounds like SetAttributes is <strong>almost</strong> what we
want, but not quite what there. A little known fact is that you can create your own
config transformations and use those. In fact all of the out of the box transformations
follow the same patterns that custom transformations would. To solve this issue we
need to create our own config transformation, AttributeRegexReplace. This transformation
will take an attribute value and do a <a href="http://en.wikipedia.org/wiki/Regular_expression">regular
expression</a> replace on its value. In order to create a new transformation you first
reference the Microsoft.Web.Publishing.Tasks.dll which can be found in the <strong>%Program
Files (x86)%MSBuild\Microsoft\VisualStudio\v10.0\Web</strong> folder. If you are working
with a team it is best if you copy that assembly, place it in a shared folder in source
control, and make the reference from that location. After you create the reference
to that assembly you will need to create a class which extends the Transform class.
The class diagram for this abstract class is shown below.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/WindowsLiveWriter/ExtendingXMLw.configConfigtransformation_12D90/image_2.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/ExtendingXMLw.configConfigtransformation_12D90/image_thumb.png" width="455" border="0" height="394" />
          </a>
        </p>
        <p>
The only thing that you will need to implement is the Apply method. You don’t even
need to fully understand all of the properties and methods just the portions that
you are interested in. Here we will not cover all the details of this class, or other
related classes which exist, but there will be future posts which will shed more light
on this area.
</p>
        <p>
In the sample class library that I created, I called the project CustomTransformType.
Inside of that project I created the class AttributeRegexReplace. The entire contents
of that class are shown below, we will go over the details after that.
</p>
        <pre class="brush: csharp;">namespace CustomTransformType
{
    using System;
    using System.Text.RegularExpressions;
    using System.Xml;
    using Microsoft.Web.Publishing.Tasks;

    public class AttributeRegexReplace : Transform
    {
        private string pattern;
        private string replacement;
        private string attributeName;

        protected string AttributeName
        {
            get
            {
                if (this.attributeName == null)
                {
                    this.attributeName = this.GetArgumentValue("Attribute");
                }
                return this.attributeName;
            }
        }
        protected string Pattern
        {
            get
            {
                if (this.pattern == null)
                {
                    this.pattern = this.GetArgumentValue("Pattern");
                }

                return pattern;
            }
        }

        protected string Replacement
        {
            get
            {
                if (this.replacement == null)
                {
                    this.replacement = this.GetArgumentValue("Replacement");
                }

                return replacement;
            }
        }

        protected string GetArgumentValue(string name)
        {
            // this extracts a value from the arguments provided
            if (string.IsNullOrWhiteSpace(name)) 
            { throw new ArgumentNullException("name"); }

            string result = null;
            if (this.Arguments != null &amp;&amp; this.Arguments.Count &gt; 0)
            {
                foreach (string arg in this.Arguments)
                {
                    if (!string.IsNullOrWhiteSpace(arg))
                    {
                        string trimmedArg = arg.Trim();
                        if (trimmedArg.ToUpperInvariant().StartsWith(name.ToUpperInvariant()))
                        {
                            int start = arg.IndexOf('\'');
                            int last = arg.LastIndexOf('\'');
                            if (start &lt;= 0 || last &lt;= 0 || last &lt;= 0)
                            {
                                throw new ArgumentException("Expected two ['] characters");
                            }

                            string value = trimmedArg.Substring(start, last - start);
                            if (value != null)
                            {
                                // remove any leading or trailing '
                                value = value.Trim().TrimStart('\'').TrimStart('\'');
                            }
                            result = value;
                        }
                    }
                }
            }
            return result;
        }

        protected override void Apply()
        {
            foreach (XmlAttribute att in this.TargetNode.Attributes)
            {
                if (string.Compare(att.Name, this.AttributeName, StringComparison.InvariantCultureIgnoreCase) == 0)
                {
                    // get current value, perform the Regex
                    att.Value = Regex.Replace(att.Value, this.Pattern, this.Replacement);
                }
            }
        }
    }
}</pre>
        <p>
In this class we have 3 properties; Pattern, Replacement, and AttributeName. All of
these values will be provided via an argument in the config transformation. For example
take a look at the element below which contains a transform attribute may look like
the following.
</p>
        <pre class="brush: csharp;">&lt;add key="two" value="two-replaced" 
         xdt:Transform="AttributeRegexReplace(Attribute='value', Pattern='here',Replacement='REPLACED')" 
         xdt:Locator="Match(key)"/&gt;</pre>
        <p>
In this example I declare that I am using AttributeRegexReplace and then specify the
values for the attributes within the <strong>()</strong>. In the class above I have
a method, GetArgumentValue, which is used to parse values from that argument string.
When your transform is invoked the string inside of () is passed in as the ArgumentString
value. If you are using a <strong>,</strong> as the argument separator, as I am, then
you can use the Arguments list. Which will split up the arguments by the <strong>,</strong> character.
Surprisingly in the 101 lines of code in the sample there are only a few interesting
lines. Those are what’s contained inside the Apply method. Inside that method I search
the TargetNode’s attributes (<em>TargetNode is the node which was matched in the xml
file being transformed</em>) for an attribute with the same name as the one specified
in the AttributeName property. Once I find it I just make a call to <a href="http://msdn.microsoft.com/en-us/library/e7f5w83z.aspx">Regex.Replace</a> to
get the new value, and assign it. Pretty simple! Now lets see how can we use this.
</p>
        <p>
Let’s say you have the following very simple web.config
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0"?&gt;
&lt;configuration&gt;
  &lt;appSettings&gt;
    &lt;add key="one" value="one"/&gt;
    &lt;add key="two" value="partial-replace-here-end"/&gt;
    &lt;add key="three" value="three here"/&gt;
  &lt;/appSettings&gt;
&lt;/configuration&gt;</pre>
        <p>
If we want to be able to use our own transform then we will have to use the xdt:Import
element. You can place that element inside the xml document anywhere immediately under
the root element. This element will allow us to utilize our own transform class. It
only has 3 possible attributes.
</p>
        <ul>
          <li>
namespace – This is the namespace which the transform is contained in 
</li>
          <li>
path – This is the full path to the assembly</li>
          <li>
assembly – This is the assembly name which contains the transform</li>
        </ul>
        <p>
You can only use one of the two; path and assembly. Basically it boils down to how
the assembly is loaded. If you use path the assembly will be loaded with <a href="http://msdn.microsoft.com/en-us/library/system.reflection.assembly.loadfrom.aspx">Assembly.LoadFrom</a> and
if you chose to use assembly passing in the <a href="http://msdn.microsoft.com/en-us/library/system.reflection.assemblyname.aspx">AssemblyName</a>,
for instance if the assembly in in the GAC, then it will be loaded using <a href="http://msdn.microsoft.com/en-us/library/system.reflection.assembly.load.aspx">Assembly.Load</a>.
</p>
        <p>
I chose to use path, because I just placed the file inside of the MSBuild Extensions
directory (<strong>%Program Files (x86)%MSBuild</strong>) in a folder named Custom.
Then I created my config transform file to be the following.
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0"?&gt;

&lt;configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"&gt;
                        
  &lt;xdt:Import path="C:\Program Files (x86)\MSBuild\Custom\CustomTransformType.dll"
              namespace="CustomTransformType" /&gt;

  &lt;appSettings&gt;
    &lt;add key="one" value="one-replaced" xdt:Transform="Replace" xdt:Locator="Match(key)" /&gt;
    &lt;add key="two" value="two-replaced" xdt:Transform="AttributeRegexReplace(Attribute='value', Pattern='here',Replacement='REPLACED')" xdt:Locator="Match(key)"/&gt;
  &lt;/appSettings&gt;
&lt;/configuration&gt;</pre>
        <p>
Then to run this I created an MSBuild file, PerformTransform.proj, which is shown
below.
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project ToolsVersion="4.0" DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
  &lt;UsingTask TaskName="TransformXml"
           AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/&gt;

  &lt;PropertyGroup&gt;
    &lt;TransformDest&gt;web.tranzed.config&lt;/TransformDest&gt;
  &lt;/PropertyGroup&gt;
  
  &lt;Target Name="Demo"&gt;
    &lt;Delete Files="$(TransformDest)" /&gt;
    &lt;TransformXml Source="web.config"
                  Transform="web.dev.config"
                  Destination="$(TransformDest)" /&gt;                  
  &lt;/Target&gt;
  
&lt;/Project&gt;</pre>
        <p>
This file uses the TransformXml task as I outlined in a previous post <a href="http://sedodream.com/2010/04/26/ConfigTransformationsOutsideOfWebAppBuilds.aspx">Config
transformations outside of web app builds</a>. Once you execute the Demo target with
the command msbuild PerformTransform.proj /t:Demo you will see the file web.tranzed.config
with the following contents.
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0"?&gt;
&lt;configuration&gt;
  &lt;appSettings&gt;
    &lt;add key="one" value="one-replaced"/&gt;
    &lt;add key="two" value="partial-replace-REPLACED-end"/&gt;
    &lt;add key="three" value="three here"/&gt;
  &lt;/appSettings&gt;
&lt;/configuration&gt;</pre>
        <p>
So you can see that the replacement did occur as we intended. Below you will find
the download link for the samples as well as another blog entry for more info on the
out of the box transformations.
</p>
        <p>
          <strong>Resources</strong>
        </p>
        <ul>
          <li>
Source download at: <a title="http://sedotech.com/Content/samples/CustomTransformType.zip" href="http://sedotech.com/Content/samples/CustomTransformType.zip">http://sedotech.com/Content/samples/CustomTransformType.zip</a></li>
          <li>
More info on out of box transforms at: <a title="http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html" href="http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html">http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html</a></li>
        </ul>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>Extending XML (web.config) Config transformation</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,27dcfa0d-f88c-4dc3-ace1-0e0d7ef75c1f.aspx</guid>
      <link>http://sedodream.com/2010/09/09/ExtendingXMLWebconfigConfigTransformation.aspx</link>
      <pubDate>Thu, 09 Sep 2010 05:51:43 GMT</pubDate>
      <description>&lt;p&gt;
Last week on &lt;a href="http://stackoverflow.com"&gt;StackOverflow&lt;/a&gt; I answered a question, &lt;a href="http://stackoverflow.com/q/3613714/105999"&gt;Make
web.config transformations working locally&lt;/a&gt; and in a response to my answer the
question asker asked me if I would be able to a question he posed earlier &lt;a href="http://stackoverflow.com/q/2915329/105999"&gt;Advanced
tasks using web.config transformation&lt;/a&gt;. Evidently &lt;a href="http://stackoverflow.com/users/80268/diego-c"&gt;he&lt;/a&gt; is
really interested in config transformations! I don’t blame him, I’m really into them
as well.
&lt;/p&gt;
&lt;p&gt;
In his question he asks (summarizing) can we replace portions of attribute values
instead of this entire attribute? So for instance you have the following in your web.config.
Below is two sets of appSettings one from Dev and the other from Prod (taken from
the original question).
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;!-- DEV ENTRY --&amp;gt;
&amp;lt;appSettings&amp;gt;
 &amp;lt;add key="serviceName1_WebsService_Url" value="http://wsServiceName1.dev.domain.com/v1.2.3.4/entryPoint.asmx" /&amp;gt;
 &amp;lt;add key="serviceName2_WebsService_Url" value="http://ma1-lab.lab1.domain.com/v1.2.3.4/entryPoint.asmx" /&amp;gt;
&amp;lt;/appSettings&amp;gt;

&amp;lt;!-- PROD ENTRY --&amp;gt;
&amp;lt;appSettings&amp;gt;
 &amp;lt;add key="serviceName1_WebsService_Url" value="http://wsServiceName1.prod.domain.com/v1.2.3.4/entryPoint.asmx" /&amp;gt;
 &amp;lt;add key="serviceName2_WebsService_Url" value="http://ws.ServiceName2.domain.com/v1.2.3.4/entryPoint.asmx" /&amp;gt;
&amp;lt;/appSettings&amp;gt;&lt;/pre&gt;
&lt;p&gt;
In the above we just want to replace dev with prod and ma1-lab.lab1.domain with ws.ServiceName2.domain.
For those wondering currently we have the following transformations out of the box.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Replace – Replaces the entire element&lt;/li&gt;
&lt;li&gt;
Remove – Removes the entire element&lt;/li&gt;
&lt;li&gt;
RemoveAll – Removes all matching elements&lt;/li&gt;
&lt;li&gt;
Insert – Inserts an element&lt;/li&gt;
&lt;li&gt;
SetAttributes – Sets the value of the specified attributes&lt;/li&gt;
&lt;li&gt;
RemoveAttributes – Removes attributes&lt;/li&gt;
&lt;li&gt;
InsertAfter – Inserts an element after another&lt;/li&gt;
&lt;li&gt;
InsertBefore – Inserts an element before another&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
At the end of this article I’ve linked to another blog which has more info about these
transformations. So it sounds like SetAttributes is &lt;strong&gt;almost&lt;/strong&gt; what we
want, but not quite what there. A little known fact is that you can create your own
config transformations and use those. In fact all of the out of the box transformations
follow the same patterns that custom transformations would. To solve this issue we
need to create our own config transformation, AttributeRegexReplace. This transformation
will take an attribute value and do a &lt;a href="http://en.wikipedia.org/wiki/Regular_expression"&gt;regular
expression&lt;/a&gt; replace on its value. In order to create a new transformation you first
reference the Microsoft.Web.Publishing.Tasks.dll which can be found in the &lt;strong&gt;%Program
Files (x86)%MSBuild\Microsoft\VisualStudio\v10.0\Web&lt;/strong&gt; folder. If you are working
with a team it is best if you copy that assembly, place it in a shared folder in source
control, and make the reference from that location. After you create the reference
to that assembly you will need to create a class which extends the Transform class.
The class diagram for this abstract class is shown below.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/ExtendingXMLw.configConfigtransformation_12D90/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/ExtendingXMLw.configConfigtransformation_12D90/image_thumb.png" width="455" border="0" height="394"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
The only thing that you will need to implement is the Apply method. You don’t even
need to fully understand all of the properties and methods just the portions that
you are interested in. Here we will not cover all the details of this class, or other
related classes which exist, but there will be future posts which will shed more light
on this area.
&lt;/p&gt;
&lt;p&gt;
In the sample class library that I created, I called the project CustomTransformType.
Inside of that project I created the class AttributeRegexReplace. The entire contents
of that class are shown below, we will go over the details after that.
&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;namespace CustomTransformType
{
    using System;
    using System.Text.RegularExpressions;
    using System.Xml;
    using Microsoft.Web.Publishing.Tasks;

    public class AttributeRegexReplace : Transform
    {
        private string pattern;
        private string replacement;
        private string attributeName;

        protected string AttributeName
        {
            get
            {
                if (this.attributeName == null)
                {
                    this.attributeName = this.GetArgumentValue("Attribute");
                }
                return this.attributeName;
            }
        }
        protected string Pattern
        {
            get
            {
                if (this.pattern == null)
                {
                    this.pattern = this.GetArgumentValue("Pattern");
                }

                return pattern;
            }
        }

        protected string Replacement
        {
            get
            {
                if (this.replacement == null)
                {
                    this.replacement = this.GetArgumentValue("Replacement");
                }

                return replacement;
            }
        }

        protected string GetArgumentValue(string name)
        {
            // this extracts a value from the arguments provided
            if (string.IsNullOrWhiteSpace(name)) 
            { throw new ArgumentNullException("name"); }

            string result = null;
            if (this.Arguments != null &amp;amp;&amp;amp; this.Arguments.Count &amp;gt; 0)
            {
                foreach (string arg in this.Arguments)
                {
                    if (!string.IsNullOrWhiteSpace(arg))
                    {
                        string trimmedArg = arg.Trim();
                        if (trimmedArg.ToUpperInvariant().StartsWith(name.ToUpperInvariant()))
                        {
                            int start = arg.IndexOf('\'');
                            int last = arg.LastIndexOf('\'');
                            if (start &amp;lt;= 0 || last &amp;lt;= 0 || last &amp;lt;= 0)
                            {
                                throw new ArgumentException("Expected two ['] characters");
                            }

                            string value = trimmedArg.Substring(start, last - start);
                            if (value != null)
                            {
                                // remove any leading or trailing '
                                value = value.Trim().TrimStart('\'').TrimStart('\'');
                            }
                            result = value;
                        }
                    }
                }
            }
            return result;
        }

        protected override void Apply()
        {
            foreach (XmlAttribute att in this.TargetNode.Attributes)
            {
                if (string.Compare(att.Name, this.AttributeName, StringComparison.InvariantCultureIgnoreCase) == 0)
                {
                    // get current value, perform the Regex
                    att.Value = Regex.Replace(att.Value, this.Pattern, this.Replacement);
                }
            }
        }
    }
}&lt;/pre&gt;
&lt;p&gt;
In this class we have 3 properties; Pattern, Replacement, and AttributeName. All of
these values will be provided via an argument in the config transformation. For example
take a look at the element below which contains a transform attribute may look like
the following.
&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;&amp;lt;add key="two" value="two-replaced" 
         xdt:Transform="AttributeRegexReplace(Attribute='value', Pattern='here',Replacement='REPLACED')" 
         xdt:Locator="Match(key)"/&amp;gt;&lt;/pre&gt;
&lt;p&gt;
In this example I declare that I am using AttributeRegexReplace and then specify the
values for the attributes within the &lt;strong&gt;()&lt;/strong&gt;. In the class above I have
a method, GetArgumentValue, which is used to parse values from that argument string.
When your transform is invoked the string inside of () is passed in as the ArgumentString
value. If you are using a &lt;strong&gt;,&lt;/strong&gt; as the argument separator, as I am, then
you can use the Arguments list. Which will split up the arguments by the &lt;strong&gt;,&lt;/strong&gt; character.
Surprisingly in the 101 lines of code in the sample there are only a few interesting
lines. Those are what’s contained inside the Apply method. Inside that method I search
the TargetNode’s attributes (&lt;em&gt;TargetNode is the node which was matched in the xml
file being transformed&lt;/em&gt;) for an attribute with the same name as the one specified
in the AttributeName property. Once I find it I just make a call to &lt;a href="http://msdn.microsoft.com/en-us/library/e7f5w83z.aspx"&gt;Regex.Replace&lt;/a&gt; to
get the new value, and assign it. Pretty simple! Now lets see how can we use this.
&lt;/p&gt;
&lt;p&gt;
Let’s say you have the following very simple web.config
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;configuration&amp;gt;
  &amp;lt;appSettings&amp;gt;
    &amp;lt;add key="one" value="one"/&amp;gt;
    &amp;lt;add key="two" value="partial-replace-here-end"/&amp;gt;
    &amp;lt;add key="three" value="three here"/&amp;gt;
  &amp;lt;/appSettings&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;
If we want to be able to use our own transform then we will have to use the xdt:Import
element. You can place that element inside the xml document anywhere immediately under
the root element. This element will allow us to utilize our own transform class. It
only has 3 possible attributes.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
namespace – This is the namespace which the transform is contained in 
&lt;/li&gt;
&lt;li&gt;
path – This is the full path to the assembly&lt;/li&gt;
&lt;li&gt;
assembly – This is the assembly name which contains the transform&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
You can only use one of the two; path and assembly. Basically it boils down to how
the assembly is loaded. If you use path the assembly will be loaded with &lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.assembly.loadfrom.aspx"&gt;Assembly.LoadFrom&lt;/a&gt; and
if you chose to use assembly passing in the &lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.assemblyname.aspx"&gt;AssemblyName&lt;/a&gt;,
for instance if the assembly in in the GAC, then it will be loaded using &lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.assembly.load.aspx"&gt;Assembly.Load&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I chose to use path, because I just placed the file inside of the MSBuild Extensions
directory (&lt;strong&gt;%Program Files (x86)%MSBuild&lt;/strong&gt;) in a folder named Custom.
Then I created my config transform file to be the following.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version="1.0"?&amp;gt;

&amp;lt;configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"&amp;gt;
                        
  &amp;lt;xdt:Import path="C:\Program Files (x86)\MSBuild\Custom\CustomTransformType.dll"
              namespace="CustomTransformType" /&amp;gt;

  &amp;lt;appSettings&amp;gt;
    &amp;lt;add key="one" value="one-replaced" xdt:Transform="Replace" xdt:Locator="Match(key)" /&amp;gt;
    &amp;lt;add key="two" value="two-replaced" xdt:Transform="AttributeRegexReplace(Attribute='value', Pattern='here',Replacement='REPLACED')" xdt:Locator="Match(key)"/&amp;gt;
  &amp;lt;/appSettings&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Then to run this I created an MSBuild file, PerformTransform.proj, which is shown
below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;Project ToolsVersion="4.0" DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&amp;gt;
  &amp;lt;UsingTask TaskName="TransformXml"
           AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/&amp;gt;

  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;TransformDest&amp;gt;web.tranzed.config&amp;lt;/TransformDest&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
  
  &amp;lt;Target Name="Demo"&amp;gt;
    &amp;lt;Delete Files="$(TransformDest)" /&amp;gt;
    &amp;lt;TransformXml Source="web.config"
                  Transform="web.dev.config"
                  Destination="$(TransformDest)" /&amp;gt;                  
  &amp;lt;/Target&amp;gt;
  
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
This file uses the TransformXml task as I outlined in a previous post &lt;a href="http://sedodream.com/2010/04/26/ConfigTransformationsOutsideOfWebAppBuilds.aspx"&gt;Config
transformations outside of web app builds&lt;/a&gt;. Once you execute the Demo target with
the command msbuild PerformTransform.proj /t:Demo you will see the file web.tranzed.config
with the following contents.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;configuration&amp;gt;
  &amp;lt;appSettings&amp;gt;
    &amp;lt;add key="one" value="one-replaced"/&amp;gt;
    &amp;lt;add key="two" value="partial-replace-REPLACED-end"/&amp;gt;
    &amp;lt;add key="three" value="three here"/&amp;gt;
  &amp;lt;/appSettings&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;
So you can see that the replacement did occur as we intended. Below you will find
the download link for the samples as well as another blog entry for more info on the
out of the box transformations.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Resources&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Source download at: &lt;a title="http://sedotech.com/Content/samples/CustomTransformType.zip" href="http://sedotech.com/Content/samples/CustomTransformType.zip"&gt;http://sedotech.com/Content/samples/CustomTransformType.zip&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
More info on out of box transforms at: &lt;a title="http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html" href="http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html"&gt;http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,27dcfa0d-f88c-4dc3-ace1-0e0d7ef75c1f.aspx</comments>
      <category>Config-Transformation</category>
      <category>MSBuild</category>
      <category>MSDeploy</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=c926b957-b578-4d98-bbce-2260945de5cf</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,c926b957-b578-4d98-bbce-2260945de5cf.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,c926b957-b578-4d98-bbce-2260945de5cf.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c926b957-b578-4d98-bbce-2260945de5cf</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A while back I posted an entry on <a href="http://sedodream.com/2010/05/01/WebDeploymentToolMSDeployBuildPackageIncludingExtraFilesOrExcludingSpecificFiles.aspx">How
to build a package including extra files or exclude files</a> a reader posted a question
to <a href="http://stackoverflow.com">StackOverflow.com</a> asking how to exclude
files from the created package based on the configuration for the project. He asked
me to take a look at it so I figured it would be a good blog post.
</p>
        <p>
From the previous <a href="http://sedodream.com/2010/05/01/WebDeploymentToolMSDeployBuildPackageIncludingExtraFilesOrExcludingSpecificFiles.aspx">post</a> we
can see that the way to exclude files from packaging is by declaring an item as follows.
</p>
        <pre class="brush: xml;">&lt;ItemGroup&gt;
  &lt;ExcludeFromPackageFiles Include="Sample.Debug.xml"&gt;
    &lt;FromTarget&gt;Project&lt;/FromTarget&gt;
  &lt;/ExcludeFromPackageFiles&gt;
&lt;/ItemGroup&gt;</pre>
        <p>
So we need to extend this to only exclude files if the config is a certain value.
Since MSBuild supports <a href="http://msdn.microsoft.com/en-us/library/7szfhaft.aspx">conditions
on almost every element</a> this is going to be a breeze. As an example I have created
a sample web project with a scripts directory that has the following files.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/WindowsLiveWriter/WebDeploymentToolMSDeployHowtoexcludefil_A290/image_4.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/WebDeploymentToolMSDeployHowtoexcludefil_A290/image_thumb_1.png" width="244" height="214" />
          </a>
        </p>
        <p>
In that folder there I there are two files which have ‘debug’ in the name of the file.
We only want those to be included if the configuration is set to <strong>Debug</strong>,
or another way of putting it is we want to exclude those files if the configuration
is not Debug. So we need to create to add files to the <strong>ExcludeFromPackageFiles</strong> and
guard it with the condition that the configuration is not debug. Here is that.
</p>
        <pre class="brush: xml;">&lt;Target Name="CustomExlucdeFiles" BeforeTargets="ExcludeFilesFromPackage"&gt;
  &lt;ItemGroup Condition=" '$(Configuration)'!='Debug' "&gt;
    &lt;ExcludeFromPackageFiles Include="scripts\**\*debug*" /&gt;
  &lt;/ItemGroup&gt;
  
  &lt;Message Text="Configuration: $(Configuration)" /&gt;
  &lt;Message Text="ExcludeFromPackageFiles: @(ExcludeFromPackageFiles)" Importance="high" /&gt;
&lt;/Target&gt;</pre>
        <p>
You can see the item group defined above which does what we want. Please note that
I put this inside of a target, CustomExcludeFiles, I will discuss why in a bit but
let’s stay on topic now. So this is pretty straight forward when the item group is
evaluated all files under <em>scripts</em> which have <em>debug</em> in the file name
will be excluded if the configuration is not set to <em>Debug</em>. Let’s see if it
works, I will build the deployment package once in both debug &amp; release then examine
the contents of the Package folder.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/WindowsLiveWriter/WebDeploymentToolMSDeployHowtoexcludefil_A290/image_6.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/WebDeploymentToolMSDeployHowtoexcludefil_A290/image_thumb_2.png" width="709" height="465" />
          </a>
        </p>
        <p>
So we can see that the files were excluded from the Release package. Now back to why
I declared the item group in a target instead of directly in the project file itself.
I noticed that if I declare that item in the project file there are some visual issues
with the representation in the Solution Explorer. To be specific the files show up
as dups, see image below.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/WindowsLiveWriter/WebDeploymentToolMSDeployHowtoexcludefil_A290/image_8.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/WebDeploymentToolMSDeployHowtoexcludefil_A290/image_thumb_3.png" width="244" height="233" />
          </a>
        </p>
        <p>
I have reported this to the right people, but for now this is a harmless issue with
an easy workaround.
</p>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>Web Deployment Tool (MSDeploy): How to exclude files from package based on Configuration</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,c926b957-b578-4d98-bbce-2260945de5cf.aspx</guid>
      <link>http://sedodream.com/2010/08/15/WebDeploymentToolMSDeployHowToExcludeFilesFromPackageBasedOnConfiguration.aspx</link>
      <pubDate>Sun, 15 Aug 2010 18:56:50 GMT</pubDate>
      <description>&lt;p&gt;
A while back I posted an entry on &lt;a href="http://sedodream.com/2010/05/01/WebDeploymentToolMSDeployBuildPackageIncludingExtraFilesOrExcludingSpecificFiles.aspx"&gt;How
to build a package including extra files or exclude files&lt;/a&gt; a reader posted a question
to &lt;a href="http://stackoverflow.com"&gt;StackOverflow.com&lt;/a&gt; asking how to exclude
files from the created package based on the configuration for the project. He asked
me to take a look at it so I figured it would be a good blog post.
&lt;/p&gt;
&lt;p&gt;
From the previous &lt;a href="http://sedodream.com/2010/05/01/WebDeploymentToolMSDeployBuildPackageIncludingExtraFilesOrExcludingSpecificFiles.aspx"&gt;post&lt;/a&gt; we
can see that the way to exclude files from packaging is by declaring an item as follows.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;ItemGroup&amp;gt;
  &amp;lt;ExcludeFromPackageFiles Include=&amp;quot;Sample.Debug.xml&amp;quot;&amp;gt;
    &amp;lt;FromTarget&amp;gt;Project&amp;lt;/FromTarget&amp;gt;
  &amp;lt;/ExcludeFromPackageFiles&amp;gt;
&amp;lt;/ItemGroup&amp;gt;&lt;/pre&gt;
&lt;p&gt;
So we need to extend this to only exclude files if the config is a certain value.
Since MSBuild supports &lt;a href="http://msdn.microsoft.com/en-us/library/7szfhaft.aspx"&gt;conditions
on almost every element&lt;/a&gt; this is going to be a breeze. As an example I have created
a sample web project with a scripts directory that has the following files.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/WebDeploymentToolMSDeployHowtoexcludefil_A290/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/WebDeploymentToolMSDeployHowtoexcludefil_A290/image_thumb_1.png" width="244" height="214" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
In that folder there I there are two files which have ‘debug’ in the name of the file.
We only want those to be included if the configuration is set to &lt;strong&gt;Debug&lt;/strong&gt;,
or another way of putting it is we want to exclude those files if the configuration
is not Debug. So we need to create to add files to the &lt;strong&gt;ExcludeFromPackageFiles&lt;/strong&gt; and
guard it with the condition that the configuration is not debug. Here is that.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Target Name=&amp;quot;CustomExlucdeFiles&amp;quot; BeforeTargets=&amp;quot;ExcludeFilesFromPackage&amp;quot;&amp;gt;
  &amp;lt;ItemGroup Condition=&amp;quot; '$(Configuration)'!='Debug' &amp;quot;&amp;gt;
    &amp;lt;ExcludeFromPackageFiles Include=&amp;quot;scripts\**\*debug*&amp;quot; /&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;
  
  &amp;lt;Message Text=&amp;quot;Configuration: $(Configuration)&amp;quot; /&amp;gt;
  &amp;lt;Message Text=&amp;quot;ExcludeFromPackageFiles: @(ExcludeFromPackageFiles)&amp;quot; Importance=&amp;quot;high&amp;quot; /&amp;gt;
&amp;lt;/Target&amp;gt;&lt;/pre&gt;
&lt;p&gt;
You can see the item group defined above which does what we want. Please note that
I put this inside of a target, CustomExcludeFiles, I will discuss why in a bit but
let’s stay on topic now. So this is pretty straight forward when the item group is
evaluated all files under &lt;em&gt;scripts&lt;/em&gt; which have &lt;em&gt;debug&lt;/em&gt; in the file name
will be excluded if the configuration is not set to &lt;em&gt;Debug&lt;/em&gt;. Let’s see if it
works, I will build the deployment package once in both debug &amp;amp; release then examine
the contents of the Package folder.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/WebDeploymentToolMSDeployHowtoexcludefil_A290/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/WebDeploymentToolMSDeployHowtoexcludefil_A290/image_thumb_2.png" width="709" height="465" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
So we can see that the files were excluded from the Release package. Now back to why
I declared the item group in a target instead of directly in the project file itself.
I noticed that if I declare that item in the project file there are some visual issues
with the representation in the Solution Explorer. To be specific the files show up
as dups, see image below.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/WebDeploymentToolMSDeployHowtoexcludefil_A290/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/WebDeploymentToolMSDeployHowtoexcludefil_A290/image_thumb_3.png" width="244" height="233" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
I have reported this to the right people, but for now this is a harmless issue with
an easy workaround.
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,c926b957-b578-4d98-bbce-2260945de5cf.aspx</comments>
      <category>Deployment</category>
      <category>MSBuild</category>
      <category>MSDeploy</category>
      <category>Web Deployment Tool</category>
      <category>Web Publishing Pipeline</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=62f78f75-c505-4f65-ad44-072f9cf58365</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,62f78f75-c505-4f65-ad44-072f9cf58365.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,62f78f75-c505-4f65-ad44-072f9cf58365.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=62f78f75-c505-4f65-ad44-072f9cf58365</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently there was a question on an internal mailing list asking the question can
you tell the difference between
</p>
        <pre class="brush: xml;">&lt;ItemGroup&gt;
  &lt;Content Include="Sample-DefinedEmpty.sdf"&gt;
    &lt;SubPath&gt;&lt;/SubPath&gt;
  &lt;/Content&gt;
&lt;/ItemGroup&gt;</pre>
        <p>
and
</p>
        <pre class="brush: xml;">&lt;ItemGroup&gt;
  &lt;Content Include="Sample-NotDefined.sdf"&gt;
  &lt;/Content&gt;
&lt;/ItemGroup&gt;</pre>
        <p>
You cannot detect this out of the box, but you can by creating a custom task. Better
would be to create an inline task so that you don’t have to deal with the headache
of maintaining a .dll for something like this, unless you are using it on many different
project files. Basically the task that we will create will need two parameters; the
Item itself (single value) and MetadataName (metadata name to check for). It will
have one output parameter, MetadataDefined, which we can check to see if the metadata
value was defined or not.
</p>
        <p>
This is a pretty easy task to create because we just look at the <a href="http://msdn.microsoft.com/en-us/library/microsoft.build.framework.itaskitem.metadatanames.aspx">MetadataNames</a> property
on the <a href="http://msdn.microsoft.com/en-us/library/microsoft.build.framework.itaskitem.aspx">ITaskItem</a> interface.
The task as well as a sample target is shown below.
</p>
        <pre class="brush: xml;">&lt;Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
  
  &lt;UsingTask TaskFactory="CodeTaskFactory"
             TaskName="MetadataExists"
             AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"&gt;
    &lt;ParameterGroup&gt;
      &lt;MetadataName Required="true"/&gt;
      &lt;Item ParameterType="Microsoft.Build.Framework.ITaskItem"/&gt;
      &lt;MetadataDefined ParameterType="System.Boolean" Output="true" /&gt;      
    &lt;/ParameterGroup&gt;
    &lt;Task&gt;
      &lt;Code&gt;
        &lt;![CDATA[
            this.MetadataDefined = false;
            if (this.Item != null)
            {
                foreach (string name in this.Item.MetadataNames)
                {
                    if (string.Compare(this.MetadataName, name, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        this.MetadataDefined = true;
                        break;
                    }
                }
            }          
        ]]&gt;
      &lt;/Code&gt;
    &lt;/Task&gt;
  &lt;/UsingTask&gt;

  &lt;Target Name="CheckForMetadata"&gt;

&lt;ItemGroup&gt;
  &lt;Content Include="Sample-DefinedEmpty.sdf"&gt;
    &lt;SubPath&gt;&lt;/SubPath&gt;
  &lt;/Content&gt;
  &lt;Content Include="Sample-NotDefined.sdf"&gt;
  &lt;/Content&gt;
&lt;/ItemGroup&gt;

    &lt;Message Text="Starting - Content"/&gt;

    &lt;!-- Create an Item which has exactly 1 value to pass to the task --&gt;
    &lt;ItemGroup&gt;
      &lt;_Content Remove="@(_Content)"/&gt;
      &lt;_Content Include="@(Content)" Condition=" '%(Content.Identity)' == 'Sample-DefinedEmpty.sdf' "/&gt;
    &lt;/ItemGroup&gt;
    &lt;MetadataExists MetadataName="SubPath" Item="@(_Content)"&gt;
      &lt;Output PropertyName="existsResult" TaskParameter="MetadataDefined"/&gt;
    &lt;/MetadataExists&gt;

    &lt;Message Text="existsResult: $(existsResult)" /&gt;


    &lt;Message Text="Starting - Content2"/&gt;
    &lt;!-- Create an Item which has exactly 1 value to pass to the task --&gt;
    &lt;ItemGroup&gt;
      &lt;_Content Remove="@(_Content)"/&gt;
      &lt;_Content Include="@(Content)" Condition=" '%(Content.Identity)' == 'Sample-NotDefined.sdf' "/&gt;
    &lt;/ItemGroup&gt;
    &lt;MetadataExists MetadataName="SubPath" Item="@(_Content)"&gt;
      &lt;Output PropertyName="existsResult" TaskParameter="MetadataDefined"/&gt;
    &lt;/MetadataExists&gt;

    &lt;Message Text="existsResult: $(existsResult)" /&gt;
  &lt;/Target&gt;
&lt;/Project&gt;</pre>
        <p>
Here you can take a look at the MetadataExists task and its usage. The only thing
that really needs to be pointed out here is that since this task accepts a single
item value we will have to take the item group Content and pick from it a specific
value which is passed to the task. That is what I am doing when I create the temp
item <strong>_Content</strong>. If you execute the CheckForMetadata target with the
command <strong>msbuild CheckMetadata01.proj /t:CheckForMetadata</strong> the result
will be what is shown below.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuildEmptyMetadataversusnometadatainli_14566/CheckMetadata_2.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CheckMetadata" border="0" alt="CheckMetadata" src="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuildEmptyMetadataversusnometadatainli_14566/CheckMetadata_2.png" />
          </a>
        </p>
        <p>
So from the output you can see that we were able to tell the difference!
</p>
        <p>
BTW, if you were wondering if you can do the same with properties, the answer is no.
</p>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>MSBuild: Empty Metadata versus no metadata, inline task to solve</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,62f78f75-c505-4f65-ad44-072f9cf58365.aspx</guid>
      <link>http://sedodream.com/2010/08/04/MSBuildEmptyMetadataVersusNoMetadataInlineTaskToSolve.aspx</link>
      <pubDate>Wed, 04 Aug 2010 06:17:20 GMT</pubDate>
      <description>&lt;p&gt;
Recently there was a question on an internal mailing list asking the question can
you tell the difference between
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;ItemGroup&amp;gt;
  &amp;lt;Content Include=&amp;quot;Sample-DefinedEmpty.sdf&amp;quot;&amp;gt;
    &amp;lt;SubPath&amp;gt;&amp;lt;/SubPath&amp;gt;
  &amp;lt;/Content&amp;gt;
&amp;lt;/ItemGroup&amp;gt;&lt;/pre&gt;
&lt;p&gt;
and
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;ItemGroup&amp;gt;
  &amp;lt;Content Include=&amp;quot;Sample-NotDefined.sdf&amp;quot;&amp;gt;
  &amp;lt;/Content&amp;gt;
&amp;lt;/ItemGroup&amp;gt;&lt;/pre&gt;
&lt;p&gt;
You cannot detect this out of the box, but you can by creating a custom task. Better
would be to create an inline task so that you don’t have to deal with the headache
of maintaining a .dll for something like this, unless you are using it on many different
project files. Basically the task that we will create will need two parameters; the
Item itself (single value) and MetadataName (metadata name to check for). It will
have one output parameter, MetadataDefined, which we can check to see if the metadata
value was defined or not.
&lt;/p&gt;
&lt;p&gt;
This is a pretty easy task to create because we just look at the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.build.framework.itaskitem.metadatanames.aspx"&gt;MetadataNames&lt;/a&gt; property
on the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.build.framework.itaskitem.aspx"&gt;ITaskItem&lt;/a&gt; interface.
The task as well as a sample target is shown below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
  
  &amp;lt;UsingTask TaskFactory=&amp;quot;CodeTaskFactory&amp;quot;
             TaskName=&amp;quot;MetadataExists&amp;quot;
             AssemblyFile=&amp;quot;$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll&amp;quot;&amp;gt;
    &amp;lt;ParameterGroup&amp;gt;
      &amp;lt;MetadataName Required=&amp;quot;true&amp;quot;/&amp;gt;
      &amp;lt;Item ParameterType=&amp;quot;Microsoft.Build.Framework.ITaskItem&amp;quot;/&amp;gt;
      &amp;lt;MetadataDefined ParameterType=&amp;quot;System.Boolean&amp;quot; Output=&amp;quot;true&amp;quot; /&amp;gt;      
    &amp;lt;/ParameterGroup&amp;gt;
    &amp;lt;Task&amp;gt;
      &amp;lt;Code&amp;gt;
        &amp;lt;![CDATA[
            this.MetadataDefined = false;
            if (this.Item != null)
            {
                foreach (string name in this.Item.MetadataNames)
                {
                    if (string.Compare(this.MetadataName, name, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        this.MetadataDefined = true;
                        break;
                    }
                }
            }          
        ]]&amp;gt;
      &amp;lt;/Code&amp;gt;
    &amp;lt;/Task&amp;gt;
  &amp;lt;/UsingTask&amp;gt;

  &amp;lt;Target Name=&amp;quot;CheckForMetadata&amp;quot;&amp;gt;

&amp;lt;ItemGroup&amp;gt;
  &amp;lt;Content Include=&amp;quot;Sample-DefinedEmpty.sdf&amp;quot;&amp;gt;
    &amp;lt;SubPath&amp;gt;&amp;lt;/SubPath&amp;gt;
  &amp;lt;/Content&amp;gt;
  &amp;lt;Content Include=&amp;quot;Sample-NotDefined.sdf&amp;quot;&amp;gt;
  &amp;lt;/Content&amp;gt;
&amp;lt;/ItemGroup&amp;gt;

    &amp;lt;Message Text=&amp;quot;Starting - Content&amp;quot;/&amp;gt;

    &amp;lt;!-- Create an Item which has exactly 1 value to pass to the task --&amp;gt;
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;_Content Remove=&amp;quot;@(_Content)&amp;quot;/&amp;gt;
      &amp;lt;_Content Include=&amp;quot;@(Content)&amp;quot; Condition=&amp;quot; '%(Content.Identity)' == 'Sample-DefinedEmpty.sdf' &amp;quot;/&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;
    &amp;lt;MetadataExists MetadataName=&amp;quot;SubPath&amp;quot; Item=&amp;quot;@(_Content)&amp;quot;&amp;gt;
      &amp;lt;Output PropertyName=&amp;quot;existsResult&amp;quot; TaskParameter=&amp;quot;MetadataDefined&amp;quot;/&amp;gt;
    &amp;lt;/MetadataExists&amp;gt;

    &amp;lt;Message Text=&amp;quot;existsResult: $(existsResult)&amp;quot; /&amp;gt;


    &amp;lt;Message Text=&amp;quot;Starting - Content2&amp;quot;/&amp;gt;
    &amp;lt;!-- Create an Item which has exactly 1 value to pass to the task --&amp;gt;
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;_Content Remove=&amp;quot;@(_Content)&amp;quot;/&amp;gt;
      &amp;lt;_Content Include=&amp;quot;@(Content)&amp;quot; Condition=&amp;quot; '%(Content.Identity)' == 'Sample-NotDefined.sdf' &amp;quot;/&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;
    &amp;lt;MetadataExists MetadataName=&amp;quot;SubPath&amp;quot; Item=&amp;quot;@(_Content)&amp;quot;&amp;gt;
      &amp;lt;Output PropertyName=&amp;quot;existsResult&amp;quot; TaskParameter=&amp;quot;MetadataDefined&amp;quot;/&amp;gt;
    &amp;lt;/MetadataExists&amp;gt;

    &amp;lt;Message Text=&amp;quot;existsResult: $(existsResult)&amp;quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Here you can take a look at the MetadataExists task and its usage. The only thing
that really needs to be pointed out here is that since this task accepts a single
item value we will have to take the item group Content and pick from it a specific
value which is passed to the task. That is what I am doing when I create the temp
item &lt;strong&gt;_Content&lt;/strong&gt;. If you execute the CheckForMetadata target with the
command &lt;strong&gt;msbuild CheckMetadata01.proj /t:CheckForMetadata&lt;/strong&gt; the result
will be what is shown below.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuildEmptyMetadataversusnometadatainli_14566/CheckMetadata_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CheckMetadata" border="0" alt="CheckMetadata" src="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuildEmptyMetadataversusnometadatainli_14566/CheckMetadata_2.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
So from the output you can see that we were able to tell the difference!
&lt;/p&gt;
&lt;p&gt;
BTW, if you were wondering if you can do the same with properties, the answer is no.
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,62f78f75-c505-4f65-ad44-072f9cf58365.aspx</comments>
      <category>inline task</category>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=69f95d98-09e1-4f33-bd6c-5e131a591296</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,69f95d98-09e1-4f33-bd6c-5e131a591296.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,69f95d98-09e1-4f33-bd6c-5e131a591296.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=69f95d98-09e1-4f33-bd6c-5e131a591296</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A while back I talked about the new feature available in MSBuild 4 Inline Tasks in.
</p>
        <ul>
          <li>
            <a href="http://sedodream.com/2010/01/20/MSBuild40InlineTasks.aspx">MSBuild 4.0: Inline
Tasks</a>
          </li>
          <li>
            <a href="http://sedodream.com/2010/01/22/MSBuild40InlineTasksPart2.aspx">MSBuild 4.0:
Inline Tasks Part 2</a>
          </li>
        </ul>
        <p>
In the previous examples I have use <a href="http://msdn.microsoft.com/en-us/vcsharp/default.aspx">C#</a> as
my language of choice. C# is not your only choice you can also use VB.Net but you
can also use JavaScript! When MSBuild creates the class for the inline task it uses
CodeDom to do so, and JavaScript is one of its supported languages. Perhaps its actually
called JScript. In any case take a look at the project file below which shows this
in action.
</p>
        <pre class="brush: js;">&lt;Project ToolsVersion="4.0" DefaultTargets="PrintValues" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;

  &lt;UsingTask
    TaskName="Jsex01"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"&gt;
    &lt;ParameterGroup&gt;
      &lt;Files ParameterType="Microsoft.Build.Framework.ITaskItem[]"/&gt;
    &lt;/ParameterGroup&gt;
    &lt;Task&gt;
      &lt;Code Type="Fragment" Language="javascript"&gt;
        &lt;![CDATA[
          function printMessageFor(item : Microsoft.Build.Framework.ITaskItem) {
            Log.LogMessage(item.ItemSpec + "fullpath: " + item.GetMetadata("FullPath"));
          }
          
          for(var i = 0; i&lt;Files.length; i++) {
            printMessageFor(Files[0]);
          }
          
        ]]&gt;
      &lt;/Code&gt;
    &lt;/Task&gt;
  &lt;/UsingTask&gt;

  &lt;ItemGroup&gt;
    &lt;Source Include="one.cs"/&gt;
    &lt;Source Include="two.cs"/&gt;
    &lt;Source Include="three.cs"/&gt;
    &lt;Source Include="four.cs"/&gt;
  &lt;/ItemGroup&gt;
  
  &lt;Target Name="PrintValues"&gt;
    &lt;Jsex01 Files="@(Source)" /&gt;
  &lt;/Target&gt;

&lt;/Project&gt;</pre>
        <p>
Here you can see that I created a new inline task called, Jsex01 and its written in
Javascript. Then inside of the PrintValues target this task is called. If you execute
the PrintValues target the result will be what you see below.
</p>
        <p>
          <a href="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuild4InlineTasksPart3_128AF/image_4.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuild4InlineTasksPart3_128AF/image_thumb_1.png" width="792" height="252" />
          </a>
        </p>
        <p>
So if you prefer JavaScript to C# or VB.Net then you should try this out!
</p>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>MSBuild 4 : Inline Tasks Part 3, tasks in JavaScript</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,69f95d98-09e1-4f33-bd6c-5e131a591296.aspx</guid>
      <link>http://sedodream.com/2010/07/31/MSBuild4InlineTasksPart3TasksInJavaScript.aspx</link>
      <pubDate>Sat, 31 Jul 2010 04:22:28 GMT</pubDate>
      <description>&lt;p&gt;
A while back I talked about the new feature available in MSBuild 4 Inline Tasks in.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://sedodream.com/2010/01/20/MSBuild40InlineTasks.aspx"&gt;MSBuild 4.0: Inline
Tasks&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://sedodream.com/2010/01/22/MSBuild40InlineTasksPart2.aspx"&gt;MSBuild 4.0:
Inline Tasks Part 2&lt;/a&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
In the previous examples I have use &lt;a href="http://msdn.microsoft.com/en-us/vcsharp/default.aspx"&gt;C#&lt;/a&gt; as
my language of choice. C# is not your only choice you can also use VB.Net but you
can also use JavaScript! When MSBuild creates the class for the inline task it uses
CodeDom to do so, and JavaScript is one of its supported languages. Perhaps its actually
called JScript. In any case take a look at the project file below which shows this
in action.
&lt;/p&gt;
&lt;pre class="brush: js;"&gt;&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; DefaultTargets=&amp;quot;PrintValues&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;

  &amp;lt;UsingTask
    TaskName=&amp;quot;Jsex01&amp;quot;
    TaskFactory=&amp;quot;CodeTaskFactory&amp;quot;
    AssemblyFile=&amp;quot;$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll&amp;quot;&amp;gt;
    &amp;lt;ParameterGroup&amp;gt;
      &amp;lt;Files ParameterType=&amp;quot;Microsoft.Build.Framework.ITaskItem[]&amp;quot;/&amp;gt;
    &amp;lt;/ParameterGroup&amp;gt;
    &amp;lt;Task&amp;gt;
      &amp;lt;Code Type=&amp;quot;Fragment&amp;quot; Language=&amp;quot;javascript&amp;quot;&amp;gt;
        &amp;lt;![CDATA[
          function printMessageFor(item : Microsoft.Build.Framework.ITaskItem) {
            Log.LogMessage(item.ItemSpec + &amp;quot;fullpath: &amp;quot; + item.GetMetadata(&amp;quot;FullPath&amp;quot;));
          }
          
          for(var i = 0; i&amp;lt;Files.length; i++) {
            printMessageFor(Files[0]);
          }
          
        ]]&amp;gt;
      &amp;lt;/Code&amp;gt;
    &amp;lt;/Task&amp;gt;
  &amp;lt;/UsingTask&amp;gt;

  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;Source Include=&amp;quot;one.cs&amp;quot;/&amp;gt;
    &amp;lt;Source Include=&amp;quot;two.cs&amp;quot;/&amp;gt;
    &amp;lt;Source Include=&amp;quot;three.cs&amp;quot;/&amp;gt;
    &amp;lt;Source Include=&amp;quot;four.cs&amp;quot;/&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;
  
  &amp;lt;Target Name=&amp;quot;PrintValues&amp;quot;&amp;gt;
    &amp;lt;Jsex01 Files=&amp;quot;@(Source)&amp;quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;

&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Here you can see that I created a new inline task called, Jsex01 and its written in
Javascript. Then inside of the PrintValues target this task is called. If you execute
the PrintValues target the result will be what you see below.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuild4InlineTasksPart3_128AF/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://sedodream.com/content/binary/WindowsLiveWriter/MSBuild4InlineTasksPart3_128AF/image_thumb_1.png" width="792" height="252" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
So if you prefer JavaScript to C# or VB.Net then you should try this out!
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,69f95d98-09e1-4f33-bd6c-5e131a591296.aspx</comments>
      <category>inline task</category>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=803d77d7-a220-4cee-a803-f6291cd4ba71</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,803d77d7-a220-4cee-a803-f6291cd4ba71.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,803d77d7-a220-4cee-a803-f6291cd4ba71.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=803d77d7-a220-4cee-a803-f6291cd4ba71</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
If you are using Visual Studio 2010 then you may already be aware that <a href="http://www.iis.net/download/WebDeploy">Web
Deployment Tool</a> (aka MSDeploy) is integrated into Visual Studio. I’ve posted a
few blog entries already about this tool. Two of the common questions that I get discussing
this with people are
</p>
        <ol>
          <li>
How do I exclude files from being placed in the package? 
</li>
          <li>
How do I add other files to the created package? 
</li>
        </ol>
        <p>
I will address these two questions here, first we look at the easier one, how to exclude
files but we will go over a bit of background first.
</p>
        <h3>Web Publishing Pipeline
</h3>
        <p>
With Visual Studio 2010 a new concept has been created which is known as the Web Publishing
Pipeline. In a nutshell this is a process which will take your web application, build
it and eventually create a package that you can use to deploy your application. This
process is fully captured in MSBuild. With VS 2010 many targets and many tasks are
shipped to support this process. Since its captured in MSBuild format, you can customize
and extend to your hearts desire. So what we need to do is hook into this process
to perform the customizations that we need. This process is captured in the following
files.
</p>
        <pre class="brush: plain;">%program files%\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets
%program files%\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets</pre>
        <p>
        </p>
        <p>
The Microsoft.WebApplication.targets file is imported by the web applications projects
file, then that file imports the Microsoft.Web.Publishing.targets file.
</p>
        <h3>Excluding files from being packaged
</h3>
        <p>
If you open the project file of a web application created with VS 2010 towards the
bottom of it you will find a line with.
</p>
        <pre class="brush: xml;">&lt;Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" /&gt;</pre>
        <p>
BTW you can open the project file inside of VS. Right click on the project pick <em>Unload
Project</em>. Then right click on the unloaded project and select <em>Edit Project</em>.
</p>
        <p>
This statement will include all the targets and tasks that we need. Most of our customizations
should be <strong>after</strong> that import, if you are not sure put if after! So
if you have files to exclude there is an item name, <strong>ExcludeFromPackageFiles</strong>,
that can be used to do so. For example let’s say that you have file named Sample.Debug.js
which included in your web application but you want that file to be excluded from
the created packages. You can place the snippet below after that import statement.
</p>
        <pre class="brush: xml;">&lt;ItemGroup&gt;
  &lt;ExcludeFromPackageFiles Include="Sample.Debug.xml"&gt;
    &lt;FromTarget&gt;Project&lt;/FromTarget&gt;
  &lt;/ExcludeFromPackageFiles&gt;
&lt;/ItemGroup&gt;</pre>
        <p>
By declaring populating this item the files will automatically be excluded. Note the
usage of the FromTarget metadata here. I will not get into that here, but you should
know to always specify that.
</p>
        <h3>Including extra files into the package
</h3>
        <p>
Including extra files into the package is a bit harder but still no bigee if you are
comfortable with MSBuild, and if you are not then <a href="http://www.amazon.com/gp/product/0735626286?ie=UTF8&amp;tag=sedodream-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0735626286">read
this</a>.  In order to do this we need to hook into the part of the process that
collects the files for packaging. The target we need to extend is called <strong>CopyAllFilesToSingleFolder</strong>.
This target has a dependency property, <em>PipelinePreDeployCopyAllFilesToOneFolderDependsOn</em>,
that we can tap into and inject our own target. So we will create a target named <em>CustomCollectFiles</em> and
inject that into the process. We achieve this with the following (<strong>remember
after the import statement</strong>).
</p>
        <pre class="brush: xml;">&lt;PropertyGroup&gt;
  &lt;CopyAllFilesToSingleFolderForPackageDependsOn&gt;
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  &lt;/CopyAllFilesToSingleFolderForPackageDependsOn&gt;
&lt;/PropertyGroup&gt;</pre>
        <p>
This will add our target to the process, now we need to define the target itself.
Let’s assume that you have a folder named Extra Files that sits 1 level above your
web project. You want to include all of those files. Here is the <em>CustomCollectFiles</em> target
and we discuss after that.
</p>
        <pre class="brush: xml;">&lt;Target Name="CustomCollectFiles"&gt;
  &lt;ItemGroup&gt;
    &lt;_CustomFiles Include="..\Extra Files\**\*" /&gt;

    &lt;FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)"&gt;
      &lt;DestinationRelativePath&gt;Extra Files\%(RecursiveDir)%(Filename)%(Extension)&lt;/DestinationRelativePath&gt;
    &lt;/FilesForPackagingFromProject&gt;
  &lt;/ItemGroup&gt;
&lt;/Target&gt;</pre>
        <p>
Here what I did was create the item <em>_CustomFiles</em> and in the Include attribute
told it to pick up all the files in that folder and any folder underneath it. Then
I use this item to populate the FilesForPackagingFromProject item. This is the item
that MSDeploy actually uses to add extra files. Also notice that I declared the metadata <em>DestinationRelativePath</em> value.
This will determine the relative path that it will be placed in the package. I used
the statement <em>Extra Files%(RecursiveDir)%(Filename)%(Extension)</em> here. What
that is saying is to place it in the same relative location in the package as it is
under the Extra Files folder.
</p>
        <p>
Admittedly this could be easier, but its not too bad, and its pretty flexible.
</p>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>Web Deployment Tool (MSDeploy) : Build Package including extra files or excluding specific files</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,803d77d7-a220-4cee-a803-f6291cd4ba71.aspx</guid>
      <link>http://sedodream.com/2010/05/01/WebDeploymentToolMSDeployBuildPackageIncludingExtraFilesOrExcludingSpecificFiles.aspx</link>
      <pubDate>Sat, 01 May 2010 03:09:16 GMT</pubDate>
      <description>&lt;p&gt;
If you are using Visual Studio 2010 then you may already be aware that &lt;a href="http://www.iis.net/download/WebDeploy"&gt;Web
Deployment Tool&lt;/a&gt; (aka MSDeploy) is integrated into Visual Studio. I’ve posted a
few blog entries already about this tool. Two of the common questions that I get discussing
this with people are
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
How do I exclude files from being placed in the package? 
&lt;/li&gt;
&lt;li&gt;
How do I add other files to the created package? 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
I will address these two questions here, first we look at the easier one, how to exclude
files but we will go over a bit of background first.
&lt;/p&gt;
&lt;h3&gt;Web Publishing Pipeline
&lt;/h3&gt;
&lt;p&gt;
With Visual Studio 2010 a new concept has been created which is known as the Web Publishing
Pipeline. In a nutshell this is a process which will take your web application, build
it and eventually create a package that you can use to deploy your application. This
process is fully captured in MSBuild. With VS 2010 many targets and many tasks are
shipped to support this process. Since its captured in MSBuild format, you can customize
and extend to your hearts desire. So what we need to do is hook into this process
to perform the customizations that we need. This process is captured in the following
files.
&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;%program files%\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets
%program files%\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets&lt;/pre&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
The Microsoft.WebApplication.targets file is imported by the web applications projects
file, then that file imports the Microsoft.Web.Publishing.targets file.
&lt;/p&gt;
&lt;h3&gt;Excluding files from being packaged
&lt;/h3&gt;
&lt;p&gt;
If you open the project file of a web application created with VS 2010 towards the
bottom of it you will find a line with.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Import Project=&amp;quot;$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets&amp;quot; /&amp;gt;&lt;/pre&gt;
&lt;p&gt;
BTW you can open the project file inside of VS. Right click on the project pick &lt;em&gt;Unload
Project&lt;/em&gt;. Then right click on the unloaded project and select &lt;em&gt;Edit Project&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
This statement will include all the targets and tasks that we need. Most of our customizations
should be &lt;strong&gt;after&lt;/strong&gt; that import, if you are not sure put if after! So
if you have files to exclude there is an item name, &lt;strong&gt;ExcludeFromPackageFiles&lt;/strong&gt;,
that can be used to do so. For example let’s say that you have file named Sample.Debug.js
which included in your web application but you want that file to be excluded from
the created packages. You can place the snippet below after that import statement.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;ItemGroup&amp;gt;
  &amp;lt;ExcludeFromPackageFiles Include=&amp;quot;Sample.Debug.xml&amp;quot;&amp;gt;
    &amp;lt;FromTarget&amp;gt;Project&amp;lt;/FromTarget&amp;gt;
  &amp;lt;/ExcludeFromPackageFiles&amp;gt;
&amp;lt;/ItemGroup&amp;gt;&lt;/pre&gt;
&lt;p&gt;
By declaring populating this item the files will automatically be excluded. Note the
usage of the FromTarget metadata here. I will not get into that here, but you should
know to always specify that.
&lt;/p&gt;
&lt;h3&gt;Including extra files into the package
&lt;/h3&gt;
&lt;p&gt;
Including extra files into the package is a bit harder but still no bigee if you are
comfortable with MSBuild, and if you are not then &lt;a href="http://www.amazon.com/gp/product/0735626286?ie=UTF8&amp;amp;tag=sedodream-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=0735626286"&gt;read
this&lt;/a&gt;.&amp;#160; In order to do this we need to hook into the part of the process that
collects the files for packaging. The target we need to extend is called &lt;strong&gt;CopyAllFilesToSingleFolder&lt;/strong&gt;.
This target has a dependency property, &lt;em&gt;PipelinePreDeployCopyAllFilesToOneFolderDependsOn&lt;/em&gt;,
that we can tap into and inject our own target. So we will create a target named &lt;em&gt;CustomCollectFiles&lt;/em&gt; and
inject that into the process. We achieve this with the following (&lt;strong&gt;remember
after the import statement&lt;/strong&gt;).
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;PropertyGroup&amp;gt;
  &amp;lt;CopyAllFilesToSingleFolderForPackageDependsOn&amp;gt;
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  &amp;lt;/CopyAllFilesToSingleFolderForPackageDependsOn&amp;gt;
&amp;lt;/PropertyGroup&amp;gt;&lt;/pre&gt;
&lt;p&gt;
This will add our target to the process, now we need to define the target itself.
Let’s assume that you have a folder named Extra Files that sits 1 level above your
web project. You want to include all of those files. Here is the &lt;em&gt;CustomCollectFiles&lt;/em&gt; target
and we discuss after that.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Target Name=&amp;quot;CustomCollectFiles&amp;quot;&amp;gt;
  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;_CustomFiles Include=&amp;quot;..\Extra Files\**\*&amp;quot; /&amp;gt;

    &amp;lt;FilesForPackagingFromProject  Include=&amp;quot;%(_CustomFiles.Identity)&amp;quot;&amp;gt;
      &amp;lt;DestinationRelativePath&amp;gt;Extra Files\%(RecursiveDir)%(Filename)%(Extension)&amp;lt;/DestinationRelativePath&amp;gt;
    &amp;lt;/FilesForPackagingFromProject&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;
&amp;lt;/Target&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Here what I did was create the item &lt;em&gt;_CustomFiles&lt;/em&gt; and in the Include attribute
told it to pick up all the files in that folder and any folder underneath it. Then
I use this item to populate the FilesForPackagingFromProject item. This is the item
that MSDeploy actually uses to add extra files. Also notice that I declared the metadata &lt;em&gt;DestinationRelativePath&lt;/em&gt; value.
This will determine the relative path that it will be placed in the package. I used
the statement &lt;em&gt;Extra Files%(RecursiveDir)%(Filename)%(Extension)&lt;/em&gt; here. What
that is saying is to place it in the same relative location in the package as it is
under the Extra Files folder.
&lt;/p&gt;
&lt;p&gt;
Admittedly this could be easier, but its not too bad, and its pretty flexible.
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,803d77d7-a220-4cee-a803-f6291cd4ba71.aspx</comments>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
      <category>MSDeploy</category>
      <category>Visual Studio</category>
      <category>Visual Studio 2010</category>
      <category>Web Deployment Tool</category>
      <category>Web Publishing Pipeline</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=6cced95a-0f4a-4740-9dba-03782008d8d3</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,6cced95a-0f4a-4740-9dba-03782008d8d3.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,6cced95a-0f4a-4740-9dba-03782008d8d3.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=6cced95a-0f4a-4740-9dba-03782008d8d3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">If you are using <a href="http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx">MSBuild
4.0</a> then you may be interested in knowing that there are a couple new switches
that you can pass to msbuild.exe when you kick off a build. The new switches, <em><strong>/preprocess(/pp)</strong></em> and <em><strong>/detailedsummary(/ds)</strong></em>,
are more convenient then necessary. 
<h2>/preprocess (/pp)
</h2><p>
Since you can import other MSBuild files using the <a href="http://msdn.microsoft.com/en-us/library/92x05xfs.aspx">Import
Element</a> sometimes locating where a target, property or item is being defined can
lead to a search that takes you through several files. It can be even more confusing
if more than 1 file defines the property or target that you are interested in, because
you may have thought that you found the right target but you may one that was overridden
by another file. Now with MSBuild 4.0 you don’t have to search through all of those
files. You can use the switch /preprocess switch. Here is the snippet from msbuild.exe
/? describing it.
</p><pre class="brush: plain;">/preprocess[:file] 
 Creates a single, aggregated project file by inlining all the files that would be imported during a build, with their boundaries marked. This can be useful for figuring out what files are being imported and from where, and what they will contribute to the build. By default the output is written to the console window. If the path to an output file is provided that will be used instead.
 (Short form: /pp)
 Example:
   /pp:out.txt</pre><p>
When you use this the full logical project file is dumped to the console, or optionally
to a file, and it includes references to where the elements are defined. For example
I created the following very simple project files.
</p><h3>import-01.proj
</h3><pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
    &lt;Target Name="TargetOne"&gt;
        &lt;Message Text="From import-02.proj - TargetOne"/&gt;
    &lt;/Target&gt;
&lt;/Project&gt;</pre><h3>import-02.proj
</h3><pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
    &lt;Target Name="TargetTwo"&gt;
        &lt;Message Text="From import-02.proj - TargetTwo"/&gt;
    &lt;/Target&gt;
&lt;/Project&gt;</pre><h3>master.proj
</h3><pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project ToolsVersion="4.0" DefaultTargets="TargetOne;TargetTwo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;

    &lt;Target Name="TargetOne"&gt;
        &lt;Message Text="From master.proj - TargetOne"/&gt;
    &lt;/Target&gt;

    &lt;Target Name="TargetTwo"&gt;
        &lt;Message Text="From master.proj - TargetTwo"/&gt;
    &lt;/Target&gt;

    &lt;Import Project="import-01.proj"/&gt;
    &lt;Import Project="import-02.proj"/&gt;
&lt;/Project&gt;</pre><p>
After executing the command msbuild.exe master.proj /pp:out.xml the following was
written to the out.xml file.
</p><pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;!--
============================================================================================================================================
C:\temp\MSBuild\import\master.proj
============================================================================================================================================
--&gt;
&lt;Project ToolsVersion="4.0" DefaultTargets="TargetOne;TargetTwo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
  &lt;Target Name="TargetOne"&gt;
    &lt;Message Text="From master.proj - TargetOne" /&gt;
  &lt;/Target&gt;
  &lt;Target Name="TargetTwo"&gt;
    &lt;Message Text="From master.proj - TargetTwo" /&gt;
  &lt;/Target&gt;
  &lt;!--
============================================================================================================================================
  &lt;Import Project="import-01.proj"&gt;

C:\temp\MSBuild\import\import-01.proj
============================================================================================================================================
--&gt;
  &lt;Target Name="TargetOne"&gt;
    &lt;Message Text="From import-02.proj - TargetOne" /&gt;
  &lt;/Target&gt;
  &lt;!--
============================================================================================================================================
  &lt;/Import&gt;

C:\temp\MSBuild\import\master.proj
============================================================================================================================================
--&gt;
  &lt;!--
============================================================================================================================================
  &lt;Import Project="import-02.proj"&gt;

C:\temp\MSBuild\import\import-02.proj
============================================================================================================================================
--&gt;
  &lt;Target Name="TargetTwo"&gt;
    &lt;Message Text="From import-02.proj - TargetTwo" /&gt;
  &lt;/Target&gt;
  &lt;!--
============================================================================================================================================
  &lt;/Import&gt;

C:\temp\MSBuild\import\master.proj
============================================================================================================================================
--&gt;
&lt;/Project&gt;</pre><p>
As you can see with /pp it is very easy to see exactly what is defined where and at
what location.
</p><h2>/detailedsummary (/ds)
</h2><p>
Another new feature with MSBuild 4.0 is the <strong><em>/detailedsummary (/ds)</em></strong> command
line switch. When you use this switch you will be shown a detailed summary (<em>haha</em>)
of build execution. This summary includes the amount of time spent build each project
file as well as the node utilization. I just preformed a build with the command <strong>msbuild
RuleStack.Engine.sln /m /ds</strong> and the summary is shown below.
</p><pre class="brush: plain;">============================== Build Hierarchy (IDs represent configurations) =====================================================
 Id                  : Exclusive Time   Total Time   Path (Targets)
 -----------------------------------------------------------------------------------------------------------------------------------
 0                   : 0.020s           1.211s       C:\...\RuleStack.Engine.sln ()
 | 1                 : 0.667s           0.667s       C:\...\RuleStack.Engine.Common\RuleStack.Engine.Common.csproj ()
 | 3                 : 0.255s           0.718s       C:\...\Unittest\RuleStack.Engine.Tests\RuleStack.Engine.Tests.csproj ()
 | | 6               : 0.000s           0.000s       C:\...\ObjectBinder\RuleStack.ObjectBinder\RuleStack.ObjectBinder .csproj ()
 | | 5               : 0.000s           0.000s       C:\...\RuleStack.Data\RuleStack.Data.csproj ()
 | | 1               : 0.000s           0.000s       C:\...\RuleStack.Engine.Common\RuleStack.Engine.Common.csproj ()
 | | 2               : 0.000s           0.000s       C:\...\RuleStack.Engine.Backend\RuleStack.Engine.Backend.csproj ( )
 | | 8               : 0.292s           0.460s       C:\...\RuleStack.Engine.Admin.Web\RuleStack.Engine.Admin.Web.csproj ()
 | | | 24            : 0.000s           0.000s       C:\...\RuleStack.Engine.Backend\RuleStack.Engine.Backend.csproj ( GetNativeManifest)
 | | | 5             : 0.000s           0.000s       C:\...\RuleStack.Data\RuleStack.Data.csproj ()
 | | . 2             : 0.000s           0.000s       C:\...\RuleStack.Engine.Backend\RuleStack.Engine.Backend.csproj ( )
 | . 36              : 0.003s           0.003s       C:\...\RuleStack.Engine.Admin.Web\RuleStack.Engine.Admin.Web.csproj (GetNativeManifest)
 | 2                 : 0.319s           0.390s       C:\...\RuleStack.Engine.Backend\RuleStack.Engine.Backend.csproj ( )
 | | 6               : 0.000s           0.000s       C:\...\ObjectBinder\RuleStack.ObjectBinder\RuleStack.ObjectBinder.csproj ()
 | | 5               : 0.000s           0.000s       C:\...\RuleStack.Data\RuleStack.Data.csproj ()
 | | 17              : 0.002s           0.002s       C:\...\RuleStack.Data\RuleStack.Data.csproj (GetNativeManifest)
 | . 21              : 0.001s           0.001s       C:\...\RuleStack.Data\RuleStack.Data.csproj (GetCopyToOutputDirectoryItems)
 | 4                 : 0.382s           0.567s       C:\...\RuleStack.Services\RuleStack.Services.csproj ()
 | | 5               : 0.000s           0.000s       C:\...\RuleStack.Data\RuleStack.Data.csproj ()
 | | 2               : 0.000s           0.000s       C:\...\RuleStack.Engine.Backend\RuleStack.Engine.Backend.csproj ( )
 | | 24              : 0.002s           0.002s       C:\...\RuleStack.Engine.Backend\RuleStack.Engine.Backend.csproj ( GetNativeManifest)
 | . 29              : 0.001s           0.001s       C:\...\RuleStack.Engine.Backend\RuleStack.Engine.Backend.csproj ( GetCopyToOutputDirectoryItems)
 | 7                 : 0.333s           0.337s       C:\...\ObjectBinder\Test_RuleStack.ObjectBinder\Test_RuleStack.ObjectBinder.csproj ()
 | | 6               : 0.000s           0.000s       C:\...\ObjectBinder\RuleStack.ObjectBinder\RuleStack.ObjectBinder.csproj ()
 | | 13              : 0.001s           0.001s       C:\...\ObjectBinder\RuleStack.ObjectBinder\RuleStack.ObjectBinder.csproj (GetNativeManifest)
 | . 19              : 0.001s           0.001s       C:\...\ObjectBinder\RuleStack.ObjectBinder\RuleStack.ObjectBinder.csproj (GetCopyToOutputDirectoryItems)
 | 6                 : 0.210s           0.210s       C:\...\ObjectBinder\RuleStack.ObjectBinder\RuleStack.ObjectBinder.csproj ()
 | 5                 : 0.277s           0.277s       C:\...\RuleStack.Data\RuleStack.Data.csproj ()
 | . 12              : 0.000s           0.000s       C:\...\RuleStack.Engine.Common\RuleStack.Engine.Common.csproj (GetNativeManifest)
 . 43                : 0.002s           0.002s       C:\...\RuleStack.Engine.Admin.Web\RuleStack.Engine.Admin.Web.csproj.metaproj ()

 ============================== Node Utilization (IDs represent configurations) ====================================================
 Timestamp:            1       2       3       4       5       6       7       8        Duration   Cumulative
 -----------------------------------------------------------------------------------------------------------------------------------
 634081842447519669:   0       x       x       x       x       x       x       x        0.018s     0.018s
 634081842447699679:   1       x       x       x       x       x       x       x        0.461s     0.479s #########
 634081842452309943:   |       6       7       5       3       4       2       x        0.130s     0.609s ##
 634081842453610018:   |       |       |       |       8       |       |       x        0.086s     0.695s #
 634081842454470067:   |       |       |       |       |       |       |       x        0.001s     0.696s
 634081842454480067:   x       |       |       |       |       |       |       x        0.001s     0.697s
 634081842454490068:   x       |       x       |       |       x       |       x        0.001s     0.698s
 634081842454500068:   x       |       x       |       |       x       x       x        0.001s     0.699s
 634081842454510069:   x       x       7       |       |       x       x       x        0.002s     0.701s
 634081842454530070:   12      x       |       |       |       x       x       x        0.002s     0.703s
 634081842454550071:   |       13      x       |       |       x       x       x        0.001s     0.704s
 634081842454560072:   |       x       7       |       |       x       x       x        0.008s     0.712s
 634081842454640076:   |       x       |       |       x       x       x       x        0.054s     0.766s #
 634081842455180107:   |       x       |       x       x       x       2       x        0.003s     0.769s
 634081842455210109:   |       x       |       17      x       x       x       x        0.002s     0.771s
 634081842455230110:   |       x       |       x       x       x       2       x        0.036s     0.807s
 634081842455590131:   |       19      x       x       x       x       |       x        0.001s     0.808s
 634081842455600131:   |       x       7       x       x       x       |       x        0.018s     0.826s
 634081842455780142:   |       x       x       x       x       x       |       x        0.036s     0.862s
 634081842456140162:   |       x       x       21      x       x       x       x        0.001s     0.863s
 634081842456150163:   |       x       x       x       x       x       2       x        0.016s     0.879s
 634081842456310172:   |       x       x       x       8       4       x       x        0.003s     0.882s
 634081842456340174:   |       x       x       x       |       x       24      x        0.001s     0.883s
 634081842456350174:   |       x       x       x       x       x       |       x        0.001s     0.884s
 634081842456360175:   |       x       x       x       8       4       x       x        0.148s     1.032s ##
 634081842457840259:   |       x       x       x       |       x       29      x        0.001s     1.033s
 634081842457850260:   |       x       x       x       |       4       x       x        0.023s     1.056s
 634081842458080273:   |       x       x       x       |       x       x       x        0.013s     1.069s
 634081842458210281:   |       x       x       x       3       x       x       x        0.004s     1.073s
 634081842458250283:   |       x       x       x       36      x       x       x        0.003s     1.076s
 634081842458280285:   |       x       x       x       3       x       x       x        0.131s     1.207s ##
 634081842459590360:   0       x       x       x       x       x       x       x        0.001s     1.208s
 634081842459600360:   43      x       x       x       x       x       x       x        0.002s     1.210s
 634081842459620361:   0       x       x       x       x       x       x       x        0.001s     1.211s
 -----------------------------------------------------------------------------------------------------------------------------------
 Utilization:          57.8    30.3    46.9    39.6    76.5    53.6    45.4    .0       Average Utilization: 43.8</pre><p>
In the snippet above you should know that I replace the path to the files with <strong>…</strong> to
reduce the width of the output. Also the machine that I’m currently using has 8 cores
so it shows 8 nodes, on your machine you may have a different number of columns for
the node utilization table.
</p><p>
Sayed Ibrahim Hashimi
</p></body>
      <title>MSBuild 4.0: New command line switches</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,6cced95a-0f4a-4740-9dba-03782008d8d3.aspx</guid>
      <link>http://sedodream.com/2010/04/30/MSBuild40NewCommandLineSwitches.aspx</link>
      <pubDate>Fri, 30 Apr 2010 00:38:03 GMT</pubDate>
      <description>If you are using &lt;a href="http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx"&gt;MSBuild
4.0&lt;/a&gt; then you may be interested in knowing that there are a couple new switches
that you can pass to msbuild.exe when you kick off a build. The new switches, &lt;em&gt;&lt;strong&gt;/preprocess(/pp)&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;&lt;strong&gt;/detailedsummary(/ds)&lt;/strong&gt;&lt;/em&gt;,
are more convenient then necessary. 
&lt;h2&gt;/preprocess (/pp)
&lt;/h2&gt;
&lt;p&gt;
Since you can import other MSBuild files using the &lt;a href="http://msdn.microsoft.com/en-us/library/92x05xfs.aspx"&gt;Import
Element&lt;/a&gt; sometimes locating where a target, property or item is being defined can
lead to a search that takes you through several files. It can be even more confusing
if more than 1 file defines the property or target that you are interested in, because
you may have thought that you found the right target but you may one that was overridden
by another file. Now with MSBuild 4.0 you don’t have to search through all of those
files. You can use the switch /preprocess switch. Here is the snippet from msbuild.exe
/? describing it.
&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;/preprocess[:file] 
 Creates a single, aggregated project file by inlining all the files that would be imported during a build, with their boundaries marked. This can be useful for figuring out what files are being imported and from where, and what they will contribute to the build. By default the output is written to the console window. If the path to an output file is provided that will be used instead.
 (Short form: /pp)
 Example:
   /pp:out.txt&lt;/pre&gt;
&lt;p&gt;
When you use this the full logical project file is dumped to the console, or optionally
to a file, and it includes references to where the elements are defined. For example
I created the following very simple project files.
&lt;/p&gt;
&lt;h3&gt;import-01.proj
&lt;/h3&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
    &amp;lt;Target Name=&amp;quot;TargetOne&amp;quot;&amp;gt;
        &amp;lt;Message Text=&amp;quot;From import-02.proj - TargetOne&amp;quot;/&amp;gt;
    &amp;lt;/Target&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;h3&gt;import-02.proj
&lt;/h3&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
    &amp;lt;Target Name=&amp;quot;TargetTwo&amp;quot;&amp;gt;
        &amp;lt;Message Text=&amp;quot;From import-02.proj - TargetTwo&amp;quot;/&amp;gt;
    &amp;lt;/Target&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;h3&gt;master.proj
&lt;/h3&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; DefaultTargets=&amp;quot;TargetOne;TargetTwo&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;

    &amp;lt;Target Name=&amp;quot;TargetOne&amp;quot;&amp;gt;
        &amp;lt;Message Text=&amp;quot;From master.proj - TargetOne&amp;quot;/&amp;gt;
    &amp;lt;/Target&amp;gt;

    &amp;lt;Target Name=&amp;quot;TargetTwo&amp;quot;&amp;gt;
        &amp;lt;Message Text=&amp;quot;From master.proj - TargetTwo&amp;quot;/&amp;gt;
    &amp;lt;/Target&amp;gt;

    &amp;lt;Import Project=&amp;quot;import-01.proj&amp;quot;/&amp;gt;
    &amp;lt;Import Project=&amp;quot;import-02.proj&amp;quot;/&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
After executing the command msbuild.exe master.proj /pp:out.xml the following was
written to the out.xml file.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;!--
============================================================================================================================================
C:\temp\MSBuild\import\master.proj
============================================================================================================================================
--&amp;gt;
&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; DefaultTargets=&amp;quot;TargetOne;TargetTwo&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
  &amp;lt;Target Name=&amp;quot;TargetOne&amp;quot;&amp;gt;
    &amp;lt;Message Text=&amp;quot;From master.proj - TargetOne&amp;quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;
  &amp;lt;Target Name=&amp;quot;TargetTwo&amp;quot;&amp;gt;
    &amp;lt;Message Text=&amp;quot;From master.proj - TargetTwo&amp;quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;
  &amp;lt;!--
============================================================================================================================================
  &amp;lt;Import Project=&amp;quot;import-01.proj&amp;quot;&amp;gt;

C:\temp\MSBuild\import\import-01.proj
============================================================================================================================================
--&amp;gt;
  &amp;lt;Target Name=&amp;quot;TargetOne&amp;quot;&amp;gt;
    &amp;lt;Message Text=&amp;quot;From import-02.proj - TargetOne&amp;quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;
  &amp;lt;!--
============================================================================================================================================
  &amp;lt;/Import&amp;gt;

C:\temp\MSBuild\import\master.proj
============================================================================================================================================
--&amp;gt;
  &amp;lt;!--
============================================================================================================================================
  &amp;lt;Import Project=&amp;quot;import-02.proj&amp;quot;&amp;gt;

C:\temp\MSBuild\import\import-02.proj
============================================================================================================================================
--&amp;gt;
  &amp;lt;Target Name=&amp;quot;TargetTwo&amp;quot;&amp;gt;
    &amp;lt;Message Text=&amp;quot;From import-02.proj - TargetTwo&amp;quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;
  &amp;lt;!--
============================================================================================================================================
  &amp;lt;/Import&amp;gt;

C:\temp\MSBuild\import\master.proj
============================================================================================================================================
--&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
As you can see with /pp it is very easy to see exactly what is defined where and at
what location.
&lt;/p&gt;
&lt;h2&gt;/detailedsummary (/ds)
&lt;/h2&gt;
&lt;p&gt;
Another new feature with MSBuild 4.0 is the &lt;strong&gt;&lt;em&gt;/detailedsummary (/ds)&lt;/em&gt;&lt;/strong&gt; command
line switch. When you use this switch you will be shown a detailed summary (&lt;em&gt;haha&lt;/em&gt;)
of build execution. This summary includes the amount of time spent build each project
file as well as the node utilization. I just preformed a build with the command &lt;strong&gt;msbuild
RuleStack.Engine.sln /m /ds&lt;/strong&gt; and the summary is shown below.
&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;============================== Build Hierarchy (IDs represent configurations) =====================================================
 Id                  : Exclusive Time   Total Time   Path (Targets)
 -----------------------------------------------------------------------------------------------------------------------------------
 0                   : 0.020s           1.211s       C:\...\RuleStack.Engine.sln ()
 | 1                 : 0.667s           0.667s       C:\...\RuleStack.Engine.Common\RuleStack.Engine.Common.csproj ()
 | 3                 : 0.255s           0.718s       C:\...\Unittest\RuleStack.Engine.Tests\RuleStack.Engine.Tests.csproj ()
 | | 6               : 0.000s           0.000s       C:\...\ObjectBinder\RuleStack.ObjectBinder\RuleStack.ObjectBinder .csproj ()
 | | 5               : 0.000s           0.000s       C:\...\RuleStack.Data\RuleStack.Data.csproj ()
 | | 1               : 0.000s           0.000s       C:\...\RuleStack.Engine.Common\RuleStack.Engine.Common.csproj ()
 | | 2               : 0.000s           0.000s       C:\...\RuleStack.Engine.Backend\RuleStack.Engine.Backend.csproj ( )
 | | 8               : 0.292s           0.460s       C:\...\RuleStack.Engine.Admin.Web\RuleStack.Engine.Admin.Web.csproj ()
 | | | 24            : 0.000s           0.000s       C:\...\RuleStack.Engine.Backend\RuleStack.Engine.Backend.csproj ( GetNativeManifest)
 | | | 5             : 0.000s           0.000s       C:\...\RuleStack.Data\RuleStack.Data.csproj ()
 | | . 2             : 0.000s           0.000s       C:\...\RuleStack.Engine.Backend\RuleStack.Engine.Backend.csproj ( )
 | . 36              : 0.003s           0.003s       C:\...\RuleStack.Engine.Admin.Web\RuleStack.Engine.Admin.Web.csproj (GetNativeManifest)
 | 2                 : 0.319s           0.390s       C:\...\RuleStack.Engine.Backend\RuleStack.Engine.Backend.csproj ( )
 | | 6               : 0.000s           0.000s       C:\...\ObjectBinder\RuleStack.ObjectBinder\RuleStack.ObjectBinder.csproj ()
 | | 5               : 0.000s           0.000s       C:\...\RuleStack.Data\RuleStack.Data.csproj ()
 | | 17              : 0.002s           0.002s       C:\...\RuleStack.Data\RuleStack.Data.csproj (GetNativeManifest)
 | . 21              : 0.001s           0.001s       C:\...\RuleStack.Data\RuleStack.Data.csproj (GetCopyToOutputDirectoryItems)
 | 4                 : 0.382s           0.567s       C:\...\RuleStack.Services\RuleStack.Services.csproj ()
 | | 5               : 0.000s           0.000s       C:\...\RuleStack.Data\RuleStack.Data.csproj ()
 | | 2               : 0.000s           0.000s       C:\...\RuleStack.Engine.Backend\RuleStack.Engine.Backend.csproj ( )
 | | 24              : 0.002s           0.002s       C:\...\RuleStack.Engine.Backend\RuleStack.Engine.Backend.csproj ( GetNativeManifest)
 | . 29              : 0.001s           0.001s       C:\...\RuleStack.Engine.Backend\RuleStack.Engine.Backend.csproj ( GetCopyToOutputDirectoryItems)
 | 7                 : 0.333s           0.337s       C:\...\ObjectBinder\Test_RuleStack.ObjectBinder\Test_RuleStack.ObjectBinder.csproj ()
 | | 6               : 0.000s           0.000s       C:\...\ObjectBinder\RuleStack.ObjectBinder\RuleStack.ObjectBinder.csproj ()
 | | 13              : 0.001s           0.001s       C:\...\ObjectBinder\RuleStack.ObjectBinder\RuleStack.ObjectBinder.csproj (GetNativeManifest)
 | . 19              : 0.001s           0.001s       C:\...\ObjectBinder\RuleStack.ObjectBinder\RuleStack.ObjectBinder.csproj (GetCopyToOutputDirectoryItems)
 | 6                 : 0.210s           0.210s       C:\...\ObjectBinder\RuleStack.ObjectBinder\RuleStack.ObjectBinder.csproj ()
 | 5                 : 0.277s           0.277s       C:\...\RuleStack.Data\RuleStack.Data.csproj ()
 | . 12              : 0.000s           0.000s       C:\...\RuleStack.Engine.Common\RuleStack.Engine.Common.csproj (GetNativeManifest)
 . 43                : 0.002s           0.002s       C:\...\RuleStack.Engine.Admin.Web\RuleStack.Engine.Admin.Web.csproj.metaproj ()

 ============================== Node Utilization (IDs represent configurations) ====================================================
 Timestamp:            1       2       3       4       5       6       7       8        Duration   Cumulative
 -----------------------------------------------------------------------------------------------------------------------------------
 634081842447519669:   0       x       x       x       x       x       x       x        0.018s     0.018s
 634081842447699679:   1       x       x       x       x       x       x       x        0.461s     0.479s #########
 634081842452309943:   |       6       7       5       3       4       2       x        0.130s     0.609s ##
 634081842453610018:   |       |       |       |       8       |       |       x        0.086s     0.695s #
 634081842454470067:   |       |       |       |       |       |       |       x        0.001s     0.696s
 634081842454480067:   x       |       |       |       |       |       |       x        0.001s     0.697s
 634081842454490068:   x       |       x       |       |       x       |       x        0.001s     0.698s
 634081842454500068:   x       |       x       |       |       x       x       x        0.001s     0.699s
 634081842454510069:   x       x       7       |       |       x       x       x        0.002s     0.701s
 634081842454530070:   12      x       |       |       |       x       x       x        0.002s     0.703s
 634081842454550071:   |       13      x       |       |       x       x       x        0.001s     0.704s
 634081842454560072:   |       x       7       |       |       x       x       x        0.008s     0.712s
 634081842454640076:   |       x       |       |       x       x       x       x        0.054s     0.766s #
 634081842455180107:   |       x       |       x       x       x       2       x        0.003s     0.769s
 634081842455210109:   |       x       |       17      x       x       x       x        0.002s     0.771s
 634081842455230110:   |       x       |       x       x       x       2       x        0.036s     0.807s
 634081842455590131:   |       19      x       x       x       x       |       x        0.001s     0.808s
 634081842455600131:   |       x       7       x       x       x       |       x        0.018s     0.826s
 634081842455780142:   |       x       x       x       x       x       |       x        0.036s     0.862s
 634081842456140162:   |       x       x       21      x       x       x       x        0.001s     0.863s
 634081842456150163:   |       x       x       x       x       x       2       x        0.016s     0.879s
 634081842456310172:   |       x       x       x       8       4       x       x        0.003s     0.882s
 634081842456340174:   |       x       x       x       |       x       24      x        0.001s     0.883s
 634081842456350174:   |       x       x       x       x       x       |       x        0.001s     0.884s
 634081842456360175:   |       x       x       x       8       4       x       x        0.148s     1.032s ##
 634081842457840259:   |       x       x       x       |       x       29      x        0.001s     1.033s
 634081842457850260:   |       x       x       x       |       4       x       x        0.023s     1.056s
 634081842458080273:   |       x       x       x       |       x       x       x        0.013s     1.069s
 634081842458210281:   |       x       x       x       3       x       x       x        0.004s     1.073s
 634081842458250283:   |       x       x       x       36      x       x       x        0.003s     1.076s
 634081842458280285:   |       x       x       x       3       x       x       x        0.131s     1.207s ##
 634081842459590360:   0       x       x       x       x       x       x       x        0.001s     1.208s
 634081842459600360:   43      x       x       x       x       x       x       x        0.002s     1.210s
 634081842459620361:   0       x       x       x       x       x       x       x        0.001s     1.211s
 -----------------------------------------------------------------------------------------------------------------------------------
 Utilization:          57.8    30.3    46.9    39.6    76.5    53.6    45.4    .0       Average Utilization: 43.8&lt;/pre&gt;
&lt;p&gt;
In the snippet above you should know that I replace the path to the files with &lt;strong&gt;…&lt;/strong&gt; to
reduce the width of the output. Also the machine that I’m currently using has 8 cores
so it shows 8 nodes, on your machine you may have a different number of columns for
the node utilization table.
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,6cced95a-0f4a-4740-9dba-03782008d8d3.aspx</comments>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=ff6dfe05-99e8-421b-aedd-d57babdeed66</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,ff6dfe05-99e8-421b-aedd-d57babdeed66.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,ff6dfe05-99e8-421b-aedd-d57babdeed66.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=ff6dfe05-99e8-421b-aedd-d57babdeed66</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
If you are using Visual Studio 2010 then you may already be familiar with the <a href="http://msdn.microsoft.com/en-us/library/dd465326.aspx">Web.config
transformations</a> that are now available. What you might not know is that you can
use that same technology to transform config files outside of the build process. You
will need Visual Studio 2010 installed on the machine where you perform these transformations.
It is very easy to perform these transformation as well. Let’s say that we start with
the app.config file shown below.
</p>
        <pre class="brush: xml;">&lt;configuration&gt;
    &lt;connectionStrings&gt;
        &lt;clear/&gt;
        &lt;add name="Default" connectionString="Data Source=localhost;Initial Catalog=Sample01;Integrated Security=True;" /&gt;
    &lt;/connectionStrings&gt;
    
    &lt;appSettings&gt;
        &lt;add key="contactEmail" value="contact@demo.example.com"/&gt;
        &lt;add key="siteUrl" value="http://demo.example.com"/&gt;
    &lt;/appSettings&gt;
    
&lt;/configuration&gt;</pre>
        <p>
Then we create another file, transform.xml, which contains our transformations. That
file is shown below.
</p>
        <pre class="brush: xml;">&lt;configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"&gt;
    &lt;connectionStrings&gt;
        &lt;clear/&gt;
        &lt;add name="Default" connectionString="Data Source=NOT-localhost;Initial Catalog=Sample01;Integrated Security=True;" 
             xdt:Locator="Match(name)" xdt:Transform="Replace"/&gt;
    &lt;/connectionStrings&gt;

    &lt;appSettings&gt;
        &lt;add key="contactEmail" value="contact@example.com" xdt:Locator="Match(key)" xdt:Transform="Replace"/&gt;
        &lt;add key="siteUrl" value="http://example.com" xdt:Locator="Match(key)" xdt:Transform="Replace"/&gt;
    &lt;/appSettings&gt;

&lt;/configuration&gt;</pre>
        <p>
Then we can easily execute the transformations by using MSBuild. So I created a file
named trans.proj and it is shown below.
</p>
        <pre class="brush: xml;">&lt;Project ToolsVersion="4.0" DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
    &lt;UsingTask TaskName="TransformXml"
             AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/&gt;

    &lt;Target Name="Demo"&gt;
        &lt;TransformXml Source="app.config"
                      Transform="Transform.xml"
                      Destination="app.prod.config"/&gt;
    &lt;/Target&gt;
&lt;/Project&gt;</pre>
        <p>
This MSBuild file uses the TransformXml task which is shipped with Visual Studio 2010.
We specify the source file, transform file and the destination. Pretty straight forward.
</p>
        <p>
In order to execute this I open a Visual Studio 2010 command prompt, browse to the
directory containing both files, and enter the following command 
</p>
        <pre class="brush: plain;">msbuild trans.proj /t:Demo</pre>
        <p>
Once you do this then you will find the file app.prod.config with the following contents.
</p>
        <pre class="brush: xml;">&lt;configuration&gt;
    &lt;connectionStrings&gt;
        &lt;clear/&gt;
        &lt;add name="Default" connectionString="Data Source=NOT-localhost;Initial Catalog=Sample01;Integrated Security=True;"/&gt;
    &lt;/connectionStrings&gt;
    
    &lt;appSettings&gt;
        &lt;add key="contactEmail" value="contact@example.com"/&gt;
        &lt;add key="siteUrl" value="http://example.com"/&gt;
    &lt;/appSettings&gt;
    
&lt;/configuration&gt;</pre>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>Config transformations outside of web app builds</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,ff6dfe05-99e8-421b-aedd-d57babdeed66.aspx</guid>
      <link>http://sedodream.com/2010/04/26/ConfigTransformationsOutsideOfWebAppBuilds.aspx</link>
      <pubDate>Mon, 26 Apr 2010 04:22:06 GMT</pubDate>
      <description>&lt;p&gt;
If you are using Visual Studio 2010 then you may already be familiar with the &lt;a href="http://msdn.microsoft.com/en-us/library/dd465326.aspx"&gt;Web.config
transformations&lt;/a&gt; that are now available. What you might not know is that you can
use that same technology to transform config files outside of the build process. You
will need Visual Studio 2010 installed on the machine where you perform these transformations.
It is very easy to perform these transformation as well. Let’s say that we start with
the app.config file shown below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;configuration&amp;gt;
    &amp;lt;connectionStrings&amp;gt;
        &amp;lt;clear/&amp;gt;
        &amp;lt;add name=&amp;quot;Default&amp;quot; connectionString=&amp;quot;Data Source=localhost;Initial Catalog=Sample01;Integrated Security=True;&amp;quot; /&amp;gt;
    &amp;lt;/connectionStrings&amp;gt;
    
    &amp;lt;appSettings&amp;gt;
        &amp;lt;add key=&amp;quot;contactEmail&amp;quot; value=&amp;quot;contact@demo.example.com&amp;quot;/&amp;gt;
        &amp;lt;add key=&amp;quot;siteUrl&amp;quot; value=&amp;quot;http://demo.example.com&amp;quot;/&amp;gt;
    &amp;lt;/appSettings&amp;gt;
    
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Then we create another file, transform.xml, which contains our transformations. That
file is shown below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;configuration xmlns:xdt=&amp;quot;http://schemas.microsoft.com/XML-Document-Transform&amp;quot;&amp;gt;
    &amp;lt;connectionStrings&amp;gt;
        &amp;lt;clear/&amp;gt;
        &amp;lt;add name=&amp;quot;Default&amp;quot; connectionString=&amp;quot;Data Source=NOT-localhost;Initial Catalog=Sample01;Integrated Security=True;&amp;quot; 
             xdt:Locator=&amp;quot;Match(name)&amp;quot; xdt:Transform=&amp;quot;Replace&amp;quot;/&amp;gt;
    &amp;lt;/connectionStrings&amp;gt;

    &amp;lt;appSettings&amp;gt;
        &amp;lt;add key=&amp;quot;contactEmail&amp;quot; value=&amp;quot;contact@example.com&amp;quot; xdt:Locator=&amp;quot;Match(key)&amp;quot; xdt:Transform=&amp;quot;Replace&amp;quot;/&amp;gt;
        &amp;lt;add key=&amp;quot;siteUrl&amp;quot; value=&amp;quot;http://example.com&amp;quot; xdt:Locator=&amp;quot;Match(key)&amp;quot; xdt:Transform=&amp;quot;Replace&amp;quot;/&amp;gt;
    &amp;lt;/appSettings&amp;gt;

&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Then we can easily execute the transformations by using MSBuild. So I created a file
named trans.proj and it is shown below.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; DefaultTargets=&amp;quot;Demo&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
    &amp;lt;UsingTask TaskName=&amp;quot;TransformXml&amp;quot;
             AssemblyFile=&amp;quot;$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll&amp;quot;/&amp;gt;

    &amp;lt;Target Name=&amp;quot;Demo&amp;quot;&amp;gt;
        &amp;lt;TransformXml Source=&amp;quot;app.config&amp;quot;
                      Transform=&amp;quot;Transform.xml&amp;quot;
                      Destination=&amp;quot;app.prod.config&amp;quot;/&amp;gt;
    &amp;lt;/Target&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
This MSBuild file uses the TransformXml task which is shipped with Visual Studio 2010.
We specify the source file, transform file and the destination. Pretty straight forward.
&lt;/p&gt;
&lt;p&gt;
In order to execute this I open a Visual Studio 2010 command prompt, browse to the
directory containing both files, and enter the following command 
&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;msbuild trans.proj /t:Demo&lt;/pre&gt;
&lt;p&gt;
Once you do this then you will find the file app.prod.config with the following contents.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;configuration&amp;gt;
    &amp;lt;connectionStrings&amp;gt;
        &amp;lt;clear/&amp;gt;
        &amp;lt;add name=&amp;quot;Default&amp;quot; connectionString=&amp;quot;Data Source=NOT-localhost;Initial Catalog=Sample01;Integrated Security=True;&amp;quot;/&amp;gt;
    &amp;lt;/connectionStrings&amp;gt;
    
    &amp;lt;appSettings&amp;gt;
        &amp;lt;add key=&amp;quot;contactEmail&amp;quot; value=&amp;quot;contact@example.com&amp;quot;/&amp;gt;
        &amp;lt;add key=&amp;quot;siteUrl&amp;quot; value=&amp;quot;http://example.com&amp;quot;/&amp;gt;
    &amp;lt;/appSettings&amp;gt;
    
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,ff6dfe05-99e8-421b-aedd-d57babdeed66.aspx</comments>
      <category>Config-Transformation</category>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
      <category>MSDeploy</category>
      <category>Visual Studio</category>
      <category>Visual Studio 2010</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=451c1d2e-3949-4e56-b226-14108cc5d184</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,451c1d2e-3949-4e56-b226-14108cc5d184.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,451c1d2e-3949-4e56-b226-14108cc5d184.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=451c1d2e-3949-4e56-b226-14108cc5d184</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I recently answered a question on stackoverflow.com <a href="http://stackoverflow.com/questions/2472183/replace-sln-with-msbuild-and-wrap-contained-projects-into-targets">Replace
.sln with MSBuild and wrap contained projects into targets</a> and wanted to share
that content here as well. I’ll expand a bit more on it here.
</p>
        <p>
A couple common questions that I’m frequently asked include
</p>
        <ol>
          <li>
Should I use solution files for public builds 
</li>
          <li>
How can I replace a solution file with an MSBuild file 
</li>
        </ol>
        <p>
My answer for 1 is that I never use .sln files for any public build. I always create
my own build file and use that. My take on solution files is that they are for developer
convince for use in Visual Studio only. If you disagree, you are not alone.
</p>
        <p>
Replacing a solution file with an MSBuild file is pretty easy, you just create an
MSBuild file to build your projects. You will do that by using the <a href="http://msdn.microsoft.com/en-us/library/z7f65y0d.aspx">MSBuild
task</a>. Now if you want to create a reusable .targets file (or set of .targets files)
then this is a bit more involved, but makes it easier on you in the long haul.
</p>
        <p>
I wrote about 20 pages on creating reusable .targets files in my <a href="http://rads.stackoverflow.com/amzn/click/0735626286">book</a>,
but I'll get you started here with the basics here. I believe that the key to creating
reusable build scripts (i.e. .targets files) is three elements:
</p>
        <ul>
          <li>
Place behavior (<em>i.e. targets</em>) into separate files 
</li>
          <li>
Place data (<em>i.e. properties and items, these are called .proj files</em>) into
their own files 
</li>
          <li>
Extensibility 
</li>
          <li>
.targets files should validate assumptions 
</li>
        </ul>
        <p>
The idea is that you want to place all of your targets into separate files and then
these files will be imported by the files which will be driving the build process.
These are the files which contain the data. Since you import the .targets files you
get all the targets as if they had been defined inline. There will be a silent contract
between the .proj and .targets files. This contract is defined in properties and items
which both use. This is what needs to be validated.
</p>
        <p>
The idea here is not new. This pattern is followed by .csproj (and other projects
generated by Visual Studio). If you take a look your .csproj file you will not find
a single target, just properties and items. Then towards the bottom of the file it
imports Microsoft.csharp.targets (<em>may differ depending on project type</em>).
This project file (<em>along with others that it imports</em>) contains all the targets
which actually perform the build.
</p>
        <p>
So it's layed out like this:
</p>
        <ul>
          <li>
SharedBuild.targets 
</li>
          <li>
MyProduct.proj 
</li>
        </ul>
        <p>
Where <strong>MyProdcut.proj</strong> might look like:
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
  &lt;!-- This uses a .targets file to off load performing the build --&gt;
  &lt;PropertyGroup&gt;
    &lt;Configuration Condition=" '$(Configuration)'=='' "&gt;Release&lt;/Configuration&gt;
    &lt;OutputPath Condition=" '$(OutputPath)'=='' "&gt;$(MSBuildProjectDirectory)\BuildArtifacts\bin\&lt;/OutputPath&gt;
  &lt;/PropertyGroup&gt;

  &lt;ItemGroup&gt;
    &lt;Projects Include="$(MSBuildProjectDirectory)\..\ClassLibrary1\ClassLibrary1.csproj"/&gt;
    &lt;Projects Include="$(MSBuildProjectDirectory)\..\ClassLibrary2\ClassLibrary2.csproj"/&gt;
    &lt;Projects Include="$(MSBuildProjectDirectory)\..\ClassLibrary3\ClassLibrary3.csproj"/&gt;
    &lt;Projects Include="$(MSBuildProjectDirectory)\..\WindowsFormsApplication1\WindowsFormsApplication1.csproj"/&gt;
  &lt;/ItemGroup&gt;

  &lt;Import Project="SharedBuild.targets"/&gt;
&lt;/Project&gt;</pre>
        <p>
And <strong>SharedBuild.targets</strong> might look like:
</p>
        <pre class="brush: xml;">&lt;Project  DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
  &lt;!-- This represents a re-usable build file --&gt;
  &lt;Target Name="SharedBuild_Validate"&gt;
    &lt;!-- See http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx for more info
         about this validation pattern
    --&gt;
    &lt;ItemGroup&gt;
      &lt;_RequiredProperties Include ="Configuration"&gt;
          &lt;Value&gt;$(Configuration)&lt;/Value&gt;
      &lt;/_RequiredProperties&gt;    
      &lt;_RequiredProperties Include ="OutputPath"&gt;
          &lt;Value&gt;$(OutputPath)&lt;/Value&gt;
      &lt;/_RequiredProperties&gt;
      
      &lt;_RequiredItems Include="Projects"&gt;
        &lt;RequiredValue&gt;%(Projects.Identity)&lt;/RequiredValue&gt;
        &lt;RequiredFilePath&gt;%(Projects.Identity)&lt;/RequiredFilePath&gt;
      &lt;/_RequiredItems&gt;
    &lt;/ItemGroup&gt;

    &lt;!-- Raise an error if any value in _RequiredProperties is missing --&gt;
    &lt;Error Condition="'%(_RequiredProperties.Value)'==''"
           Text="Missing required property [%(_RequiredProperties.Identity)]"/&gt;

    &lt;!-- Raise an error if any value in _RequiredItems is empty --&gt;
    &lt;Error Condition="'%(_RequiredItems.RequiredValue)'==''"
           Text="Missing required item value [%(_RequiredItems.Identity)]" /&gt;

    &lt;!-- Validate any file/directory that should exist --&gt;
    &lt;Error Condition="'%(_RequiredItems.RequiredFilePath)' != '' and !Exists('%(_RequiredItems.RequiredFilePath)')"
           Text="Unable to find expeceted path [%(_RequiredItems.RequiredFilePath)] on item [%(_RequiredItems.Identity)]" /&gt;
  &lt;/Target&gt;

  &lt;PropertyGroup&gt;
    &lt;BuildDependsOn&gt;
      SharedBuild_Validate;
      BeforeBuild;
      CoreBuild;
      AfterBuild;
    &lt;/BuildDependsOn&gt;
  &lt;/PropertyGroup&gt;
  &lt;Target Name="Build" DependsOnTargets="$(BuildDependsOn)"/&gt;
  &lt;Target Name="BeforeBuild"/&gt;
  &lt;Target Name="AfterBuild"/&gt;
  &lt;Target Name="CoreBuild"&gt;
    &lt;!-- Make sure output folder exists --&gt;
    &lt;PropertyGroup&gt;
      &lt;_FullOutputPath&gt;$(OutputPath)$(Configuration)\&lt;/_FullOutputPath&gt;
    &lt;/PropertyGroup&gt;
    &lt;MakeDir Directories="$(_FullOutputPath)"/&gt;
    &lt;MSBuild Projects="@(Projects)"
             BuildInParallel="true"
             Properties="OutputPath=$(_FullOutputPath)"/&gt;
  &lt;/Target&gt;
&lt;/Project&gt;</pre>
        <p>
Don't look too much at the <code>SharedBuild_Validate</code> target yet. I put that
there for completeness but don't focus on it. You can find more info on that at my
blog at <a href="http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx">http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx</a>.
</p>
        <p>
The important parts to notice are the extensibility points. Even though this is a
very basic file, it has all the components of a reusable .targets file. You can customize
it's behavior by passing in different properties and items to build. You can extend
it's behavior by overriding a target (<code>BeforeBuild</code>, <code>AfterBuild</code> or
even <code>CoreBuild</code>) and you can inject your own targets into the build with:
</p>
        <pre class="brush: xml;">&lt;Project ...&gt;
   ...
  &lt;Import Project="SharedBuild.targets"/&gt;
  &lt;PropertyGroup&gt;
    &lt;BuildDependsOn&gt;
      $(BuildDependsOn);
      CustomAfterBuild
    &lt;/BuildDependsOn&gt;
  &lt;/PropertyGroup&gt;
  &lt;Target Name="CustomAfterBuild"&gt;
    &lt;!-- Insert stuff here --&gt;
  &lt;/Target&gt;
&lt;/Project&gt;</pre>
        <p>
So this is the basics on how to create reusable build scripts which can help you easily
create .proj files to replace your .sln files. I also recently answered. a related
question <a href="http://stackoverflow.com/questions/2454663/make-a-target-run-once-at-the-solution-level-in-msbuild">Make
a target run once at the Solution level in MSBuild</a>. 
</p>
        <p align="left">
          <font size="3">This samples for this are using <strong><u>Visual Studio 2010 RC</u></strong> You
can download the samples for this at </font>
          <a title="http://sedotech.com/Content/files/ReplaceSlnFile.zip" href="http://sedotech.com/Content/files/ReplaceSlnFile.zip">
            <font size="3">http://sedotech.com/Content/files/ReplaceSlnFile.zip</font>
          </a>
          <font size="3">
          </font>
        </p>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>Replacing solution files with MSBuild Files</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,451c1d2e-3949-4e56-b226-14108cc5d184.aspx</guid>
      <link>http://sedodream.com/2010/03/19/ReplacingSolutionFilesWithMSBuildFiles.aspx</link>
      <pubDate>Fri, 19 Mar 2010 04:16:06 GMT</pubDate>
      <description>&lt;p&gt;
I recently answered a question on stackoverflow.com &lt;a href="http://stackoverflow.com/questions/2472183/replace-sln-with-msbuild-and-wrap-contained-projects-into-targets"&gt;Replace
.sln with MSBuild and wrap contained projects into targets&lt;/a&gt; and wanted to share
that content here as well. I’ll expand a bit more on it here.
&lt;/p&gt;
&lt;p&gt;
A couple common questions that I’m frequently asked include
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Should I use solution files for public builds 
&lt;/li&gt;
&lt;li&gt;
How can I replace a solution file with an MSBuild file 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
My answer for 1 is that I never use .sln files for any public build. I always create
my own build file and use that. My take on solution files is that they are for developer
convince for use in Visual Studio only. If you disagree, you are not alone.
&lt;/p&gt;
&lt;p&gt;
Replacing a solution file with an MSBuild file is pretty easy, you just create an
MSBuild file to build your projects. You will do that by using the &lt;a href="http://msdn.microsoft.com/en-us/library/z7f65y0d.aspx"&gt;MSBuild
task&lt;/a&gt;. Now if you want to create a reusable .targets file (or set of .targets files)
then this is a bit more involved, but makes it easier on you in the long haul.
&lt;/p&gt;
&lt;p&gt;
I wrote about 20 pages on creating reusable .targets files in my &lt;a href="http://rads.stackoverflow.com/amzn/click/0735626286"&gt;book&lt;/a&gt;,
but I'll get you started here with the basics here. I believe that the key to creating
reusable build scripts (i.e. .targets files) is three elements:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Place behavior (&lt;em&gt;i.e. targets&lt;/em&gt;) into separate files 
&lt;/li&gt;
&lt;li&gt;
Place data (&lt;em&gt;i.e. properties and items, these are called .proj files&lt;/em&gt;) into
their own files 
&lt;/li&gt;
&lt;li&gt;
Extensibility 
&lt;/li&gt;
&lt;li&gt;
.targets files should validate assumptions 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The idea is that you want to place all of your targets into separate files and then
these files will be imported by the files which will be driving the build process.
These are the files which contain the data. Since you import the .targets files you
get all the targets as if they had been defined inline. There will be a silent contract
between the .proj and .targets files. This contract is defined in properties and items
which both use. This is what needs to be validated.
&lt;/p&gt;
&lt;p&gt;
The idea here is not new. This pattern is followed by .csproj (and other projects
generated by Visual Studio). If you take a look your .csproj file you will not find
a single target, just properties and items. Then towards the bottom of the file it
imports Microsoft.csharp.targets (&lt;em&gt;may differ depending on project type&lt;/em&gt;).
This project file (&lt;em&gt;along with others that it imports&lt;/em&gt;) contains all the targets
which actually perform the build.
&lt;/p&gt;
&lt;p&gt;
So it's layed out like this:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
SharedBuild.targets 
&lt;/li&gt;
&lt;li&gt;
MyProduct.proj 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Where &lt;strong&gt;MyProdcut.proj&lt;/strong&gt; might look like:
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;Project DefaultTargets=&amp;quot;Build&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
  &amp;lt;!-- This uses a .targets file to off load performing the build --&amp;gt;
  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;Configuration Condition=&amp;quot; '$(Configuration)'=='' &amp;quot;&amp;gt;Release&amp;lt;/Configuration&amp;gt;
    &amp;lt;OutputPath Condition=&amp;quot; '$(OutputPath)'=='' &amp;quot;&amp;gt;$(MSBuildProjectDirectory)\BuildArtifacts\bin\&amp;lt;/OutputPath&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;

  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;Projects Include=&amp;quot;$(MSBuildProjectDirectory)\..\ClassLibrary1\ClassLibrary1.csproj&amp;quot;/&amp;gt;
    &amp;lt;Projects Include=&amp;quot;$(MSBuildProjectDirectory)\..\ClassLibrary2\ClassLibrary2.csproj&amp;quot;/&amp;gt;
    &amp;lt;Projects Include=&amp;quot;$(MSBuildProjectDirectory)\..\ClassLibrary3\ClassLibrary3.csproj&amp;quot;/&amp;gt;
    &amp;lt;Projects Include=&amp;quot;$(MSBuildProjectDirectory)\..\WindowsFormsApplication1\WindowsFormsApplication1.csproj&amp;quot;/&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;

  &amp;lt;Import Project=&amp;quot;SharedBuild.targets&amp;quot;/&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
And &lt;strong&gt;SharedBuild.targets&lt;/strong&gt; might look like:
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Project  DefaultTargets=&amp;quot;Build&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
  &amp;lt;!-- This represents a re-usable build file --&amp;gt;
  &amp;lt;Target Name=&amp;quot;SharedBuild_Validate&amp;quot;&amp;gt;
    &amp;lt;!-- See http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx for more info
         about this validation pattern
    --&amp;gt;
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;_RequiredProperties Include =&amp;quot;Configuration&amp;quot;&amp;gt;
          &amp;lt;Value&amp;gt;$(Configuration)&amp;lt;/Value&amp;gt;
      &amp;lt;/_RequiredProperties&amp;gt;    
      &amp;lt;_RequiredProperties Include =&amp;quot;OutputPath&amp;quot;&amp;gt;
          &amp;lt;Value&amp;gt;$(OutputPath)&amp;lt;/Value&amp;gt;
      &amp;lt;/_RequiredProperties&amp;gt;
      
      &amp;lt;_RequiredItems Include=&amp;quot;Projects&amp;quot;&amp;gt;
        &amp;lt;RequiredValue&amp;gt;%(Projects.Identity)&amp;lt;/RequiredValue&amp;gt;
        &amp;lt;RequiredFilePath&amp;gt;%(Projects.Identity)&amp;lt;/RequiredFilePath&amp;gt;
      &amp;lt;/_RequiredItems&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;

    &amp;lt;!-- Raise an error if any value in _RequiredProperties is missing --&amp;gt;
    &amp;lt;Error Condition=&amp;quot;'%(_RequiredProperties.Value)'==''&amp;quot;
           Text=&amp;quot;Missing required property [%(_RequiredProperties.Identity)]&amp;quot;/&amp;gt;

    &amp;lt;!-- Raise an error if any value in _RequiredItems is empty --&amp;gt;
    &amp;lt;Error Condition=&amp;quot;'%(_RequiredItems.RequiredValue)'==''&amp;quot;
           Text=&amp;quot;Missing required item value [%(_RequiredItems.Identity)]&amp;quot; /&amp;gt;

    &amp;lt;!-- Validate any file/directory that should exist --&amp;gt;
    &amp;lt;Error Condition=&amp;quot;'%(_RequiredItems.RequiredFilePath)' != '' and !Exists('%(_RequiredItems.RequiredFilePath)')&amp;quot;
           Text=&amp;quot;Unable to find expeceted path [%(_RequiredItems.RequiredFilePath)] on item [%(_RequiredItems.Identity)]&amp;quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;

  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;BuildDependsOn&amp;gt;
      SharedBuild_Validate;
      BeforeBuild;
      CoreBuild;
      AfterBuild;
    &amp;lt;/BuildDependsOn&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
  &amp;lt;Target Name=&amp;quot;Build&amp;quot; DependsOnTargets=&amp;quot;$(BuildDependsOn)&amp;quot;/&amp;gt;
  &amp;lt;Target Name=&amp;quot;BeforeBuild&amp;quot;/&amp;gt;
  &amp;lt;Target Name=&amp;quot;AfterBuild&amp;quot;/&amp;gt;
  &amp;lt;Target Name=&amp;quot;CoreBuild&amp;quot;&amp;gt;
    &amp;lt;!-- Make sure output folder exists --&amp;gt;
    &amp;lt;PropertyGroup&amp;gt;
      &amp;lt;_FullOutputPath&amp;gt;$(OutputPath)$(Configuration)\&amp;lt;/_FullOutputPath&amp;gt;
    &amp;lt;/PropertyGroup&amp;gt;
    &amp;lt;MakeDir Directories=&amp;quot;$(_FullOutputPath)&amp;quot;/&amp;gt;
    &amp;lt;MSBuild Projects=&amp;quot;@(Projects)&amp;quot;
             BuildInParallel=&amp;quot;true&amp;quot;
             Properties=&amp;quot;OutputPath=$(_FullOutputPath)&amp;quot;/&amp;gt;
  &amp;lt;/Target&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Don't look too much at the &lt;code&gt;SharedBuild_Validate&lt;/code&gt; target yet. I put that
there for completeness but don't focus on it. You can find more info on that at my
blog at &lt;a href="http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx"&gt;http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
The important parts to notice are the extensibility points. Even though this is a
very basic file, it has all the components of a reusable .targets file. You can customize
it's behavior by passing in different properties and items to build. You can extend
it's behavior by overriding a target (&lt;code&gt;BeforeBuild&lt;/code&gt;, &lt;code&gt;AfterBuild&lt;/code&gt; or
even &lt;code&gt;CoreBuild&lt;/code&gt;) and you can inject your own targets into the build with:
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Project ...&amp;gt;
   ...
  &amp;lt;Import Project=&amp;quot;SharedBuild.targets&amp;quot;/&amp;gt;
  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;BuildDependsOn&amp;gt;
      $(BuildDependsOn);
      CustomAfterBuild
    &amp;lt;/BuildDependsOn&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
  &amp;lt;Target Name=&amp;quot;CustomAfterBuild&amp;quot;&amp;gt;
    &amp;lt;!-- Insert stuff here --&amp;gt;
  &amp;lt;/Target&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
So this is the basics on how to create reusable build scripts which can help you easily
create .proj files to replace your .sln files. I also recently answered. a related
question &lt;a href="http://stackoverflow.com/questions/2454663/make-a-target-run-once-at-the-solution-level-in-msbuild"&gt;Make
a target run once at the Solution level in MSBuild&lt;/a&gt;. 
&lt;/p&gt;
&lt;p align="left"&gt;
&lt;font size="3"&gt;This samples for this are using &lt;strong&gt;&lt;u&gt;Visual Studio 2010 RC&lt;/u&gt;&lt;/strong&gt; You
can download the samples for this at &lt;/font&gt;&lt;a title="http://sedotech.com/Content/files/ReplaceSlnFile.zip" href="http://sedotech.com/Content/files/ReplaceSlnFile.zip"&gt;&lt;font size="3"&gt;http://sedotech.com/Content/files/ReplaceSlnFile.zip&lt;/font&gt;&lt;/a&gt;&lt;font size="3"&gt; &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,451c1d2e-3949-4e56-b226-14108cc5d184.aspx</comments>
      <category>MSBuild</category>
      <category>Visual</category>
      <category>Visual Studio</category>
      <category>Visual Studio 2010</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=6d42739d-227e-472c-a94a-60a7875ea6cb</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,6d42739d-227e-472c-a94a-60a7875ea6cb.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,6d42739d-227e-472c-a94a-60a7875ea6cb.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=6d42739d-227e-472c-a94a-60a7875ea6cb</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A while back I wrote about <a href="http://sedodream.com/2008/06/09/MSBuildReservedProperties.aspx">Reserved
Properties in MSBuild 3.5</a>, now its time to update that post to include reserved
properties for MSBuild 4.0. There are a number of new properties here is the list:
</p>
        <p>
•    MSBuild 
<br />
•    MSBuildBinPath 
<br />
•    MSBuildExtensionsPath 
<br />
•    MSBuildExtensionsPath32 
<br />
•    MSBuildExtensionsPath64 
<br />
•    MSBuildLastTaskResult 
<br />
•    MSBuildNodeCount 
<br />
•    MSBuildOverrideTasksPath 
<br />
•    MSBuildProgramFiles32 
<br />
•    MSBuildProjectDefaultTargets 
<br />
•    MSBuildProjectDirectory 
<br />
•    MSBuildProjectDirectoryNoRoot 
<br />
•    MSBuildProjectExtension 
<br />
•    MSBuildProjectFile 
<br />
•    MSBuildProjectFullPath 
<br />
•    MSBuildProjectName 
<br />
•    MSBuildStartupDirectory 
<br />
•    MSBuildThisFile 
<br />
•    MSBuildThisFileDirectory 
<br />
•    MSBuildThisFileDirectoryNoRoot 
<br />
•    MSBuildThisFileExtension 
<br />
•    MSBuildThisFileFullPath 
<br />
•    MSBuildThisFileName 
<br />
•    MSBuildToolsPath 
<br />
•    MSBuildToolsVersion
</p>
        <p>
If you want to see what the values are you can execute this simple proj file that
I created.
</p>
        <pre class="brush: xml;">&lt;Project ToolsVersion="4.0" DefaultTargets="PrintValues" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;

  &lt;Target Name="PrintValues"&gt;
    &lt;Message Text="MSBuild: $(MSBuild)"/&gt;
    &lt;Message Text="MSBuildBinPath: $(MSBuildBinPath)"/&gt;
    &lt;Message Text="MSBuildExtensionsPath: $(MSBuildExtensionsPath)"/&gt;
    &lt;Message Text="MSBuildExtensionsPath32: $(MSBuildExtensionsPath32)"/&gt;
    &lt;Message Text="MSBuildExtensionsPath64: $(MSBuildExtensionsPath64)"/&gt;
    &lt;Message Text="MSBuildLastTaskResult: $(MSBuildLastTaskResult)"/&gt;
    &lt;Message Text="MSBuildNodeCount: $(MSBuildNodeCount)"/&gt;
    &lt;Message Text="MSBuildOverrideTasksPath: $(MSBuildOverrideTasksPath)"/&gt;
    &lt;Message Text="MSBuildProgramFiles32: $(MSBuildProgramFiles32)"/&gt;
    &lt;Message Text="MSBuildProjectDefaultTargets: $(MSBuildProjectDefaultTargets)"/&gt;
    &lt;Message Text="MSBuildProjectDirectory: $(MSBuildProjectDirectory)"/&gt;
    &lt;Message Text="MSBuildProjectDirectoryNoRoot: $(MSBuildProjectDirectoryNoRoot)"/&gt;
    &lt;Message Text="MSBuildProjectExtension: $(MSBuildProjectExtension)"/&gt;
    &lt;Message Text="MSBuildProjectFile: $(MSBuildProjectFile)"/&gt;
    &lt;Message Text="MSBuildProjectFullPath: $(MSBuildProjectFullPath)"/&gt;
    &lt;Message Text="MSBuildProjectName: $(MSBuildProjectName)"/&gt;
    &lt;Message Text="MSBuildStartupDirectory: $(MSBuildStartupDirectory)"/&gt;
    &lt;Message Text="MSBuildThisFile: $(MSBuildThisFile)"/&gt;
    &lt;Message Text="MSBuildThisFileDirectory: $(MSBuildThisFileDirectory)"/&gt;
    &lt;Message Text="MSBuildThisFileDirectoryNoRoot: $(MSBuildThisFileDirectoryNoRoot)"/&gt;
    &lt;Message Text="MSBuildThisFileExtension: $(MSBuildThisFileExtension)"/&gt;
    &lt;Message Text="MSBuildThisFileFullPath: $(MSBuildThisFileFullPath)"/&gt;
    &lt;Message Text="MSBuildThisFileName: $(MSBuildThisFileName)"/&gt;
    &lt;Message Text="MSBuildToolsPath: $(MSBuildToolsPath)"/&gt;
    &lt;Message Text="MSBuildToolsVersion: $(MSBuildToolsVersion)"/&gt;
  &lt;/Target&gt;

&lt;/Project&gt;</pre>
        <p>
For me the results are:
</p>
        <pre class="brush: plain;">C:\Data\Development\My Code\Community\MSBuild&gt;msbuild ReservedProps02.proj /m /nologo
Build started 3/18/2010 12:43:49 AM.
     1&gt;Project "C:\Data\Development\My Code\Community\MSBuild\ReservedProps02.proj" on node 1 (default targets).
     1&gt;PrintValues:
         MSBuild:
         MSBuildBinPath: C:\Windows\Microsoft.NET\Framework\v4.0.30128
         MSBuildExtensionsPath: C:\Program Files (x86)\MSBuild
         MSBuildExtensionsPath32: C:\Program Files (x86)\MSBuild
         MSBuildExtensionsPath64: C:\Program Files\MSBuild
         MSBuildLastTaskResult: true
         MSBuildNodeCount: 8
         MSBuildOverrideTasksPath:
         MSBuildProgramFiles32: C:\Program Files (x86)
         MSBuildProjectDefaultTargets: PrintValues
         MSBuildProjectDirectory: C:\Data\Development\My Code\Community\MSBuild
         MSBuildProjectDirectoryNoRoot: Data\Development\My Code\Community\MSBuild
         MSBuildProjectExtension: .proj
         MSBuildProjectFile: ReservedProps02.proj
         MSBuildProjectFullPath: C:\Data\Development\My Code\Community\MSBuild\ReservedProps02.proj
         MSBuildProjectName: ReservedProps02
         MSBuildStartupDirectory: C:\Data\Development\My Code\Community\MSBuild
         MSBuildThisFile: ReservedProps02.proj
         MSBuildThisFileDirectory: C:\Data\Development\My Code\Community\MSBuild\
         MSBuildThisFileDirectoryNoRoot: Data\Development\My Code\Community\MSBuild\
         MSBuildThisFileExtension: .proj
         MSBuildThisFileFullPath: C:\Data\Development\My Code\Community\MSBuild\ReservedProps02.proj
         MSBuildThisFileName: ReservedProps02
         MSBuildToolsPath: C:\Windows\Microsoft.NET\Framework\v4.0.30128
         MSBuildToolsVersion: 4.0
     1&gt;Done Building Project "C:\Data\Development\My Code\Community\MSBuild\ReservedProps02.proj" (default targets
       ).</pre>
        <p>
If you want to see the correct valus for MSBuildNodeCount make sure to use the /m
switch when you invoke msbuild.exe.
</p>
I won’t go over these properties in detail here, because they are mostly obvious but
I would like to point out a couple really useful properties, those include. 
<p><strong><u>MSBuildThisFile 
<br />
MSBuildThisFileDirectory 
<br />
MSBuildThisFileDirectoryNoRoot</u></strong></p><p>
These properties can be used to locate the path to the file that you are currently
in. So if you have a shared .targets file and it will execute an .exe in the same
folder you can use the MSBuildThisFileDirectory property to resolve the full path
to that tool reliably. This has historically been difficult. See a recent question
on <a href="http://www.stackoverflow.com">Stackoverflow.com</a> about it at <a href="http://stackoverflow.com/questions/2418874/how-can-i-get-the-path-of-the-current-msbuild-file/2421596#2421596">How
can I get the path of the current msbuild file?</a> If you are not using MSBuild 4.0
and need to resolve the location to a .targets file then see that post for what you
will need to do.
</p></body>
      <title>MSBuild 4.0 Reserved Properties</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,6d42739d-227e-472c-a94a-60a7875ea6cb.aspx</guid>
      <link>http://sedodream.com/2010/03/11/MSBuild40ReservedProperties.aspx</link>
      <pubDate>Thu, 11 Mar 2010 00:53:51 GMT</pubDate>
      <description>&lt;p&gt;
A while back I wrote about &lt;a href="http://sedodream.com/2008/06/09/MSBuildReservedProperties.aspx"&gt;Reserved
Properties in MSBuild 3.5&lt;/a&gt;, now its time to update that post to include reserved
properties for MSBuild 4.0. There are a number of new properties here is the list:
&lt;/p&gt;
&lt;p&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuild 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildBinPath 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildExtensionsPath 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildExtensionsPath32 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildExtensionsPath64 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildLastTaskResult 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildNodeCount 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildOverrideTasksPath 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildProgramFiles32 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildProjectDefaultTargets 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildProjectDirectory 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildProjectDirectoryNoRoot 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildProjectExtension 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildProjectFile 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildProjectFullPath 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildProjectName 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildStartupDirectory 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildThisFile 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildThisFileDirectory 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildThisFileDirectoryNoRoot 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildThisFileExtension 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildThisFileFullPath 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildThisFileName 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildToolsPath 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; MSBuildToolsVersion
&lt;/p&gt;
&lt;p&gt;
If you want to see what the values are you can execute this simple proj file that
I created.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; DefaultTargets=&amp;quot;PrintValues&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;

  &amp;lt;Target Name=&amp;quot;PrintValues&amp;quot;&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuild: $(MSBuild)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildBinPath: $(MSBuildBinPath)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildExtensionsPath: $(MSBuildExtensionsPath)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildExtensionsPath32: $(MSBuildExtensionsPath32)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildExtensionsPath64: $(MSBuildExtensionsPath64)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildLastTaskResult: $(MSBuildLastTaskResult)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildNodeCount: $(MSBuildNodeCount)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildOverrideTasksPath: $(MSBuildOverrideTasksPath)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildProgramFiles32: $(MSBuildProgramFiles32)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildProjectDefaultTargets: $(MSBuildProjectDefaultTargets)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildProjectDirectory: $(MSBuildProjectDirectory)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildProjectDirectoryNoRoot: $(MSBuildProjectDirectoryNoRoot)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildProjectExtension: $(MSBuildProjectExtension)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildProjectFile: $(MSBuildProjectFile)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildProjectFullPath: $(MSBuildProjectFullPath)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildProjectName: $(MSBuildProjectName)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildStartupDirectory: $(MSBuildStartupDirectory)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildThisFile: $(MSBuildThisFile)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildThisFileDirectory: $(MSBuildThisFileDirectory)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildThisFileDirectoryNoRoot: $(MSBuildThisFileDirectoryNoRoot)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildThisFileExtension: $(MSBuildThisFileExtension)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildThisFileFullPath: $(MSBuildThisFileFullPath)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildThisFileName: $(MSBuildThisFileName)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildToolsPath: $(MSBuildToolsPath)&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;MSBuildToolsVersion: $(MSBuildToolsVersion)&amp;quot;/&amp;gt;
  &amp;lt;/Target&amp;gt;

&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
For me the results are:
&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;C:\Data\Development\My Code\Community\MSBuild&amp;gt;msbuild ReservedProps02.proj /m /nologo
Build started 3/18/2010 12:43:49 AM.
     1&amp;gt;Project &amp;quot;C:\Data\Development\My Code\Community\MSBuild\ReservedProps02.proj&amp;quot; on node 1 (default targets).
     1&amp;gt;PrintValues:
         MSBuild:
         MSBuildBinPath: C:\Windows\Microsoft.NET\Framework\v4.0.30128
         MSBuildExtensionsPath: C:\Program Files (x86)\MSBuild
         MSBuildExtensionsPath32: C:\Program Files (x86)\MSBuild
         MSBuildExtensionsPath64: C:\Program Files\MSBuild
         MSBuildLastTaskResult: true
         MSBuildNodeCount: 8
         MSBuildOverrideTasksPath:
         MSBuildProgramFiles32: C:\Program Files (x86)
         MSBuildProjectDefaultTargets: PrintValues
         MSBuildProjectDirectory: C:\Data\Development\My Code\Community\MSBuild
         MSBuildProjectDirectoryNoRoot: Data\Development\My Code\Community\MSBuild
         MSBuildProjectExtension: .proj
         MSBuildProjectFile: ReservedProps02.proj
         MSBuildProjectFullPath: C:\Data\Development\My Code\Community\MSBuild\ReservedProps02.proj
         MSBuildProjectName: ReservedProps02
         MSBuildStartupDirectory: C:\Data\Development\My Code\Community\MSBuild
         MSBuildThisFile: ReservedProps02.proj
         MSBuildThisFileDirectory: C:\Data\Development\My Code\Community\MSBuild\
         MSBuildThisFileDirectoryNoRoot: Data\Development\My Code\Community\MSBuild\
         MSBuildThisFileExtension: .proj
         MSBuildThisFileFullPath: C:\Data\Development\My Code\Community\MSBuild\ReservedProps02.proj
         MSBuildThisFileName: ReservedProps02
         MSBuildToolsPath: C:\Windows\Microsoft.NET\Framework\v4.0.30128
         MSBuildToolsVersion: 4.0
     1&amp;gt;Done Building Project &amp;quot;C:\Data\Development\My Code\Community\MSBuild\ReservedProps02.proj&amp;quot; (default targets
       ).&lt;/pre&gt;
&lt;p&gt;
If you want to see the correct valus for MSBuildNodeCount make sure to use the /m
switch when you invoke msbuild.exe.
&lt;/p&gt;
I won’t go over these properties in detail here, because they are mostly obvious but
I would like to point out a couple really useful properties, those include. 
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;MSBuildThisFile 
&lt;br /&gt;
MSBuildThisFileDirectory 
&lt;br /&gt;
MSBuildThisFileDirectoryNoRoot&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
These properties can be used to locate the path to the file that you are currently
in. So if you have a shared .targets file and it will execute an .exe in the same
folder you can use the MSBuildThisFileDirectory property to resolve the full path
to that tool reliably. This has historically been difficult. See a recent question
on &lt;a href="http://www.stackoverflow.com"&gt;Stackoverflow.com&lt;/a&gt; about it at &lt;a href="http://stackoverflow.com/questions/2418874/how-can-i-get-the-path-of-the-current-msbuild-file/2421596#2421596"&gt;How
can I get the path of the current msbuild file?&lt;/a&gt; If you are not using MSBuild 4.0
and need to resolve the location to a .targets file then see that post for what you
will need to do.
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,6d42739d-227e-472c-a94a-60a7875ea6cb.aspx</comments>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
      <category>Visual Studio 2010</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=7da42fd8-a0e0-4082-9526-9bc30b5ac558</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,7da42fd8-a0e0-4082-9526-9bc30b5ac558.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,7da42fd8-a0e0-4082-9526-9bc30b5ac558.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=7da42fd8-a0e0-4082-9526-9bc30b5ac558</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I have previously blogged about some new features in MSBuild 4.0 at:
</p>
        <ul>
          <li>
            <a href="http://sedodream.com/2010/01/20/MSBuild40InlineTasks.aspx">MSBuild 4.0: Inline
Tasks Part 1</a>
          </li>
          <li>
            <a href="http://sedodream.com/2010/01/22/MSBuild40InlineTasksPart2.aspx">MSBuild 4.0:
Inline Tasks Part 2</a>
          </li>
        </ul>
        <p>
Besides inline tasks there are a set of other new features including <a href="http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx">Property
Functions</a>. In this post we will discuss property functions and how you might use
them in your build scripts. With property functions you can call an instance <a href="http://msdn.microsoft.com/en-us/library/system.string_methods%28v=VS.90%29.aspx">method
of the string object</a> on properties now.
</p>
        <p>
The syntax will be in the format <font color="#008000" face="Consolas"><strong>$(PropertyName.MethodName([<em>Parameters</em>]))</strong></font> when
you want to invoke a string method. <em><font color="#008000">Parameters</font></em> in
the previous expression is optional. For instance if you need to call the <a href="http://msdn.microsoft.com/en-us/library/system.string.trim%28v=VS.90%29.aspx">Trim</a> method
then you do not need to supply any arguments. Take a look at the snippet below to
get a better feel for how to use these new features.
</p>
        <pre class="brush: xml;">&lt;Project ToolsVersion="4.0" 
<br />
DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
&lt;PropertyGroup&gt; &lt;SampleString&gt;This is a sample string&lt;/SampleString&gt;
&lt;SampleString2&gt; This is a sample string &lt;/SampleString2&gt; &lt;!-- Here
we now can call instance methods on the String class --&gt; &lt;Sub04&gt;$(SampleString.Substring(0,4))&lt;/Sub04&gt;
&lt;Contains01&gt;$(SampleString.Contains("This"))&lt;/Contains01&gt; &lt;Contains02&gt;$(SampleString.Contains("this"))&lt;/Contains02&gt;
&lt;CompareTo01&gt;$(SampleString.CompareTo($(SampleString)))&lt;/CompareTo01&gt;
&lt;EndsWith01&gt;$(SampleString.CompareTo("string"))&lt;/EndsWith01&gt;
&lt;Insert01&gt;$(SampleString.Insert(2,"INSERTED"))&lt;/Insert01&gt; &lt;Trim01&gt;$(SampleString2.Trim())&lt;/Trim01&gt;
&lt;/PropertyGroup&gt; &lt;Target Name="Demo"&gt; &lt;Message Text="SampleString:
$(SampleString)" Importance="high"/&gt; &lt;Message Text="Sub04:
$(Sub04)" Importance="high"/&gt; &lt;Message Text="Contains01:
$(Contains01)" Importance="high"/&gt; &lt;Message Text="Contains02:
$(Contains02)" Importance="high"/&gt; &lt;Message Text="CompareTo01:
$(CompareTo01)" Importance="high"/&gt; &lt;Message Text="EndsWith01:
$(EndsWith01)" Importance="high"/&gt; &lt;Message Text="Insert01:
$(Insert01)" Importance="high"/&gt; &lt;Message Text="Trim01:
$(Trim01)" Importance="high"/&gt; &lt;/Target&gt; &lt;/Project&gt;</pre>
        <p>
In this snippet I am calling various string methods on the properties defined. The
results of executing this are shown in the fragment below.
</p>
        <pre class="brush: plain;">Demo:
  SampleString: This is a sample string
  Sub04: This
  Contains01: True
  Contains02: False
  CompareTo01: 0
  EndsWith01: 1
  Insert01: ThINSERTEDis is a sample string
  Trim01: This is a sample string</pre>
        <p>
This is just one way that you can use property functions. We can also call a static
methods (<em>and properties</em>) on a known set of classes. See <a title="http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx" href="http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx">http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx</a> for
the list of complete classes that you can call static methods on. The syntax is as
follows<font color="#008000"><strong>$([Full-Class-Name]::Method(<em>Parameters</em>))</strong></font> or
if you are calling a property you just leave off the <strong><em><font color="#008000">(Parameters)</font></em></strong>.
To demonstrate this I have created the following file.
</p>
        <pre class="brush: xml;">&lt;Project 
    ToolsVersion="4.0" 
    DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;

  &lt;PropertyGroup&gt;
    &lt;!-- 
      Here we Now01 can call static methods/properties on many types 
      See http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx
      for the list of classes that we can call static methods/properties on.
    --&gt;
    &lt;Now01&gt;$([System.DateTime]::Now)&lt;/Now01&gt;
    &lt;Pow01&gt;$([System.Math]::Pow(2,3))&lt;/Pow01&gt;
    &lt;TempFile01&gt;$([System.IO.Path]::GetTempFileName())&lt;/TempFile01&gt;
  &lt;/PropertyGroup&gt;
  
  &lt;Target Name="Demo"&gt;
    &lt;Message Text="Now01: $(Now01)" Importance="high"/&gt;
    &lt;Message Text="Pow01: $(Pow01)" Importance="high"/&gt;
    &lt;Message Text="TempFile01: $(TempFile01)" Importance="high"/&gt;
  &lt;/Target&gt;

&lt;/Project&gt;</pre>
        <p>
And the result is:
</p>
        <pre class="brush: plain;">Demo:
  Now01: 3/6/2010 7:31:23 PM
  Pow01: 8
  TempFile01: C:\Users\Ibrahim\AppData\Local\Temp\tmp4C1.tmp</pre>
        <p>
Similar to this you can call a handful of <strong><em>MSBuild</em></strong> methods.
Those methods are documented at <a title="http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx" href="http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx">http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx</a>.
You would use a similar syntax to access those which is <strong><em><font color="#008000">$([MSBuild]::Method(Parameters))</font></em></strong>.
To show you those take a look at the follwing sample file.
</p>
        <pre class="brush: xml;">&lt;Project 
  ToolsVersion="4.0" 
  DefaultTargets="Demo" 
  xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;

  &lt;PropertyGroup&gt;
    &lt;Add&gt;$([MSBuild]::Add(5,9))&lt;/Add&gt;
    &lt;Subtract01&gt;$([MSBuild]::Subtract(90,768))&lt;/Subtract01&gt;
    &lt;Mult01&gt;$([MSBuild]::Multiply(4,9))&lt;/Mult01&gt;
    &lt;Div01&gt;$([MSBuild]::Divide(100,5.2))&lt;/Div01&gt;
  &lt;/PropertyGroup&gt;
  
  &lt;Target Name="Demo"&gt;
    &lt;Message Text="Add: $(Add)" Importance="high"/&gt;
    &lt;Message Text="Subtract01: $(Subtract01)" Importance="high"/&gt;
    &lt;Message Text="Mult01: $(Mult01)" Importance="high"/&gt;
    &lt;Message Text="Div01: $(Div01)" Importance="high"/&gt;
  &lt;/Target&gt;

&lt;/Project&gt;</pre>
        <p>
I will leave it up to you to execute that file to see the result, but you can probably
figure it out :)
</p>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>MSBuild 4.0: Property Functions Part 1</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,7da42fd8-a0e0-4082-9526-9bc30b5ac558.aspx</guid>
      <link>http://sedodream.com/2010/03/07/MSBuild40PropertyFunctionsPart1.aspx</link>
      <pubDate>Sun, 07 Mar 2010 00:35:29 GMT</pubDate>
      <description>&lt;p&gt;
I have previously blogged about some new features in MSBuild 4.0 at:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://sedodream.com/2010/01/20/MSBuild40InlineTasks.aspx"&gt;MSBuild 4.0: Inline
Tasks Part 1&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://sedodream.com/2010/01/22/MSBuild40InlineTasksPart2.aspx"&gt;MSBuild 4.0:
Inline Tasks Part 2&lt;/a&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Besides inline tasks there are a set of other new features including &lt;a href="http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx"&gt;Property
Functions&lt;/a&gt;. In this post we will discuss property functions and how you might use
them in your build scripts. With property functions you can call an instance &lt;a href="http://msdn.microsoft.com/en-us/library/system.string_methods%28v=VS.90%29.aspx"&gt;method
of the string object&lt;/a&gt; on properties now.
&lt;/p&gt;
&lt;p&gt;
The syntax will be in the format &lt;font color="#008000" face="Consolas"&gt;&lt;strong&gt;$(PropertyName.MethodName([&lt;em&gt;Parameters&lt;/em&gt;]))&lt;/strong&gt;&lt;/font&gt; when
you want to invoke a string method. &lt;em&gt;&lt;font color="#008000"&gt;Parameters&lt;/font&gt;&lt;/em&gt; in
the previous expression is optional. For instance if you need to call the &lt;a href="http://msdn.microsoft.com/en-us/library/system.string.trim%28v=VS.90%29.aspx"&gt;Trim&lt;/a&gt; method
then you do not need to supply any arguments. Take a look at the snippet below to
get a better feel for how to use these new features.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Project ToolsVersion=&amp;quot;4.0&amp;quot; 
&lt;br /&gt;
DefaultTargets=&amp;quot;Demo&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
&amp;lt;PropertyGroup&amp;gt; &amp;lt;SampleString&amp;gt;This is a sample string&amp;lt;/SampleString&amp;gt;
&amp;lt;SampleString2&amp;gt; This is a sample string &amp;lt;/SampleString2&amp;gt; &amp;lt;!-- Here
we now can call instance methods on the String class --&amp;gt; &amp;lt;Sub04&amp;gt;$(SampleString.Substring(0,4))&amp;lt;/Sub04&amp;gt;
&amp;lt;Contains01&amp;gt;$(SampleString.Contains(&amp;quot;This&amp;quot;))&amp;lt;/Contains01&amp;gt; &amp;lt;Contains02&amp;gt;$(SampleString.Contains(&amp;quot;this&amp;quot;))&amp;lt;/Contains02&amp;gt;
&amp;lt;CompareTo01&amp;gt;$(SampleString.CompareTo($(SampleString)))&amp;lt;/CompareTo01&amp;gt;
&amp;lt;EndsWith01&amp;gt;$(SampleString.CompareTo(&amp;quot;string&amp;quot;))&amp;lt;/EndsWith01&amp;gt;
&amp;lt;Insert01&amp;gt;$(SampleString.Insert(2,&amp;quot;INSERTED&amp;quot;))&amp;lt;/Insert01&amp;gt; &amp;lt;Trim01&amp;gt;$(SampleString2.Trim())&amp;lt;/Trim01&amp;gt;
&amp;lt;/PropertyGroup&amp;gt; &amp;lt;Target Name=&amp;quot;Demo&amp;quot;&amp;gt; &amp;lt;Message Text=&amp;quot;SampleString:
$(SampleString)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt; &amp;lt;Message Text=&amp;quot;Sub04:
$(Sub04)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt; &amp;lt;Message Text=&amp;quot;Contains01:
$(Contains01)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt; &amp;lt;Message Text=&amp;quot;Contains02:
$(Contains02)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt; &amp;lt;Message Text=&amp;quot;CompareTo01:
$(CompareTo01)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt; &amp;lt;Message Text=&amp;quot;EndsWith01:
$(EndsWith01)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt; &amp;lt;Message Text=&amp;quot;Insert01:
$(Insert01)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt; &amp;lt;Message Text=&amp;quot;Trim01:
$(Trim01)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt; &amp;lt;/Target&amp;gt; &amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
In this snippet I am calling various string methods on the properties defined. The
results of executing this are shown in the fragment below.
&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;Demo:
  SampleString: This is a sample string
  Sub04: This
  Contains01: True
  Contains02: False
  CompareTo01: 0
  EndsWith01: 1
  Insert01: ThINSERTEDis is a sample string
  Trim01: This is a sample string&lt;/pre&gt;
&lt;p&gt;
This is just one way that you can use property functions. We can also call a static
methods (&lt;em&gt;and properties&lt;/em&gt;) on a known set of classes. See &lt;a title="http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx" href="http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx&lt;/a&gt; for
the list of complete classes that you can call static methods on. The syntax is as
follows&lt;font color="#008000"&gt; &lt;strong&gt;$([Full-Class-Name]::Method(&lt;em&gt;Parameters&lt;/em&gt;))&lt;/strong&gt;&lt;/font&gt; or
if you are calling a property you just leave off the &lt;strong&gt;&lt;em&gt;&lt;font color="#008000"&gt;(Parameters)&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;.
To demonstrate this I have created the following file.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Project 
    ToolsVersion=&amp;quot;4.0&amp;quot; 
    DefaultTargets=&amp;quot;Demo&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;

  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;!-- 
      Here we Now01 can call static methods/properties on many types 
      See http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx
      for the list of classes that we can call static methods/properties on.
    --&amp;gt;
    &amp;lt;Now01&amp;gt;$([System.DateTime]::Now)&amp;lt;/Now01&amp;gt;
    &amp;lt;Pow01&amp;gt;$([System.Math]::Pow(2,3))&amp;lt;/Pow01&amp;gt;
    &amp;lt;TempFile01&amp;gt;$([System.IO.Path]::GetTempFileName())&amp;lt;/TempFile01&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
  
  &amp;lt;Target Name=&amp;quot;Demo&amp;quot;&amp;gt;
    &amp;lt;Message Text=&amp;quot;Now01: $(Now01)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;Pow01: $(Pow01)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;TempFile01: $(TempFile01)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt;
  &amp;lt;/Target&amp;gt;

&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
And the result is:
&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;Demo:
  Now01: 3/6/2010 7:31:23 PM
  Pow01: 8
  TempFile01: C:\Users\Ibrahim\AppData\Local\Temp\tmp4C1.tmp&lt;/pre&gt;
&lt;p&gt;
Similar to this you can call a handful of &lt;strong&gt;&lt;em&gt;MSBuild&lt;/em&gt;&lt;/strong&gt; methods.
Those methods are documented at &lt;a title="http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx" href="http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/dd633440%28VS.100%29.aspx&lt;/a&gt;.
You would use a similar syntax to access those which is &lt;strong&gt;&lt;em&gt;&lt;font color="#008000"&gt;$([MSBuild]::Method(Parameters))&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;.
To show you those take a look at the follwing sample file.
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Project 
  ToolsVersion=&amp;quot;4.0&amp;quot; 
  DefaultTargets=&amp;quot;Demo&amp;quot; 
  xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;

  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;Add&amp;gt;$([MSBuild]::Add(5,9))&amp;lt;/Add&amp;gt;
    &amp;lt;Subtract01&amp;gt;$([MSBuild]::Subtract(90,768))&amp;lt;/Subtract01&amp;gt;
    &amp;lt;Mult01&amp;gt;$([MSBuild]::Multiply(4,9))&amp;lt;/Mult01&amp;gt;
    &amp;lt;Div01&amp;gt;$([MSBuild]::Divide(100,5.2))&amp;lt;/Div01&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
  
  &amp;lt;Target Name=&amp;quot;Demo&amp;quot;&amp;gt;
    &amp;lt;Message Text=&amp;quot;Add: $(Add)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;Subtract01: $(Subtract01)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;Mult01: $(Mult01)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt;
    &amp;lt;Message Text=&amp;quot;Div01: $(Div01)&amp;quot; Importance=&amp;quot;high&amp;quot;/&amp;gt;
  &amp;lt;/Target&amp;gt;

&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
I will leave it up to you to execute that file to see the result, but you can probably
figure it out :)
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,7da42fd8-a0e0-4082-9526-9bc30b5ac558.aspx</comments>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=c3029c1e-82cc-4221-92ac-270221595d54</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,c3029c1e-82cc-4221-92ac-270221595d54.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,c3029c1e-82cc-4221-92ac-270221595d54.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c3029c1e-82cc-4221-92ac-270221595d54</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This weekend I will be speaking at the <a href="http://www.fladotnet.com/codecamp/">South
Florida Code Camp</a>. This has historically been a very popular event (&gt;500 people)
with a lot of good speakers. 
</p>
        <p>
I will be presenting 2 topics there, the abstracts are below.
</p>
        <p>
          <strong>
            <u>
              <font size="4">MSBuild 4.0 What’s New</font>
            </u>
          </strong>
        </p>
        <p>
MSBuild, the Microsoft Build Engine, was first introduced with Visual Studio 2005.
This was MSBuild 2.0, and it was delivered along with the .NET Framework 2.0. The
next major release of MSBuild, version 3.5, was introduced for Visual Studio 2008
and was deployed with the .NET Framework 3.5. Now the third major version, 4.0, is
being introduced with Visual Studio 2010, and in concert with previous releases is
being shipped with the .NET Framework 4.0. In this session we will talk about the
new features included with MSBuild 4.0 and how it can make your MSBuild files better.
The topics we will talk about will include. 
<br />
•    Inline Tasks 
<br />
•    Property Functions 
<br />
•    Item Functions 
<br />
•    Before / After Targets 
<br />
•    Support for C++ projects (both native and managed) 
<br />
•    New Object Model
</p>
        <p>
          <a href="http://www.fladotnet.com/codecamp/SpeakerEditSession.aspx?SessionID=316">
          </a>
          <strong>
            <u>
              <font size="4">Simplifying
deployments with MSDeploy and Visual Studio 2010</font>
            </u>
          </strong>
        </p>
        <p>
In this session we will demonstrate how to greatly simplify deployments of web applications
using MSDeploy. MSDeploy is shipped with Visual Studio 2010 and is available as a
separate download. Visual Studio 2010 has enhances support for MSDeploy and we will
go over many of those details in this session. We will also be discussing how MSDeploy
can be used as a stand alone tool outside of Visual Studio 2010. So if you are not
able to upgrade to Visual Studio 2010 but developing web applications this is still
a great for you.
</p>
        <p>
If you are in the South Florida area this is definitely an event that you don’t want
to miss out. Please stop by and see me!
</p>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>Speaking at South Florida Code Camp</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,c3029c1e-82cc-4221-92ac-270221595d54.aspx</guid>
      <link>http://sedodream.com/2010/02/25/SpeakingAtSouthFloridaCodeCamp.aspx</link>
      <pubDate>Thu, 25 Feb 2010 04:01:47 GMT</pubDate>
      <description>&lt;p&gt;
This weekend I will be speaking at the &lt;a href="http://www.fladotnet.com/codecamp/"&gt;South
Florida Code Camp&lt;/a&gt;. This has historically been a very popular event (&amp;gt;500 people)
with a lot of good speakers. 
&lt;/p&gt;
&lt;p&gt;
I will be presenting 2 topics there, the abstracts are below.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;&lt;font size="4"&gt;MSBuild 4.0 What’s New&lt;/font&gt;&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
MSBuild, the Microsoft Build Engine, was first introduced with Visual Studio 2005.
This was MSBuild 2.0, and it was delivered along with the .NET Framework 2.0. The
next major release of MSBuild, version 3.5, was introduced for Visual Studio 2008
and was deployed with the .NET Framework 3.5. Now the third major version, 4.0, is
being introduced with Visual Studio 2010, and in concert with previous releases is
being shipped with the .NET Framework 4.0. In this session we will talk about the
new features included with MSBuild 4.0 and how it can make your MSBuild files better.
The topics we will talk about will include. 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; Inline Tasks 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; Property Functions 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; Item Functions 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; Before / After Targets 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; Support for C++ projects (both native and managed) 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; New Object Model
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.fladotnet.com/codecamp/SpeakerEditSession.aspx?SessionID=316"&gt;&lt;/a&gt;&lt;strong&gt;&lt;u&gt;&lt;font size="4"&gt;Simplifying
deployments with MSDeploy and Visual Studio 2010&lt;/font&gt;&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
In this session we will demonstrate how to greatly simplify deployments of web applications
using MSDeploy. MSDeploy is shipped with Visual Studio 2010 and is available as a
separate download. Visual Studio 2010 has enhances support for MSDeploy and we will
go over many of those details in this session. We will also be discussing how MSDeploy
can be used as a stand alone tool outside of Visual Studio 2010. So if you are not
able to upgrade to Visual Studio 2010 but developing web applications this is still
a great for you.
&lt;/p&gt;
&lt;p&gt;
If you are in the South Florida area this is definitely an event that you don’t want
to miss out. Please stop by and see me!
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,c3029c1e-82cc-4221-92ac-270221595d54.aspx</comments>
      <category>MSBuild</category>
      <category>speaking</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=1d80a062-e571-49ee-b7ad-fb8256299d2e</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,1d80a062-e571-49ee-b7ad-fb8256299d2e.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,1d80a062-e571-49ee-b7ad-fb8256299d2e.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=1d80a062-e571-49ee-b7ad-fb8256299d2e</wfw:commentRss>
      <title>MSBuild 4.0: Inline Tasks Part 2</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,1d80a062-e571-49ee-b7ad-fb8256299d2e.aspx</guid>
      <link>http://sedodream.com/2010/01/22/MSBuild40InlineTasksPart2.aspx</link>
      <pubDate>Fri, 22 Jan 2010 04:01:46 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;This post contains based on .NET 4.0 Beta 2 and Visual Studio 2010 Beta 2 which
may change. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
The other day I wrote my first post on &lt;a href="http://sedodream.com/2010/01/20/MSBuild40InlineTasks.aspx"&gt;Inline
Tasks&lt;/a&gt; in MSBuild 4.0, this post will add onto that topic. In the previous post
we covered some basics, but there were a lot that was skipped. Last time we demonstrated
how to pass parameters but we never declared what type those parameters were. If you
declare a parameter and leave off the type, then it will be declared as a string.
If you need to declare parameters of other types then you need to use the &lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt;ParameterType&lt;/strong&gt;&lt;/span&gt; attribute
on the parameter. You have to pass in the full name of the type to be used. For example
if you need to declare an int you must use System.Int32, not int and not Int32 but
System.Int32. It would be good if they supported aliases like int, string, long, etc
but right now they don't. Below you'll find a new inline task which can be used to
perform a substring. I've placed this in a file named IT-Substring-01.proj. 
&lt;/p&gt;
&lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt; 
&lt;div style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1pt; PADDING-LEFT: 4pt; PADDING-RIGHT: 4pt; BACKGROUND: #d9d9d9; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1pt; mso-element: para-border-div; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217"&gt;
&lt;p style="MARGIN: 10pt 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpFirst"&gt;
&lt;font size="3"&gt;&amp;lt;!--&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;Sample Demonstrates Inline Tasks&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;© 2010 Sayed Ibrahim Hashimi &lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;--&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&amp;lt;Project ToolsVersion="4.0" DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;!--?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /--&gt;
&lt;o:p&gt;
&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;UsingTask&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TaskName="Substring"&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TaskFactory="CodeTaskFactory"&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"
&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;ParameterGroup&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Input
Required="true" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;StartIndex
Required="true" ParameterType="System.Int32" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Length
ParameterType="System.Int32" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Result
Output="true" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/ParameterGroup&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Task&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Code
Type="Fragment" Language="cs"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;![CDATA[&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if
(Length &amp;gt; 0)&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Result
= Input.Substring(StartIndex, Length);&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;else&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Result
= Input.Substring(StartIndex);&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;]]&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/Code&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/Task&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/UsingTask&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;o:p&gt;
&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;Target Name="Demo"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Substring
StartIndex="8" Input="Demo of Inline Tasks"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Output
PropertyName="taskValue" TaskParameter="Result"/&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/Substring&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Message
Text="Value from task: $(taskValue)" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Substring
StartIndex="0" Length="4" Input="Demo of Inline Tasks"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Output
PropertyName="taskValue" TaskParameter="Result"/&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/Substring&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Message
Text="Value from task: $(taskValue)" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/Target&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpLast"&gt;
&lt;font size="3"&gt;&amp;lt;/Project&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/strong&gt;&lt;/span&gt; 
&lt;p&gt;
In the task above I have declared 4 parameters, from those two have the type specified
to be int. If we execute the Demo target here is the result. 
&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" src="http://www.sedodream.com/content/binary/012210_0401_MSBuild40In1.png"&gt; 
&lt;/p&gt;
&lt;p&gt;
From the above image you can see that the task performs the actions requested. One
thing to make a mental note of above is my usage of a &lt;a href="http://en.wikipedia.org/wiki/CDATA"&gt;CDATA&lt;/a&gt; tag
to wrap the definition of the task. I would suggest that you do so for all inline
tasks that you write. 
&lt;/p&gt;
&lt;p&gt;
The types supported for parameters on inline types are the same for normal types.
For a detailed account of that see my &lt;a href="http://www.amazon.com/gp/product/0735626286?ie=UTF8&amp;amp;tag=sedodream-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=0735626286"&gt;book&lt;/a&gt;,
but as a general guideline it accepts string, primitive types, &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.build.framework.itaskitem.aspx"&gt;ITaskItem&lt;/a&gt;,
and arrays of all three. 
&lt;/p&gt;
&lt;p&gt;
Let's see how we can use an array in an inline task. I created a simple task which
will create a list of &lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt;Guid&lt;/strong&gt;&lt;/span&gt;s
and place them into an array and return the result back to the calling MSBuild script,
the file I placed this is in named IT-CreateGuid-02.proj. The contents of that file
are shown in the snippet below. 
&lt;/p&gt;
&lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt; 
&lt;div style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1pt; PADDING-LEFT: 2pt; PADDING-RIGHT: 4pt; BACKGROUND: #d9d9d9; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1pt; mso-element: para-border-div; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217"&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 10pt 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpFirst"&gt;
&lt;font size="3"&gt;&amp;lt;!--&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;Sample Demonstrates Inline Tasks&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;© 2010 Sayed Ibrahim Hashimi &lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;--&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&amp;lt;Project ToolsVersion="4.0" DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;o:p&gt;
&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;UsingTask&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TaskName="CreateGuid02"&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TaskFactory="CodeTaskFactory"&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"
&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;ParameterGroup&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;NumToCreate
ParameterType="System.Int32" Required="true" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Guids
ParameterType="System.String[]" Output="true" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/ParameterGroup&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Task&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Code
Type="Fragment" Language="cs"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;![CDATA[&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;List&amp;lt;string&amp;gt;
guids = new List&amp;lt;string&amp;gt;();&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;for
(int i = 0; i &amp;lt; NumToCreate; i++)&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&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; &lt;/span&gt;guids.Add(Guid.NewGuid().ToString());&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Guids
= guids.ToArray();&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;]]&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/Code&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/Task&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/UsingTask&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;o:p&gt;
&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;Target Name="Demo"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;CreateGuid02
NumToCreate="1"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Output
ItemName="Id01" TaskParameter="Guids" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/CreateGuid02&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Message
Text="Id01: @(Id01)" Importance="high" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;o:p&gt;
&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;CreateGuid02
NumToCreate="4"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Output
ItemName="Id02" TaskParameter="Guids" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/CreateGuid02&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Message
Text=" " Importance="high" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Message
Text="Id02: @(Id02)" Importance="high" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/Target&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;font size="3"&gt;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 10pt; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BACKGROUND: #d9d9d9; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-padding-alt: 1.0pt 4.0pt 1.0pt 2.0pt" class="Code-BlockCxSpLast"&gt;
&lt;font size="3"&gt;&amp;lt;/Project&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/strong&gt;&lt;/span&gt; 
&lt;p&gt;
Above you can see that I declared the parameter &lt;span style="BACKGROUND-COLOR: #d9d9d9; FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt;Guids&lt;/strong&gt;&lt;/span&gt; as &lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt;System.String[]&lt;/strong&gt;&lt;/span&gt;.
I typically prefer to use generic lists instead of arrays so in my task definitions
I will use a list and then just call &lt;a href="http://msdn.microsoft.com/en-us/library/x303t819%28VS.100%29.aspx"&gt;ToArray&lt;/a&gt; when
I assign the output parameter. Here is a nifty, but very simplistic task. Given an
item list, it will filter them based on &lt;a href="http://en.wikipedia.org/wiki/Regular_expression"&gt;a
Regular Expression&lt;/a&gt; passed in. 
&lt;/p&gt;
&lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt; 
&lt;div style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1pt; PADDING-LEFT: 4pt; PADDING-RIGHT: 4pt; BACKGROUND: #d9d9d9; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1pt; mso-element: para-border-div; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217"&gt;
&lt;p style="MARGIN: 10pt 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpFirst"&gt;
&lt;font size="3"&gt;&amp;lt;!--&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;Sample Demonstrates Inline Tasks&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;© 2010 Sayed Ibrahim Hashimi &lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;--&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&amp;lt;Project ToolsVersion="4.0" DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;o:p&gt;
&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;UsingTask&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TaskName="FilterList"&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TaskFactory="CodeTaskFactory"&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"
&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;ParameterGroup&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;ListToFilter
ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Filter
Required="true" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;FilteredList
ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/ParameterGroup&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Task&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Using
Namespace="System.Text.RegularExpressions" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Code
Type="Fragment" Language="cs"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;![CDATA[&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;var
results = (from l in ListToFilter&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;where
Regex.IsMatch(l.ItemSpec, Filter)&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;select
l).ToList();&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;o:p&gt;
&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;FilteredList
= results.ToArray();&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;]]&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/Code&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/Task&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/UsingTask&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;o:p&gt;
&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;ItemGroup&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Source
Include="src\01.cs" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Source
Include="src\02.cs" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Source
Include="test\test01.cs" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Source
Include="test\sub\test02.cs" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Source
Include="test\sub\test03.cs" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Source
Include="test\sub\sub2\test04.cs" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/ItemGroup&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;font size="3"&gt;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;Target Name="Demo"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;FilterList
ListToFilter="@(Source)" Filter="test"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Output
ItemName="_filteredList" TaskParameter="FilteredList" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/FilterList&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Message
Text="Filter: test. Results: @(_filteredList)" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;!-- Clear
the list before calling again --&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;ItemGroup&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;_filteredList
Remove="@(_filteredList)" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/ItemGroup&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;o:p&gt;
&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Message
Text="======" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;FilterList
ListToFilter="@(Source)" Filter="sub\\"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Output
ItemName="_filteredList" TaskParameter="FilteredList" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/FilterList&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Message
Text="Filter: .\sub. Results: @(_filteredList)" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/Target&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt; BACKGROUND: #d9d9d9; mso-background-themecolor: background1; mso-background-themeshade: 217" class="Code-BlockCxSpLast"&gt;
&lt;font size="3"&gt;&amp;lt;/Project&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/strong&gt;&lt;/span&gt; 
&lt;p&gt;
Here you see that you can you can perform &lt;a href="http://en.wikipedia.org/wiki/Language_Integrated_Query"&gt;LINQ&lt;/a&gt; queries
inside of inline tasks without any additional setup. Here is the result of executing
the Demo target on this script. 
&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" src="http://www.sedodream.com/content/binary/012210_0401_MSBuild40In2.png"&gt; 
&lt;/p&gt;
&lt;p&gt;
Another thing to notice is the &lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt;Using&lt;/strong&gt;&lt;/span&gt; element
under the &lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt;Task&lt;/strong&gt;&lt;/span&gt; element.
This injects a &lt;a href="http://msdn.microsoft.com/en-us/library/yh598w02%28VS.100%29.aspx"&gt;Using&lt;/a&gt; statement
into the generated class for the given namespace. If you need to reference another
assembly you can do this with the &lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;/span&gt; element
under the &lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt;Task&lt;/strong&gt;&lt;/span&gt; element. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,1d80a062-e571-49ee-b7ad-fb8256299d2e.aspx</comments>
      <category>inline task</category>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
      <category>Visual Studio 2010</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=aa37e1c0-e4c4-4c5d-806b-4926a8d57e03</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,aa37e1c0-e4c4-4c5d-806b-4926a8d57e03.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,aa37e1c0-e4c4-4c5d-806b-4926a8d57e03.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=aa37e1c0-e4c4-4c5d-806b-4926a8d57e03</wfw:commentRss>
      <title>MSBuild 4.0: Inline Tasks</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,aa37e1c0-e4c4-4c5d-806b-4926a8d57e03.aspx</guid>
      <link>http://sedodream.com/2010/01/20/MSBuild40InlineTasks.aspx</link>
      <pubDate>Wed, 20 Jan 2010 22:31:12 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;This post contains based on .NET 4.0 Beta 2 and Visual Studio 2010 Beta 2 which
may change. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
If you didn't already know, MSBuild will have a new version shipped with .NET 4.0
(Visual Studio 2010 will use this new version). I will cover many of those features
here. This is the first in a series of posts that I will make regarding &lt;a href="http://msdn.microsoft.com/en-us/library/dd393574%28VS.100%29.aspx"&gt;MSBuild
4.0&lt;/a&gt;. One of the big additions to MSBuild 4.0 is &lt;a href="http://msdn.microsoft.com/en-us/library/dd722601%28VS.100%29.aspx"&gt;Inline
Tasks&lt;/a&gt;. I'm pretty excited about this new addition. The story before was if you
wanted to perform any action it was always through a &lt;a href="http://msdn.microsoft.com/en-us/library/7z253716%28VS.100%29.aspx"&gt;Task&lt;/a&gt;.
Which worked pretty well, but the major drawback is that the tasks needed to be written
in code and then compiled into an assembly in order for it to be used. What this meant
was if you wanted to perform an action (&lt;em&gt;however simple&lt;/em&gt;) that wasn't covered
out of the box you would have to look for 3&lt;sup&gt;rd&lt;/sup&gt; party tasks or write one
yourself. This is time consuming and can be tricky from a "&lt;em&gt;deployment&lt;/em&gt;" perspective.
Now with Inline Tasks you can declare the behavior of the task right inside of the
MSBuild file itself. 
&lt;/p&gt;
&lt;h1&gt;Inline Task 
&lt;/h1&gt;
&lt;p&gt;
The way that Inline Tasks are supported is by using the &lt;a href="http://msdn.microsoft.com/en-us/library/t41tzex2%28VS.100%29.aspx"&gt;UsingTask&lt;/a&gt; XML
element. This element was around before but it has some new options. If you read my &lt;a href="http://www.amazon.com/gp/product/0735626286?ie=UTF8&amp;amp;tag=sedodream-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=0735626286"&gt;book&lt;/a&gt;,
you probably saw a few different Hello World tasks that I created. In order to demonstrate
Inline Tasks I have taken a similar set of examples. Take a look at the project file
(&lt;em&gt;IT-HelloWorld-01.proj&lt;/em&gt;) below. 
&lt;/p&gt;
&lt;div style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1pt; PADDING-LEFT: 4pt; PADDING-RIGHT: 4pt; BACKGROUND: #d9d9d9; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1pt; mso-element: para-border-div; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217"&gt;
&lt;p style="MARGIN: 10pt 0in 0pt" class="Code-BlockCxSpFirst"&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;&amp;lt;!--&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;Sample Demonstrates Inline
Tasks&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;© 2010 Sayed Ibrahim Hashimi &lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;--&amp;gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;&amp;lt;Project ToolsVersion="4.0"
DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&amp;gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;!--?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /--&gt;
&lt;o:p&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/strong&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;UsingTask&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TaskName="HelloWorld"&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TaskFactory="CodeTaskFactory"&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"
&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Task&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Code
Type="Fragment" Language="cs"&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Log.LogMessage("Hello
World!");&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;/Code&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/Task&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/UsingTask&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;o:p&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/strong&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;Target
Name="Demo"&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;HelloWorld
/&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/Target&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;o:p&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/strong&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="Code-BlockCxSpLast"&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;&amp;lt;/Project&amp;gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
For this basic inline task here are the key things to note, the name of the task is
specified in the &lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt;TaskName&lt;/strong&gt;&lt;/span&gt; attribute.
You will use this like you would any other task inside of targets. The definition
of the task will be contained in the Code XML element. In order to call that task,
I use the syntax &lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt;&amp;lt;HelloWorld
/&amp;gt;&lt;/strong&gt;&lt;/span&gt; inside of the Demo target. The same exact way "classic" tasks
are called. Here is the result. 
&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" src="http://www.sedodream.com/content/binary/012010_2231_MSBuild40In1.png"&gt; 
&lt;/p&gt;
&lt;p&gt;
The result shown above is as expected. 
&lt;/p&gt;
&lt;h1&gt;Inline Task with Parameters 
&lt;/h1&gt;
&lt;p&gt;
You can also make inline tasks with parameters, both required and optional. Here is
an example (IT-HelloWorld-02.proj) with a lone required parameter. 
&lt;/p&gt;
&lt;div style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1pt; PADDING-LEFT: 4pt; PADDING-RIGHT: 4pt; BACKGROUND: #d9d9d9; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1pt; mso-element: para-border-div; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217"&gt;
&lt;p style="MARGIN: 10pt 0in 0pt" class="Code-BlockCxSpFirst"&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;&amp;lt;!--&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;Sample Demonstrates Inline
Tasks&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;© 2010 Sayed Ibrahim Hashimi &lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;--&amp;gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;&amp;lt;Project ToolsVersion="4.0"
DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&amp;gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;o:p&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/strong&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;UsingTask&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TaskName="HelloWorld"&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TaskFactory="CodeTaskFactory"&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"
&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;ParameterGroup&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Name
Required="true"/&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/ParameterGroup&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Task&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Code
Type="Fragment" Language="cs"&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Log.LogMessage(string.Format("Hello
{0}",Name));&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/Code&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/Task&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/UsingTask&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;o:p&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/strong&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;YourName
Condition=" '$(YourName)'=='' "&amp;gt;Sayed&amp;lt;/YourName&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;&amp;nbsp; &lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;Target
Name="Demo"&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;HelloWorld
Name="$(YourName)" /&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/Target&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;o:p&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/strong&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;Target
Name="DemoWithNoName"&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;!--
This shows the result if you don't pass in a required param --&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;HelloWorld
/&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#008000"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/Target&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;&amp;nbsp; &lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="Code-BlockCxSpLast"&gt;
&lt;strong&gt;&lt;font color="#008000" face="Consolas" size="3"&gt;&amp;lt;/Project&amp;gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
If you take a look at the UsingTask declaration above you will see that I included
a &lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt;ParameterGroup&lt;/strong&gt;&lt;/span&gt; element.
All parameters must be included under that element. In this case we just have one.
If we execute the Demo target the result will be as follows. 
&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" src="http://www.sedodream.com/content/binary/012010_2231_MSBuild40In2.png"&gt; 
&lt;/p&gt;
&lt;p&gt;
We can see that the message was sent to the console as we expected. You can execute
the &lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt;DemoWithNoName&lt;/strong&gt;&lt;/span&gt; if
you are interested in verifying that MSBuild will ensure that required parameters
are set. 
&lt;/p&gt;
&lt;h1&gt;Inline Tasks with Output Parameter 
&lt;/h1&gt;
&lt;p&gt;
You can also create your own inline tasks which have one or more output parameters.
You will define those output parameters under the ParameterGroup element and use the
Output="true" attribute. Take a look at IT-HelloWorld-03.proj below. 
&lt;/p&gt;
&lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt; &lt;/strong&gt;
&lt;div style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1pt; PADDING-LEFT: 4pt; PADDING-RIGHT: 4pt; BACKGROUND: #d9d9d9; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1pt; mso-element: para-border-div; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 217"&gt;&lt;strong&gt; 
&lt;p style="MARGIN: 10pt 0in 0pt" class="Code-BlockCxSpFirst"&gt;
&lt;font size="3"&gt;&amp;lt;!--&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;Sample Demonstrates Inline Tasks&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;© 2010 Sayed Ibrahim Hashimi &lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;--&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&amp;lt;Project ToolsVersion="4.0" DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;o:p&gt;
&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;UsingTask&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TaskName="HelloWorld"&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TaskFactory="CodeTaskFactory"&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"
&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;ParameterGroup&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Name
Required="true"/&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;TaskMessage
Output="true"/&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/ParameterGroup&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Task&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Code
Type="Fragment" Language="cs"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TaskMessage
= string.Format("Hello {0}",Name);&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Log.LogMessage(TaskMessage);&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/Code&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/Task&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/UsingTask&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;o:p&gt;
&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;YourName
Condition=" '$(YourName)'=='' "&amp;gt;Sayed&amp;lt;/YourName&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;font size="3"&gt;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;Target Name="Demo"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;HelloWorld
Name="$(YourName)"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Output
PropertyName="MsgFromTask" TaskParameter="TaskMessage"/&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/HelloWorld&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Message
Text="Message from task: $(MsgFromTask)" Importance="high" /&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;font size="3"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/Target&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt" class="Code-BlockCxSpMiddle"&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;font size="3"&gt;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/strong&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="Code-BlockCxSpLast"&gt;
&lt;strong&gt;&lt;font size="3"&gt;&amp;lt;/Project&amp;gt;&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
In this example I created a &lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt;HelloWorld&lt;/strong&gt;&lt;/span&gt; task
to output the entire message back to the calling MSBuild task invocation inside the
target. This output parameter is the &lt;span style="FONT-FAMILY: Consolas; COLOR: green"&gt;&lt;strong&gt;TaskMessage&lt;/strong&gt;&lt;/span&gt; parameter.
Inside the Demo target I call the task and then print the value that was passed back
from the task. Here is the result of that. 
&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" src="http://www.sedodream.com/content/binary/012010_2231_MSBuild40In3.png"&gt; 
&lt;/p&gt;
&lt;p&gt;
From here we can see that the value was correctly sent back to the script. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
There is a lot more to inline tasks and I plan on covering more features very soon
here, but this should get you started. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;
&lt;/span&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,aa37e1c0-e4c4-4c5d-806b-4926a8d57e03.aspx</comments>
      <category>inline task</category>
      <category>MSBuild</category>
      <category>MSBuild 4.0</category>
      <category>Visual Studio 2010</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=abe77d44-300a-400e-b50a-10fd57429e78</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,abe77d44-300a-400e-b50a-10fd57429e78.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,abe77d44-300a-400e-b50a-10fd57429e78.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=abe77d44-300a-400e-b50a-10fd57429e78</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I have a new video posted discussing MSBuild, you can see this video at <a href="http://www.dnrtv.com/default.aspx?showNum=158">http://www.dnrtv.com/default.aspx?showNum=158</a>.
This is a continuation of my <a href="http://www.dnrtv.com/default.aspx?showNum=145">first
appearance</a> discussing on <a href="http://www.dnrtv.com">dnrtv.com</a>. Take a
look and let me know if there are any particular topics you'd like for me to discuss.
One of the topics I discuss in this video is Open Source MSBuild tasks. One of the
most useful task libraries is the <a href="http://msbuildextensionpack.codeplex.com/">MSBuild
Extension Pack</a>, there is a great set of tasks there. If you haven't seen it already
you should take a look. 
</p>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>MSBuild Video</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,abe77d44-300a-400e-b50a-10fd57429e78.aspx</guid>
      <link>http://sedodream.com/2009/11/19/MSBuildVideo.aspx</link>
      <pubDate>Thu, 19 Nov 2009 03:20:40 GMT</pubDate>
      <description>&lt;p&gt;
I have a new video posted discussing MSBuild, you can see this video at &lt;a href="http://www.dnrtv.com/default.aspx?showNum=158"&gt;http://www.dnrtv.com/default.aspx?showNum=158&lt;/a&gt;.
This is a continuation of my &lt;a href="http://www.dnrtv.com/default.aspx?showNum=145"&gt;first
appearance&lt;/a&gt; discussing on &lt;a href="http://www.dnrtv.com"&gt;dnrtv.com&lt;/a&gt;. Take a
look and let me know if there are any particular topics you'd like for me to discuss.
One of the topics I discuss in this video is Open Source MSBuild tasks. One of the
most useful task libraries is the &lt;a href="http://msbuildextensionpack.codeplex.com/"&gt;MSBuild
Extension Pack&lt;/a&gt;, there is a great set of tasks there. If you haven't seen it already
you should take a look. 
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,abe77d44-300a-400e-b50a-10fd57429e78.aspx</comments>
      <category>dnrTV</category>
      <category>MSBuild</category>
      <category>Video</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=3bb4890a-3ab2-485e-8788-98f7830f2925</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,3bb4890a-3ab2-485e-8788-98f7830f2925.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,3bb4890a-3ab2-485e-8788-98f7830f2925.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=3bb4890a-3ab2-485e-8788-98f7830f2925</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The other day someone sent me an email asking me about reserved characters in MSBuild
targets names. I didn't actually know of a published list of such a reference so I
contacted the MSBuild team for more information and here is what I found out. 
</p>
        <p>
Illegal characters in target names 
</p>
        <p>
          <span style="color:#4f6228">
            <strong> '$', '@', '(', ')', '%', '*', '?', '.' </strong>
          </span>
        </p>
        <p>
Properties, items and item metadata elements must start with either a letter [a-Z]
or an underscore (_). 
</p>
        <p>
Characters after the initial character for properties, items and item metadata can
include: letters, numbers, underscore, and dashes (-). 
</p>
        <p>
        </p>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>MSBuild Reserved Characters</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,3bb4890a-3ab2-485e-8788-98f7830f2925.aspx</guid>
      <link>http://sedodream.com/2009/11/13/MSBuildReservedCharacters.aspx</link>
      <pubDate>Fri, 13 Nov 2009 07:36:00 GMT</pubDate>
      <description>&lt;p&gt;
The other day someone sent me an email asking me about reserved characters in MSBuild
targets names. I didn't actually know of a published list of such a reference so I
contacted the MSBuild team for more information and here is what I found out. 
&lt;/p&gt;
&lt;p&gt;
Illegal characters in target names 
&lt;/p&gt;
&lt;p&gt;
&lt;span style="color:#4f6228"&gt;&lt;strong&gt; '$', '@', '(', ')', '%', '*', '?', '.' &lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Properties, items and item metadata elements must start with either a letter [a-Z]
or an underscore (_). 
&lt;/p&gt;
&lt;p&gt;
Characters after the initial character for properties, items and item metadata can
include: letters, numbers, underscore, and dashes (-). 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,3bb4890a-3ab2-485e-8788-98f7830f2925.aspx</comments>
      <category>MSBuild</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=558135c9-c6c7-4cff-89f7-c8ec550cbd4c</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,558135c9-c6c7-4cff-89f7-c8ec550cbd4c.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,558135c9-c6c7-4cff-89f7-c8ec550cbd4c.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=558135c9-c6c7-4cff-89f7-c8ec550cbd4c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
If you are using ASP.NET MVC you might have noticed that you will not be alerted of
build errors that exist in your views until you navigate to those pages. When you
do so you'll get a runtime error <span style="font-family:Wingdings">L</span> Thankfully
there is a very easy way to change this. All you have to do is open the project file
and change the value for the <strong>MvcBuildViews</strong> property to true. To do
this, follow these steps. 
</p>
        <ol>
          <li>
Right-click on the MVC project and select 'Unload Project' 
</li>
          <li>
Right-click on the unloaded MVC project and select 'Edit …'. This will open up the
project file itself, which of course is an <a href="http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx">MSBuild</a> file. 
</li>
          <li>
Look for the MvcBuildView property and set its value to true. It should be <span style="font-family:Courier New; font-size:10pt"><span style="color:blue">&lt;</span><span style="color:#a31515">MvcBuildViews</span><span style="color:blue">&gt;</span>true<span style="color:blue">&lt;/</span><span style="color:#a31515">MvcBuildViews</span><span style="color:blue">&gt;</span></span></li>
          <li>
Save the project file, right-click on the MVC project again and select 'Reload project' 
</li>
        </ol>
        <p>
After this if you introduce any build errors into the views then you will be notified
when the project is built. 
</p>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>ASP.NET MVC: Build Views</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,558135c9-c6c7-4cff-89f7-c8ec550cbd4c.aspx</guid>
      <link>http://sedodream.com/2009/09/14/ASPNETMVCBuildViews.aspx</link>
      <pubDate>Mon, 14 Sep 2009 04:37:16 GMT</pubDate>
      <description>&lt;p&gt;
If you are using ASP.NET MVC you might have noticed that you will not be alerted of
build errors that exist in your views until you navigate to those pages. When you
do so you'll get a runtime error &lt;span style="font-family:Wingdings"&gt;L&lt;/span&gt; Thankfully
there is a very easy way to change this. All you have to do is open the project file
and change the value for the &lt;strong&gt;MvcBuildViews&lt;/strong&gt; property to true. To do
this, follow these steps. 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Right-click on the MVC project and select 'Unload Project' 
&lt;/li&gt;
&lt;li&gt;
Right-click on the unloaded MVC project and select 'Edit …'. This will open up the
project file itself, which of course is an &lt;a href="http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx"&gt;MSBuild&lt;/a&gt; file. 
&lt;/li&gt;
&lt;li&gt;
Look for the MvcBuildView property and set its value to true. It should be &lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;MvcBuildViews&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;MvcBuildViews&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; 
&lt;/li&gt;
&lt;li&gt;
Save the project file, right-click on the MVC project again and select 'Reload project' 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
After this if you introduce any build errors into the views then you will be notified
when the project is built. 
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,558135c9-c6c7-4cff-89f7-c8ec550cbd4c.aspx</comments>
      <category>ASP.NET MVC</category>
      <category>msbuild</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=6052c665-ae2c-48b1-8cda-f94272698a97</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,6052c665-ae2c-48b1-8cda-f94272698a97.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,6052c665-ae2c-48b1-8cda-f94272698a97.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=6052c665-ae2c-48b1-8cda-f94272698a97</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This weekend I will be speaking at the <a href="http://www.tallycodecamp.org/2009/">Tallahassee
Code Camp</a> on Saturday September 5, 2009. I will be presenting two sessions which
are: 
</p>
        <h2>ASP.NET Custom View Helpers 
</h2>
        <blockquote>
          <p>
If you have been using ASP.NET MVC then you certainly have been using some of the
built in<br />
view helper methods that are available, you know those expressions like<span style="color: green; font-family: Consolas;"><br />
Html.TextBox("textBoxName")</span> and <span style="color: green; font-family: Consolas;">Html.ValidationMessage("Required")</span>.<br />
View helpers are nothing more than extension methods which create HTML that is injected
into<br />
your views based on the method and its parameters. Creating your own view helpers
is very<br />
simple and can be extremely beneficial. By writing your own custom view helpers you
will<br />
benefit in at least the following ways 
</p>
        </blockquote>
        <blockquote>
          <blockquote>
            <ul>
              <li>
Simplifies Your Views 
</li>
              <li>
Easies Rehydrating HTML Elements with ModelState Values 
</li>
              <li>
Standardizes the Creation of Common HTML <em>Components</em></li>
              <li>
Helps you Implement the DRY (Don't Repeat Yourself) Principal 
</li>
            </ul>
          </blockquote>
        </blockquote>
        <blockquote>
          <p>
We will take an in depth look at how you can easily and effectively create your own
view helpers. We will also discuss how the default view helpers were created and the
benefits that they provide. 
</p>
        </blockquote>
        <h2>Utilizing Web Deployment Projects 
</h2>
        <p>
          <span style="font-family: Times New Roman; font-size: 12pt;">In this session we will
take a look at how Web Deployment Projects can be used to assist in the deployment
of web sites and web applications; including ASP.NET Web Applications and ASP.NET
MVC Web Applications. We will give an overview of what Web Deployment Projects are
and the functionality that is available out of the box. A Web Deployment Project is
a wrapper for the aspnet_compiler.exe tool in the form of an MSBuild project and adds
value to using the tool itself. Because they are MSBuild files we are able to customize
and extend the process. We will discuss how we can customize the process to perform
common steps such as </span>
        </p>
        <ol style="margin-left: 108pt;">
          <li>
            <span style="font-family: Times New Roman; font-size: 12pt;">Creating Virtual Directories </span>
          </li>
          <li>
            <span style="font-family: Times New Roman; font-size: 12pt;">Updating values in the
web.config file </span>
          </li>
          <li>
            <span style="font-family: Times New Roman; font-size: 12pt;">Encrypting the web.config
file </span>
          </li>
          <li>
            <span style="font-family: Times New Roman; font-size: 12pt;">Minimizing JavaScript
files </span>
          </li>
          <li>
            <span style="font-family: Times New Roman; font-size: 12pt;">Versioning the Assemblies </span>
          </li>
        </ol>
        <p>
 
</p>
        <p>
If you are in the area and interested in these topics make sure to drop in! 
</p>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>Speaking at Tallahassee Code Camp</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,6052c665-ae2c-48b1-8cda-f94272698a97.aspx</guid>
      <link>http://sedodream.com/2009/09/04/SpeakingAtTallahasseeCodeCamp.aspx</link>
      <pubDate>Fri, 04 Sep 2009 04:40:20 GMT</pubDate>
      <description>&lt;p&gt;
This weekend I will be speaking at the &lt;a href="http://www.tallycodecamp.org/2009/"&gt;Tallahassee
Code Camp&lt;/a&gt; on Saturday September 5, 2009. I will be presenting two sessions which
are: 
&lt;/p&gt;
&lt;h2&gt;ASP.NET Custom View Helpers 
&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;
If you have been using ASP.NET MVC then you certainly have been using some of the
built in&lt;br&gt;
view helper methods that are available, you know those expressions like&lt;span style="color: green; font-family: Consolas;"&gt;
&lt;br&gt;
Html.TextBox("textBoxName")&lt;/span&gt; and &lt;span style="color: green; font-family: Consolas;"&gt;Html.ValidationMessage("Required")&lt;/span&gt;.&lt;br&gt;
View helpers are nothing more than extension methods which create HTML that is injected
into&lt;br&gt;
your views based on the method and its parameters. Creating your own view helpers
is very&lt;br&gt;
simple and can be extremely beneficial. By writing your own custom view helpers you
will&lt;br&gt;
benefit in at least the following ways 
&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
Simplifies Your Views 
&lt;/li&gt;
&lt;li&gt;
Easies Rehydrating HTML Elements with ModelState Values 
&lt;/li&gt;
&lt;li&gt;
Standardizes the Creation of Common HTML &lt;em&gt;Components&lt;/em&gt; 
&lt;/li&gt;
&lt;li&gt;
Helps you Implement the DRY (Don't Repeat Yourself) Principal 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;
&lt;p&gt;
We will take an in depth look at how you can easily and effectively create your own
view helpers. We will also discuss how the default view helpers were created and the
benefits that they provide. 
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Utilizing Web Deployment Projects 
&lt;/h2&gt;
&lt;p&gt;
&lt;span style="font-family: Times New Roman; font-size: 12pt;"&gt;In this session we will
take a look at how Web Deployment Projects can be used to assist in the deployment
of web sites and web applications; including ASP.NET Web Applications and ASP.NET
MVC Web Applications. We will give an overview of what Web Deployment Projects are
and the functionality that is available out of the box. A Web Deployment Project is
a wrapper for the aspnet_compiler.exe tool in the form of an MSBuild project and adds
value to using the tool itself. Because they are MSBuild files we are able to customize
and extend the process. We will discuss how we can customize the process to perform
common steps such as &lt;/span&gt;
&lt;/p&gt;
&lt;ol style="margin-left: 108pt;"&gt;
&lt;li&gt;
&lt;span style="font-family: Times New Roman; font-size: 12pt;"&gt;Creating Virtual Directories &lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;span style="font-family: Times New Roman; font-size: 12pt;"&gt;Updating values in the
web.config file &lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;span style="font-family: Times New Roman; font-size: 12pt;"&gt;Encrypting the web.config
file &lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;span style="font-family: Times New Roman; font-size: 12pt;"&gt;Minimizing JavaScript
files &lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;span style="font-family: Times New Roman; font-size: 12pt;"&gt;Versioning the Assemblies &lt;/span&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
If you are in the area and interested in these topics make sure to drop in! 
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,6052c665-ae2c-48b1-8cda-f94272698a97.aspx</comments>
      <category>ASP.NET MVC</category>
      <category>msbuild</category>
      <category>speaking</category>
      <category>Web Deployment Projects</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=1dfa4394-990b-4fcc-b483-467a6614fd92</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,1dfa4394-990b-4fcc-b483-467a6614fd92.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,1dfa4394-990b-4fcc-b483-467a6614fd92.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=1dfa4394-990b-4fcc-b483-467a6614fd92</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
On Friday August 28 and Saturday August 29 there will be a conference in St. Louis
called <a href="http://www.stlouisdayofdotnet.com/">St. Louis Day of .NET</a> that
I will be speaking at. Here is the outline 
</p>
        <blockquote>
          <p>
            <span style="text-decoration:underline">
              <strong>Simplify build and deployment of ASP.NET
sites with Web Deployment Projects </strong>
            </span>
          </p>
        </blockquote>
        <blockquote>
          <p>
When you are creating ASP.NET sites, (either ASP.NET web site / ASP.NET Web Project
/ ASP.NET MVC Project / etc) you will need to deploy the site to machines which will
host them. Classically there were two options; xcopy the actual source to the live
server and let them be compiled on demand or you could use the aspnet_compiler.exe
and aspnet_merge.exe tools to pre-compile the website for you. The little known, yet
extremely useful, Web Deployment Projects (an add on for Visual Studio) can greatly
simplify the process of build and deployment. Web Deployment Projects will take care
of the complexities of the aspnet_compiler.exe and the aspnet_merge.exe tool for you
by way of a tight UI integration into Visual Studio itself. Aslo Web Deployment Projects
are MSBuild files so you can extend and customize the process to suit your exact needs.
In this session we will introduce Web Deployment Project, show that you can perform
very powerful actions without writing a single line of code (or even text)! We will
also dive into the MSBuild file that is the Web Deployment Project and show how to
customize the process. 
</p>
        </blockquote>
        <p>
This session talks about <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=0AA30AE8-C73B-4BDD-BB1B-FE697256C459&amp;displaylang=en">Web
Deployment Projects</a> (<a href="http://msdn.microsoft.com/en-us/asp.net/aa336619.aspx">2005
version</a>) and how they can help in the build and deployment process. If you are
going to be attending and interested in build and deployment of ASP.NET web sites
and projects then you don't want to miss this session. 
</p>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>Speaking at St. Louis Day of .NET</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,1dfa4394-990b-4fcc-b483-467a6614fd92.aspx</guid>
      <link>http://sedodream.com/2009/08/26/SpeakingAtStLouisDayOfNET.aspx</link>
      <pubDate>Wed, 26 Aug 2009 03:19:16 GMT</pubDate>
      <description>&lt;p&gt;
On Friday August 28 and Saturday August 29 there will be a conference in St. Louis
called &lt;a href="http://www.stlouisdayofdotnet.com/"&gt;St. Louis Day of .NET&lt;/a&gt; that
I will be speaking at. Here is the outline 
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
&lt;span style="text-decoration:underline"&gt;&lt;strong&gt;Simplify build and deployment of ASP.NET
sites with Web Deployment Projects &lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;
&lt;p&gt;
When you are creating ASP.NET sites, (either ASP.NET web site / ASP.NET Web Project
/ ASP.NET MVC Project / etc) you will need to deploy the site to machines which will
host them. Classically there were two options; xcopy the actual source to the live
server and let them be compiled on demand or you could use the aspnet_compiler.exe
and aspnet_merge.exe tools to pre-compile the website for you. The little known, yet
extremely useful, Web Deployment Projects (an add on for Visual Studio) can greatly
simplify the process of build and deployment. Web Deployment Projects will take care
of the complexities of the aspnet_compiler.exe and the aspnet_merge.exe tool for you
by way of a tight UI integration into Visual Studio itself. Aslo Web Deployment Projects
are MSBuild files so you can extend and customize the process to suit your exact needs.
In this session we will introduce Web Deployment Project, show that you can perform
very powerful actions without writing a single line of code (or even text)! We will
also dive into the MSBuild file that is the Web Deployment Project and show how to
customize the process. 
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
This session talks about &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=0AA30AE8-C73B-4BDD-BB1B-FE697256C459&amp;amp;displaylang=en"&gt;Web
Deployment Projects&lt;/a&gt; (&lt;a href="http://msdn.microsoft.com/en-us/asp.net/aa336619.aspx"&gt;2005
version&lt;/a&gt;) and how they can help in the build and deployment process. If you are
going to be attending and interested in build and deployment of ASP.NET web sites
and projects then you don't want to miss this session. 
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,1dfa4394-990b-4fcc-b483-467a6614fd92.aspx</comments>
      <category>Deployment</category>
      <category>msbuild</category>
      <category>speaking</category>
      <category>Web Deployment Projects</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=c448953f-53d5-4580-aa63-30e7d1bba57c</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,c448953f-53d5-4580-aa63-30e7d1bba57c.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,c448953f-53d5-4580-aa63-30e7d1bba57c.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c448953f-53d5-4580-aa63-30e7d1bba57c</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The other day I had a reader ask me about the difference between 32 and 64 bit builds.
Here is his email to me. 
</p>
        <blockquote>
          <p>
I have your Using MSBuild book and I have been learning much with it. One aspect that
I cannot seem to find online or in the book is that of the build server environment.
Specifically how the choice of Server OS affects your builds and subsequent testing
environments. The aspects of most of our build environments are TFS2008 and MSbuild
servers running on Server 2003 32bit Standard some have VSTS Team Test edition 2008. 
</p>
        </blockquote>
        <blockquote>
          <p>
Here are some questions I am looking for answers on. 
</p>
        </blockquote>
        <blockquote>
          <p>
If my dev team is writing an app for run on 64 bit servers and they will be running
VS Team test 2008 on the same build server then do they want VS 2008 64-bit installed
as their build server? What could the pitfalls be if they are running builds and tests
or just build for that matter on Server 2008 32-bit or 2003 32-bit? Or even just running
builds? 
</p>
        </blockquote>
        <blockquote>
          <p>
If a team is developing an app for 32 bit server 2003 but your build machine is Server2008
64-bit, what could go wrong there? Also in many of the many combinations here are
there any false hopes, such as building 32bit on a 64 machine may work but… 
</p>
        </blockquote>
        <blockquote>
          <p>
Additionally what is to be expected of WOW in this context 64-bit will run Windows
on Windows on some apps I think but is this a best practice? 
</p>
        </blockquote>
        <blockquote>
          <p>
There are so many combinations of the way that an environment could be setup. A blog
post exploring these different setups would be great if you could manage it. I just
want to make sure my teams are getting what they need and are getting the expected
results. Thanks much for your time. 
</p>
        </blockquote>
        <p>
I don't have too much knowledge in this area myself so I asked a couple other guys
(<a href="http://blog.bartholomew.id.au/">William Bartholomew</a>, <a href="http://www.ControlStatements.com">JB
Brown</a>, <a href="http://blogs.msdn.com/jimlamb/">Jim Lamb</a>, and <a href="http://blogs.msdn.com/granth/">Grant
Holliday</a>) and here is some related info. 
</p>
        <p>
Assuming this is a .NET application the bitness of the build machine has no effect
on the bitness of the produced application, this is controlled entirely by the project's
compilation settings. Basically: 
</p>
        <p>
1. If the assembly is configured for Any CPU then it will run as x64 on a 64-bit machine
and as x86 on a 32-bit machine. 
</p>
        <p>
2. If the assembly is configured for x86 then it will run as WOW64 on a 64-bit machine
(i.e. a 32-bit process) and as x86 on a 32-bit machine. 
</p>
        <p>
3. If the assembly is configured for x64 then it will run as x64 on a 64-bit machine
and will fail to run on a 32-bit machine. For some related info on this see<a href="http://blogs.msdn.com/ricom/archive/2009/06/10/visual-studio-why-is-there-no-64-bit-version.aspx"> Visual
Studio: Why is there no 64 bit version? (yet)</a></p>
        <p>
The bitness of a process is determined by the compilation settings for the entry point
(i.e. the executable)... You need to ensure that dependencies are compiled with an
appropriate bitness for their host process. For example, devenv.exe always runs as
a 32-bit process so if you create a Visual Studio add-in that's compiled for 64-bit
only then it will never be loadable by Visual Studio. Basically it comes down to that
a process can always load a dependency that's compiled as Any CPU or the same bitness
as the process. 
</p>
        <p>
          <span style="text-decoration:underline">
            <strong>A few extra points about deployment
and runtime. </strong>
          </span>
        </p>
        <p>
4 - Extra considerations need to be made if you are dealing with multiple web sites
under IIS 6. Since IIS 6 is a single process it is the entry point and determines
the 64 bitness of the process it can only be in 1 "bitness" - so all sites under IIS
have to be compatible with that bitness choice - IE - no running a 32 bit website
and a 64 bit website under the same IIS 6 process. For more info on this see <a href="http://support.microsoft.com/default.aspx/kb/894435">How
to switch between the 32-bit versions of ASP.NET 1.1 and the 64-bit version of ASP.NET
2.0 on a 64-bit version of Windows.</a><br /><br />
5. While a 64 bit entry point/process may load a dependency that is compiled in Any
CPU or x64 - it doesn't guarantee that those dependencies are run-time 64 bit process
compatible. For example they may use COM-interop which will pass all compile time
checks but fail at runtime. You'll need to do your due-diligence here on COM interop
and 3rd party assemblies being used.<br /><br />
6. If your assemblies need regsrv32'd and run as a 32 bit WOW process remember that
you need to use the 32 bit version of regsvr32.exe to get it registered into the right
hive on that 64 bit OS. 
<br /><br />
7. There is a similar thing to #6 for installutil.exe - a 64 bit version and a 32
bit WOW version 
</p>
        <p>
        </p>
        <p>
        </p>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>MSBuild: Building 64 bit versus 32 bit</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,c448953f-53d5-4580-aa63-30e7d1bba57c.aspx</guid>
      <link>http://sedodream.com/2009/08/21/MSBuildBuilding64BitVersus32Bit.aspx</link>
      <pubDate>Fri, 21 Aug 2009 02:58:27 GMT</pubDate>
      <description>&lt;p&gt;
The other day I had a reader ask me about the difference between 32 and 64 bit builds.
Here is his email to me. 
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
I have your Using MSBuild book and I have been learning much with it. One aspect that
I cannot seem to find online or in the book is that of the build server environment.
Specifically how the choice of Server OS affects your builds and subsequent testing
environments. The aspects of most of our build environments are TFS2008 and MSbuild
servers running on Server 2003 32bit Standard some have VSTS Team Test edition 2008. 
&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;
&lt;p&gt;
Here are some questions I am looking for answers on. 
&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;
&lt;p&gt;
If my dev team is writing an app for run on 64 bit servers and they will be running
VS Team test 2008 on the same build server then do they want VS 2008 64-bit installed
as their build server? What could the pitfalls be if they are running builds and tests
or just build for that matter on Server 2008 32-bit or 2003 32-bit? Or even just running
builds? 
&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;
&lt;p&gt;
If a team is developing an app for 32 bit server 2003 but your build machine is Server2008
64-bit, what could go wrong there? Also in many of the many combinations here are
there any false hopes, such as building 32bit on a 64 machine may work but… 
&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;
&lt;p&gt;
Additionally what is to be expected of WOW in this context 64-bit will run Windows
on Windows on some apps I think but is this a best practice? 
&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;
&lt;p&gt;
There are so many combinations of the way that an environment could be setup. A blog
post exploring these different setups would be great if you could manage it. I just
want to make sure my teams are getting what they need and are getting the expected
results. Thanks much for your time. 
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
I don't have too much knowledge in this area myself so I asked a couple other guys
(&lt;a href="http://blog.bartholomew.id.au/"&gt;William Bartholomew&lt;/a&gt;, &lt;a href="http://www.ControlStatements.com"&gt;JB
Brown&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/jimlamb/"&gt;Jim Lamb&lt;/a&gt;, and &lt;a href="http://blogs.msdn.com/granth/"&gt;Grant
Holliday&lt;/a&gt;) and here is some related info. 
&lt;/p&gt;
&lt;p&gt;
Assuming this is a .NET application the bitness of the build machine has no effect
on the bitness of the produced application, this is controlled entirely by the project's
compilation settings. Basically: 
&lt;/p&gt;
&lt;p&gt;
1. If the assembly is configured for Any CPU then it will run as x64 on a 64-bit machine
and as x86 on a 32-bit machine. 
&lt;/p&gt;
&lt;p&gt;
2. If the assembly is configured for x86 then it will run as WOW64 on a 64-bit machine
(i.e. a 32-bit process) and as x86 on a 32-bit machine. 
&lt;/p&gt;
&lt;p&gt;
3. If the assembly is configured for x64 then it will run as x64 on a 64-bit machine
and will fail to run on a 32-bit machine. For some related info on this see&lt;a href="http://blogs.msdn.com/ricom/archive/2009/06/10/visual-studio-why-is-there-no-64-bit-version.aspx"&gt; Visual
Studio: Why is there no 64 bit version? (yet)&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
The bitness of a process is determined by the compilation settings for the entry point
(i.e. the executable)... You need to ensure that dependencies are compiled with an
appropriate bitness for their host process. For example, devenv.exe always runs as
a 32-bit process so if you create a Visual Studio add-in that's compiled for 64-bit
only then it will never be loadable by Visual Studio. Basically it comes down to that
a process can always load a dependency that's compiled as Any CPU or the same bitness
as the process. 
&lt;/p&gt;
&lt;p&gt;
&lt;span style="text-decoration:underline"&gt;&lt;strong&gt;A few extra points about deployment
and runtime. &lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
4 - Extra considerations need to be made if you are dealing with multiple web sites
under IIS 6. Since IIS 6 is a single process it is the entry point and determines
the 64 bitness of the process it can only be in 1 "bitness" - so all sites under IIS
have to be compatible with that bitness choice - IE - no running a 32 bit website
and a 64 bit website under the same IIS 6 process. For more info on this see &lt;a href="http://support.microsoft.com/default.aspx/kb/894435"&gt;How
to switch between the 32-bit versions of ASP.NET 1.1 and the 64-bit version of ASP.NET
2.0 on a 64-bit version of Windows.&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
5. While a 64 bit entry point/process may load a dependency that is compiled in Any
CPU or x64 - it doesn't guarantee that those dependencies are run-time 64 bit process
compatible. For example they may use COM-interop which will pass all compile time
checks but fail at runtime. You'll need to do your due-diligence here on COM interop
and 3rd party assemblies being used.&lt;br /&gt;
&lt;br /&gt;
6. If your assemblies need regsrv32'd and run as a 32 bit WOW process remember that
you need to use the 32 bit version of regsvr32.exe to get it registered into the right
hive on that 64 bit OS. 
&lt;br /&gt;
&lt;br /&gt;
7. There is a similar thing to #6 for installutil.exe - a 64 bit version and a 32
bit WOW version 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,c448953f-53d5-4580-aa63-30e7d1bba57c.aspx</comments>
      <category>MSBuild</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=a9e5fdb3-0ce4-4a2e-ac2a-244dced55b29</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,a9e5fdb3-0ce4-4a2e-ac2a-244dced55b29.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,a9e5fdb3-0ce4-4a2e-ac2a-244dced55b29.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a9e5fdb3-0ce4-4a2e-ac2a-244dced55b29</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>MSBuild: Executing MSTest Unit Tests</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,a9e5fdb3-0ce4-4a2e-ac2a-244dced55b29.aspx</guid>
      <link>http://sedodream.com/2009/08/13/MSBuildExecutingMSTestUnitTests.aspx</link>
      <pubDate>Thu, 13 Aug 2009 04:11:52 GMT</pubDate>
      <description>&lt;p&gt;
I have seen a couple blog entries about executing MSTest unit tests from MSBuild.
Most recently I saw the &lt;a href="http://scottlaw.knot.org/blog/?p=402"&gt;entry&lt;/a&gt; by &lt;a href="http://scottlaw.knot.org/blog/"&gt;Scott
A. Lawrence&lt;/a&gt;. So I decided to share how I execute MSTest unit tests from &lt;a href="http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx"&gt;MSBuild&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
I created a file named &lt;strong&gt;Build.Common.UnitTest.targets&lt;/strong&gt; which contains
all the behavior that will execute the test cases. This file can then be imported
into whatever scripts that need to execute test cases. The entire file is shown below.
We will discuss afterwards. 
&lt;/p&gt;
&lt;h1&gt;Build.Common.UnitTest.targets 
&lt;/h1&gt;
&lt;p&gt;
&lt;link rel="File-List" href="file:///C:%5CUsers%5CIbrahim%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"&gt;
&lt;link rel="themeData" href="file:///C:%5CUsers%5CIbrahim%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"&gt;
&lt;link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CIbrahim%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves/&gt;
  &lt;w:TrackFormatting/&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF/&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
   &lt;w:SplitPgBreakAndParaMark/&gt;
   &lt;w:DontVertAlignCellWithSp/&gt;
   &lt;w:DontBreakConstrainedForcedTables/&gt;
   &lt;w:DontVertAlignInTxbx/&gt;
   &lt;w:Word11KerningPairs/&gt;
   &lt;w:CachedColBalance/&gt;
   &lt;w:UseFELayout/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:DoNotOptimizeForBrowser/&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val="Cambria Math"/&gt;
   &lt;m:brkBin m:val="before"/&gt;
   &lt;m:brkBinSub m:val="--"/&gt;
   &lt;m:smallFrac m:val="off"/&gt;
   &lt;m:dispDef/&gt;
   &lt;m:lMargin m:val="0"/&gt;
   &lt;m:rMargin m:val="0"/&gt;
   &lt;m:defJc m:val="centerGroup"/&gt;
   &lt;m:wrapIndent m:val="1440"/&gt;
   &lt;m:intLim m:val="subSup"/&gt;
   &lt;m:naryLim m:val="undOvr"/&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:1;
	mso-generic-font-family:roman;
	mso-font-format:other;
	mso-font-pitch:variable;
	mso-font-signature:0 0 0 0 0 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-520092929 1073786111 9 0 415 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-priority:1;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:0in;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-bidi-font-size:10.0pt;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.MsoPapDefault
	{mso-style-type:export-only;
	margin-bottom:10.0pt;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
--&gt;
&lt;/style&gt;
&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin-top:0in;
	mso-para-margin-right:0in;
	mso-para-margin-bottom:10.0pt;
	mso-para-margin-left:0in;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
&lt;/style&gt;
&lt;![endif]--&gt;
&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;xml&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;version&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;encoding&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;utf-8&lt;/span&gt;"&lt;span style="color: blue;"&gt;?&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Project&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;ToolsVersion&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;3.5&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;DefaultTargets&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Build&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt; =======================================================================&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TESTING&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;======================================================================= &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt; Default
build settings go here &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;RunMSTest&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;'$(RunMSTest)'==''&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;RunMSTest&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;BuildInParallel&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;'$(BuildInParallel)'==''&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;BuildInParallel&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Target&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;MSTestValidateSettings&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt; Cleare
out these items &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;ItemGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_RequiredProperties&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Remove&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;@(_RequiredProperties)&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_RequiredItems&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Remove&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;@(_RequiredItems)&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;ItemGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;ItemGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_RequiredProperties&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Include&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;BuildContribRoot&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Value&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;$(BuildContribRoot)&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Value&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_RequiredProperties&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_RequiredProperties&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Include&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;OutputRoot&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Value&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;$(OutputRoot)&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Value&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_RequiredProperties&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_RequiredItems&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Include&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;MSTestProjects&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;RequiredValue&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;@(MSTestProjects)&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;RequiredValue&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;RequiredFilePath&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;%(MSTestProjects.FullPath)&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;RequiredFilePath&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_RequiredItems&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_RequiredItems&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Include&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;AllConfigurations&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;RequiredValue&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;@(AllConfigurations)&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;RequiredValue&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_RequiredItems&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_RequiredItems&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Include&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;AllConfigurations.Configuration&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;RequiredValue&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;%(AllConfigurations.Configuration)&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;RequiredValue&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_RequiredItems&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;ItemGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt; Raise
an error if any value in _RequiredProperties is missing &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Error&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;'%(_RequiredProperties.Value)'==''&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Text&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;Missing
required property [%(_RequiredProperties.Identity)]&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt; Raise
an error if any value in _RequiredItems is empty &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Error&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;'%(_RequiredItems.RequiredValue)'==''&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Text&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;Missing
required item value [%(_RequiredItems.Identity)]&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt; Validate
any file/directory that should exist &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Error&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;'%(_RequiredItems.RequiredFilePath)'
!= '' and !Exists('%(_RequiredItems.RequiredFilePath)')&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Text&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;Unable
to find expeceted path [%(_RequiredItems.RequiredFilePath)] on item [%(_RequiredItems.Identity)]&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Target&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;UsingTask&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;TaskName&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;TestToolsTask&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;AssemblyFile&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;$(BuildContribRoot)TestToolsTask-1.3\Microsoft.VisualStudio.QualityTools.MSBuildTasks.dll&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt; TODO:
Create a ValidateTestSettings target and put it on this list &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;MSTestDependsOn&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;BuildMSTestProjects;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;BeforeMSTest;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;CoreMSTest;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AfterMSTest&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;$(MSTestDependsOn);&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;MSTestDependsOn&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Target&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;MSTest&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;DependsOnTargets&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;$(MSTestDependsOn)&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Target&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;BeforeMSTest&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Target&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;AfterMSTest&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Target&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;CoreMSTest&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;Outputs&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;%(MSTestProjects.Identity)&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Message&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Text&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;Running
MSTest for project [%(MSTestProjects.Identity)]&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Message&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Text&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;MSTestProjects.Directory:
%(MSTestProjects.RootDir)%(MSTestProjects.Directory)&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_CurrentConfig&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;Debug&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;_CurrentConfig&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_SearchPath&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;$(OutputRoot)$(_CurrentConfig)\%(MSTestProjects.Filename)\&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;_SearchPath&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_TestContainers&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_TestContainers&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;TestToolsTask&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;SearchPathRoot&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;%(MSTestProjects.RootDir)%(MSTestProjects.Directory)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;TestContainers&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;$(OutputRoot)$(_CurrentConfig)\%(MSTestProjects.Filename)\bin\%(MSTestProjects.Filename).dll&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt; TODO:
Read in the results of the tests and get all failures and report them here &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Target&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;BuildMSTestProjectsDependsOn&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;BeforeBuildMSTestProjects;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;CoreBuildMSTestProjects;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AfterBuildMSTestProjects;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;$(BuildMSTestProjectsDependsOn);&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;BuildMSTestProjectsDependsOn&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Target&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;BuildMSTestProjects&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;DependsOnTargets&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;$(BuildMSTestProjectsDependsOn)&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Target&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;BeforeBuildMSTestProjects&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Target&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;AfterBuildMSTestProjects&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Target&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;CoreBuildMSTestProjects&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;Outputs&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;%(AllConfigurations.Configuration)&lt;/span&gt;"&lt;span style="color: blue;"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;DependsOnTargets&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;CleanMSTest&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt; Make
sure to do clean build in case test cases were added &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_CurrentConfig&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;%(AllConfigurations.Configuration)&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;_CurrentConfig&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Message&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Text&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;Building
(MSTestProjects.Identity) %(MSTestProjects.Identity)&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;Importance&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;high&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt; Build
the projects here. &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;MSBuild&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Projects&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;%(MSTestProjects.Identity)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&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;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Properties&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;Configuration=$(_CurrentConfig);&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;OutputPath=$(OutputRoot)$(_CurrentConfig)\%(MSTestProjects.Filename)\bin\;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;BaseIntermediateOutputPath=$(OutputRoot)$(_CurrentConfig)\%(MSTestProjects.Filename)\obj\;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;GenerateResourceNeverLockTypeAssemblies=true;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;%(ProjectsToBuild.Properties);&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;$(AllProjectProperties);&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&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;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;BuildInParallel&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;$(BuildInParallel)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&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;/span&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;MSBuild&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Target&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Target&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;CleanMSTest&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;MSBuild&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Projects&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;@(MSTestProjects)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Targets&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;Clean&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Properties&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;Configuration=$(_CurrentConfig);&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;OutputPath=$(OutputRoot)$(_CurrentConfig)\%(MSTestProjects.Filename)\bin\;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&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; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;BaseIntermediateOutputPath=$(OutputRoot)$(_CurrentConfig)\%(MSTestProjects.Filename)\obj\;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;GenerateResourceNeverLockTypeAssemblies=true;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;BuildInParallel&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;$(BuildInParallel)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&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;/span&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Target&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Project&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;/span&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
There are five important targets which are described below. 
&lt;/p&gt;
&lt;div&gt;
&lt;table style="border-collapse: collapse;" border="0"&gt;
&lt;colgroup&gt;
&lt;col style="width: 203px;"&gt;
&lt;col style="width: 435px;"&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;td style="border: 1pt solid rgb(79, 129, 189); padding-left: 7px; padding-right: 7px;"&gt;
&lt;p&gt;
&lt;span style="color: white;"&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-style: solid solid solid none; border-color: rgb(79, 129, 189) rgb(79, 129, 189) rgb(79, 129, 189) -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding-left: 7px; padding-right: 7px;"&gt;
&lt;p&gt;
&lt;span style="color: white;"&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-style: none solid solid; border-color: -moz-use-text-color rgb(79, 129, 189) rgb(79, 129, 189); border-width: medium 1pt 1pt; padding-left: 7px; padding-right: 7px;"&gt;
&lt;p&gt;
&lt;strong&gt;MSTestValidateSettings&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color rgb(79, 129, 189) rgb(79, 129, 189) -moz-use-text-color; border-width: medium 1pt 1pt medium; padding-left: 7px; padding-right: 7px;"&gt;
&lt;p&gt;
This validates that the file was provided the needed data values to perform its task,
to run the unit tests. For more info on this technique see my previous entry &lt;a href="http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx"&gt;Elements
of Reusable MSBuild Scripts: Validation&lt;/a&gt;.
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-style: none solid solid; border-color: -moz-use-text-color rgb(79, 129, 189) rgb(79, 129, 189); border-width: medium 1pt 1pt; padding-left: 7px; padding-right: 7px;"&gt;
&lt;p&gt;
&lt;strong&gt;MSTest&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color rgb(79, 129, 189) rgb(79, 129, 189) -moz-use-text-color; border-width: medium 1pt 1pt medium; padding-left: 7px; padding-right: 7px;"&gt;
&lt;p&gt;
This is the target that you would execute to run the test cases. The target itself
is empty but it sets up the chain of dependent targets.
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-style: none solid solid; border-color: -moz-use-text-color rgb(79, 129, 189) rgb(79, 129, 189); border-width: medium 1pt 1pt; padding-left: 7px; padding-right: 7px;"&gt;
&lt;p&gt;
&lt;strong&gt;CoreMSTest&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color rgb(79, 129, 189) rgb(79, 129, 189) -moz-use-text-color; border-width: medium 1pt 1pt medium; padding-left: 7px; padding-right: 7px;"&gt;
&lt;p&gt;
This is the target which executes the test cases. This is preformed using the &lt;a href="http://msdn.microsoft.com/en-us/library/aa721750.aspx"&gt;TestToolsTask&lt;/a&gt;.
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-style: none solid solid; border-color: -moz-use-text-color rgb(79, 129, 189) rgb(79, 129, 189); border-width: medium 1pt 1pt; padding-left: 7px; padding-right: 7px;"&gt;
&lt;p&gt;
&lt;strong&gt;BuildMSTestProjects&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color rgb(79, 129, 189) rgb(79, 129, 189) -moz-use-text-color; border-width: medium 1pt 1pt medium; padding-left: 7px; padding-right: 7px;"&gt;
&lt;p&gt;
This target is responsible for building (i.e. compiling) the projects which contain
the test cases. You don't have to call this it is called automagically.
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-style: none solid solid; border-color: -moz-use-text-color rgb(79, 129, 189) rgb(79, 129, 189); border-width: medium 1pt 1pt; padding-left: 7px; padding-right: 7px;"&gt;
&lt;p&gt;
&lt;strong&gt;CleanMSTest&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color rgb(79, 129, 189) rgb(79, 129, 189) -moz-use-text-color; border-width: medium 1pt 1pt medium; padding-left: 7px; padding-right: 7px;"&gt;
&lt;p&gt;
This target will execute the &lt;strong&gt;Clean&lt;/strong&gt; target for all the test projects
defined.
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
If you take a look at the CoreBuildMSTestProjects target you can see that I am batching
(&lt;em&gt;Target batching to be specific&lt;/em&gt;) it on each defined configuration. This is
achieved with the attribute &lt;span style="font-family: Courier New; font-size: 10pt;"&gt;&lt;span style="color: red;"&gt;Outputs&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;%(AllConfigurations.Configuration)&lt;/span&gt;"&lt;/span&gt;.
If you are not familiar with batching, see the links at the end of this post for more
details, and you can always grab my &lt;a href="http://www.amazon.com/gp/product/0735626286?ie=UTF8&amp;amp;tag=sedodream-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=0735626286"&gt;book&lt;/a&gt; for
even more detailed info &lt;span style="font-family: Wingdings;"&gt;J&lt;/span&gt;. Then inside
that target I build each project by batching (&lt;em&gt;Task batching&lt;/em&gt;) the &lt;a href="http://msdn.microsoft.com/en-us/library/7z253716.aspx"&gt;MSBuild
task&lt;/a&gt; on each project defined in the &lt;strong&gt;MSTestProjects&lt;/strong&gt; item list. 
&lt;/p&gt;
&lt;p&gt;
Then inside the CoreMSTest target I execute the test cases. This target is batched
for every value in the &lt;strong&gt;MSTestProjects&lt;/strong&gt; item. As I'm writing this I
have noticed that I've hard-coded the value for the configuration used in that target
to be Debug with the statement 
&lt;/p&gt;
&lt;p&gt;
&lt;link rel="File-List" href="file:///C:%5CUsers%5CIbrahim%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"&gt;
&lt;link rel="themeData" href="file:///C:%5CUsers%5CIbrahim%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"&gt;
&lt;link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CIbrahim%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves/&gt;
  &lt;w:TrackFormatting/&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF/&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
   &lt;w:SplitPgBreakAndParaMark/&gt;
   &lt;w:DontVertAlignCellWithSp/&gt;
   &lt;w:DontBreakConstrainedForcedTables/&gt;
   &lt;w:DontVertAlignInTxbx/&gt;
   &lt;w:Word11KerningPairs/&gt;
   &lt;w:CachedColBalance/&gt;
   &lt;w:UseFELayout/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:DoNotOptimizeForBrowser/&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val="Cambria Math"/&gt;
   &lt;m:brkBin m:val="before"/&gt;
   &lt;m:brkBinSub m:val="--"/&gt;
   &lt;m:smallFrac m:val="off"/&gt;
   &lt;m:dispDef/&gt;
   &lt;m:lMargin m:val="0"/&gt;
   &lt;m:rMargin m:val="0"/&gt;
   &lt;m:defJc m:val="centerGroup"/&gt;
   &lt;m:wrapIndent m:val="1440"/&gt;
   &lt;m:intLim m:val="subSup"/&gt;
   &lt;m:naryLim m:val="undOvr"/&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:1;
	mso-generic-font-family:roman;
	mso-font-format:other;
	mso-font-pitch:variable;
	mso-font-signature:0 0 0 0 0 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-520092929 1073786111 9 0 415 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-priority:1;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:0in;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-bidi-font-size:10.0pt;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.MsoPapDefault
	{mso-style-type:export-only;
	margin-bottom:10.0pt;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
--&gt;
&lt;/style&gt;
&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin-top:0in;
	mso-para-margin-right:0in;
	mso-para-margin-bottom:10.0pt;
	mso-para-margin-left:0in;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
&lt;/style&gt;
&lt;![endif]--&gt;
&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;_CurrentConfig&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;Debug&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;_CurrentConfig&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
This shouldn't be hard coded, but passed in. I will leave it as is for now though.
Then the &lt;a href="http://msdn.microsoft.com/en-us/library/aa721750.aspx"&gt;TestToolsTask&lt;/a&gt; is
invoked to execute the test cases. 
&lt;/p&gt;
&lt;p&gt;
Now that we have written the re-usable .targets file to execute the test cases we
need to create a file which will "feed" it the necessary data values and let it do
its magic. I created a sample solution, which you can download at the end of this
post, which demonstrates its usage. The solution is named MSTestExample and you can
see the files it contains in the screen shot below. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.sedodream.com/content/binary/081309_0412_MSBuildExec1.png" alt=""&gt; 
&lt;/p&gt;
&lt;p&gt;
Here I've highlighted the two MSTest projects as well as a couple build files. I've
already shown the contents of the&lt;a href="http://sedodream.com/content/binary/Build.Common.UnitTest.targets.txt"&gt; Build.Common.UnitTest.targets&lt;/a&gt; file.
Here is the contents of the &lt;a href="http://sedodream.com/content/binary/Build.MSTestExample.proj.txt"&gt;Build.MSTestExample.proj&lt;/a&gt; file. 
&lt;/p&gt;
&lt;h1&gt;Build.MSTestExample.proj 
&lt;/h1&gt;
&lt;link rel="File-List" href="file:///C:%5CUsers%5CIbrahim%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"&gt;
&lt;link rel="themeData" href="file:///C:%5CUsers%5CIbrahim%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"&gt;
&lt;link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CIbrahim%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves/&gt;
  &lt;w:TrackFormatting/&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF/&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
   &lt;w:SplitPgBreakAndParaMark/&gt;
   &lt;w:DontVertAlignCellWithSp/&gt;
   &lt;w:DontBreakConstrainedForcedTables/&gt;
   &lt;w:DontVertAlignInTxbx/&gt;
   &lt;w:Word11KerningPairs/&gt;
   &lt;w:CachedColBalance/&gt;
   &lt;w:UseFELayout/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:DoNotOptimizeForBrowser/&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val="Cambria Math"/&gt;
   &lt;m:brkBin m:val="before"/&gt;
   &lt;m:brkBinSub m:val="--"/&gt;
   &lt;m:smallFrac m:val="off"/&gt;
   &lt;m:dispDef/&gt;
   &lt;m:lMargin m:val="0"/&gt;
   &lt;m:rMargin m:val="0"/&gt;
   &lt;m:defJc m:val="centerGroup"/&gt;
   &lt;m:wrapIndent m:val="1440"/&gt;
   &lt;m:intLim m:val="subSup"/&gt;
   &lt;m:naryLim m:val="undOvr"/&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:1;
	mso-generic-font-family:roman;
	mso-font-format:other;
	mso-font-pitch:variable;
	mso-font-signature:0 0 0 0 0 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-520092929 1073786111 9 0 415 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-priority:1;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:0in;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-bidi-font-size:10.0pt;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.MsoPapDefault
	{mso-style-type:export-only;
	margin-bottom:10.0pt;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
--&gt;
&lt;/style&gt;
&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin-top:0in;
	mso-para-margin-right:0in;
	mso-para-margin-bottom:10.0pt;
	mso-para-margin-left:0in;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
&lt;/style&gt;
&lt;![endif]--&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;xml&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;version&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;encoding&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;utf-8&lt;/span&gt;"&lt;span style="color: blue;"&gt;?&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Project&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;ToolsVersion&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;3.5&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;DefaultTargets&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;MSTest&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Some
properties you may be interested in setting:&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Name&lt;span style=""&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; &lt;/span&gt;Description&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;*****************************************************&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;RunMSTest&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;true/false
to run unit tests or not&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Root&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;'$(Root)'==''&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;$(MSBuildProjectDirectory)\..\&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Root&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;BuildRoot&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;'$(BuildRoot)'==''&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;$(Root)Build\&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;BuildRoot&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;BuildContribRoot&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;'$(BuildContribRoot)'==''&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;$(BuildRoot)Contrib\&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;BuildContribRoot&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;SourceRoot&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;'$(SourceRoot)'==''&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;$(Root)&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;SourceRoot&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;BuildArtifactsRoot&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;'$(BuildArtifactsRoot)'==''&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;$(BuildRoot)BuildAftifacts\&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;BuildArtifactsRoot&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;OutputRoot&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;'$(OutputRoot)'==''&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;$(BuildArtifactsRoot)Output\&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;OutputRoot&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;TreatWarningsAsErrors&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt; '$(TreatWarningsAsErrors)'=='' &lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;TreatWarningsAsErrors&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;CodeAnalysisTreatWarningsAsErrors&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;'$(CodeAnalysisTreatWarningsAsErrors)'==''&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;CodeAnalysisTreatWarningsAsErrors&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;BuildInParallel&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;'$(BuildInParallel)'==''&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;BuildInParallel&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;RunCodeAnalysis&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;'$(RunCodeAnalysis)'==''&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;RunCodeAnalysis&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;RunMSTest&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;'$(RunMSTest)'==''&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;RunMSTest&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;RunStyleCop&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Condition&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;''=='$(RunStyleCop)'&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;RunStyleCop&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;PropertyGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt; Configurations
that we want to build for &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;ItemGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;AllConfigurations&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Include&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;Debug&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Configuration&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;Debug&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Configuration&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;AllConfigurations&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;ItemGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt; =======================================================================&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;MSTest&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;======================================================================= &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;ItemGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;MSTestProjects&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Include&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;$(SourceRoot)TestProject1\TestProject1.csproj&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;MSTestProjects&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;MSTestProjects&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Include&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;$(SourceRoot)TestProject2\TestProject2.csproj&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;MSTestProjects&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;ItemGroup&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Import&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: red;"&gt;Project&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;"&lt;span style="color: blue;"&gt;$(BuildRoot)Build.Common.UnitTest.targets&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt; Inject
the MSTest targets into the build &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&amp;lt;PropertyGroup
Condition="'$(RunMSTest)'=='true'"&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;BuildDependsOn&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;$(BuildDependsOn);&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;MSTest;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/BuildDependsOn&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;BuildMSTestProjectsDependsOn&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;CoreBuild;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;$(BuildMSTestProjectsDependsOn)&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/BuildMSTestProjectsDependsOn&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: green;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(163, 21, 21);"&gt;Project&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&amp;gt;&lt;/span&gt; 
&lt;br&gt;
&lt;p&gt;
This file is pretty simple. It just creates some properties, and items and then just
imports the Build.Common.UnitTest.targets file to do all the heavy lifting. You will
probably notice that there are some properties defined that don't make sense here,
like &lt;strong&gt;CodeAnalysisTreatWarningsAsErrors&lt;/strong&gt;, this is because this was
taken from a build script which does some other tasks. You can ignore those. To see
what properties/items are required for the MSTest just look at the &lt;strong&gt;MSTestValidateSettings&lt;/strong&gt; target.
Also in the previous code snippet I showed how you could inject the MSTest target
into the build process but it is commented out since there is no real build process
in this case. 
&lt;/p&gt;
&lt;p&gt;
One thing about this approach that may not be ideal is that it will execute the test
cases in one assembly at a time and if there is a failure it will not go on to the
other assemblies. In my case this is OK because this is for local builds, public builds
are executing test cases by Team Build, but this can be looked at. 
&lt;/p&gt;
&lt;p&gt;
Questions? Comments? 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://sedodream.com/content/binary/MSTestExample.zip"&gt;MSTestExamples.zip&lt;/a&gt; 
&lt;/p&gt;
&lt;h1&gt;MSBuild Batching Links 
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.sedodream.com/PermaLink,guid,5f1e0445-ce3d-4052-ba80-42fd19512d42.aspx"&gt;MSBuild
batching Part 1&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.sedodream.com/PermaLink,guid,b721bc22-c375-4e1e-bcc9-512dd64096bb.aspx"&gt;MSBuild
Batching Part 2&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.sedodream.com/PermaLink,guid,cab57d7f-9d6e-4358-8491-dc033fb3bacc.aspx"&gt;MSBuild
Batching Part 3&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.sedodream.com/PermaLink,guid,096a2e3f-fcff-4715-8d00-73d8f2491a13.aspx"&gt;MSBuild
RE: Enforcing the Build Agent in a Team Build&lt;/a&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Sayed Ibrahim Hashim &lt;/b&gt;
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,a9e5fdb3-0ce4-4a2e-ac2a-244dced55b29.aspx</comments>
      <category>batching</category>
      <category>MSBuild</category>
      <category>Visual Studio</category>
      <category>Visual Studio 2008</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=37c10265-4c28-4db9-bff2-97af7dcd0b55</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,37c10265-4c28-4db9-bff2-97af7dcd0b55.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,37c10265-4c28-4db9-bff2-97af7dcd0b55.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=37c10265-4c28-4db9-bff2-97af7dcd0b55</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A few weeks ago <a href="http://franklins.net/">Carl Franklin</a> interviewed me for
his site <a href="http://www.dnrtv.com/">dnrtv.com</a> on the topic of MSBuild. I'm
on the home page right now but the permalink is <a href="http://www.dnrtv.com/default.aspx?showNum=145">http://www.dnrtv.com/default.aspx?showNum=145</a>.
Check it out. I think we may do a couple other shows to cover a bit more detail; we
just got started with MSBuild in that video. 
</p>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>I’m featured on dnrtv.com</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,37c10265-4c28-4db9-bff2-97af7dcd0b55.aspx</guid>
      <link>http://sedodream.com/2009/08/05/ImFeaturedOnDnrtvcom.aspx</link>
      <pubDate>Wed, 05 Aug 2009 03:27:35 GMT</pubDate>
      <description>&lt;p&gt;
A few weeks ago &lt;a href="http://franklins.net/"&gt;Carl Franklin&lt;/a&gt; interviewed me for
his site &lt;a href="http://www.dnrtv.com/"&gt;dnrtv.com&lt;/a&gt; on the topic of MSBuild. I'm
on the home page right now but the permalink is &lt;a href="http://www.dnrtv.com/default.aspx?showNum=145"&gt;http://www.dnrtv.com/default.aspx?showNum=145&lt;/a&gt;.
Check it out. I think we may do a couple other shows to cover a bit more detail; we
just got started with MSBuild in that video. 
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,37c10265-4c28-4db9-bff2-97af7dcd0b55.aspx</comments>
      <category>dnrTV</category>
      <category>MSBuild</category>
      <category>Video</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=92ce281d-abcc-4cc1-905d-49ef9b1253ea</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,92ce281d-abcc-4cc1-905d-49ef9b1253ea.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,92ce281d-abcc-4cc1-905d-49ef9b1253ea.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=92ce281d-abcc-4cc1-905d-49ef9b1253ea</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I am now offering <span style="text-decoration:underline"><strong>FREE</strong></span> MSBuild
training / Team Build training. Here is the deal. For those who do not know me I am
the lead author for <a href="http://www.amazon.com/gp/product/0735626286?ie=UTF8&amp;tag=sedodream-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0735626286">Inside
the Microsoft Build Engine: Using MSBuild and Team Foundation Build</a>, co-author
for <a href="http://www.amazon.com/gp/product/1590596528?ie=UTF8&amp;tag=sedodream-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=1590596528">Deploying
.NET Applications: Learning MSBuild and ClickOnce</a> and have written several related
articles. 
</p>
        <p>
I am beginning a new program where I will <strong>personally</strong> come out to
your site and provide your team <em>(from as little as 1 or as many as 10)</em> 8
hours of <strong>free</strong> MSBuild / Team Build training. Here are the conditions;
the training will be performed on a Saturday and you will have to cover the cost of
airfare, hotel and meals for the weekend. You will also need to purchase X number
of copies of my book where X is the number of people being trained. The book will
be used throughout the session. Also you would have to provide the facilities where
the training would take place. This will be a personalized training session. Ahead
of time you tell me what topics you want to be trained on, I will create the <strong>specific
training materials</strong> and then train you on that. If your team is 100% new to
MSBuild I can save them countless hours of learning and pain on their own. If you
already have a knowledgeable group then I can take them to the next level by covering
advanced topics and best practices. <strong>I want to be clear on this, you will not
be paying me any fee for the training and I will personally be delivering the training.</strong></p>
        <p>
I am making a very limited number of slots available for this extremely rare special
training, so if you are interested you should contact me very soon, because this will
not be available for long. Send me an email [sayed DOT hashimi AT gmail DOT com] stating
a bit about your organization, where the training would take place, what weekends
are good <em>(at least 4)</em>, how many people you want to be trained, and the specific
topics that you would like to cover. 
</p>
        <p>
Looking forward to hearing from you guys! 
</p>
        <p>
Sayed Ibrahim Hashimi 
</p>
      </body>
      <title>Free MSBuild / Team Build Training</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,92ce281d-abcc-4cc1-905d-49ef9b1253ea.aspx</guid>
      <link>http://sedodream.com/2009/07/07/FreeMSBuildTeamBuildTraining.aspx</link>
      <pubDate>Tue, 07 Jul 2009 03:49:08 GMT</pubDate>
      <description>&lt;p&gt;
I am now offering &lt;span style="text-decoration:underline"&gt;&lt;strong&gt;FREE&lt;/strong&gt;&lt;/span&gt; MSBuild
training / Team Build training. Here is the deal. For those who do not know me I am
the lead author for &lt;a href="http://www.amazon.com/gp/product/0735626286?ie=UTF8&amp;amp;tag=sedodream-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=0735626286"&gt;Inside
the Microsoft Build Engine: Using MSBuild and Team Foundation Build&lt;/a&gt;, co-author
for &lt;a href="http://www.amazon.com/gp/product/1590596528?ie=UTF8&amp;amp;tag=sedodream-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=1590596528"&gt;Deploying
.NET Applications: Learning MSBuild and ClickOnce&lt;/a&gt; and have written several related
articles. 
&lt;/p&gt;
&lt;p&gt;
I am beginning a new program where I will &lt;strong&gt;personally&lt;/strong&gt; come out to
your site and provide your team &lt;em&gt;(from as little as 1 or as many as 10)&lt;/em&gt; 8
hours of &lt;strong&gt;free&lt;/strong&gt; MSBuild / Team Build training. Here are the conditions;
the training will be performed on a Saturday and you will have to cover the cost of
airfare, hotel and meals for the weekend. You will also need to purchase X number
of copies of my book where X is the number of people being trained. The book will
be used throughout the session. Also you would have to provide the facilities where
the training would take place. This will be a personalized training session. Ahead
of time you tell me what topics you want to be trained on, I will create the &lt;strong&gt;specific
training materials&lt;/strong&gt; and then train you on that. If your team is 100% new to
MSBuild I can save them countless hours of learning and pain on their own. If you
already have a knowledgeable group then I can take them to the next level by covering
advanced topics and best practices. &lt;strong&gt;I want to be clear on this, you will not
be paying me any fee for the training and I will personally be delivering the training.&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
I am making a very limited number of slots available for this extremely rare special
training, so if you are interested you should contact me very soon, because this will
not be available for long. Send me an email [sayed DOT hashimi AT gmail DOT com] stating
a bit about your organization, where the training would take place, what weekends
are good &lt;em&gt;(at least 4)&lt;/em&gt;, how many people you want to be trained, and the specific
topics that you would like to cover. 
&lt;/p&gt;
&lt;p&gt;
Looking forward to hearing from you guys! 
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi 
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,92ce281d-abcc-4cc1-905d-49ef9b1253ea.aspx</comments>
      <category>MSBuild</category>
      <category>Team Build</category>
      <category>training</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=0afbc283-c3e4-4cf7-9757-83f719c258ac</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,0afbc283-c3e4-4cf7-9757-83f719c258ac.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,0afbc283-c3e4-4cf7-9757-83f719c258ac.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=0afbc283-c3e4-4cf7-9757-83f719c258ac</wfw:commentRss>
      <title>Elements of Reusable MSBuild Scripts: Validation </title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,0afbc283-c3e4-4cf7-9757-83f719c258ac.aspx</guid>
      <link>http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx</link>
      <pubDate>Tue, 30 Jun 2009 03:33:13 GMT</pubDate>
      <description>
		&lt;p style="MARGIN: 0in 0in 10pt" class="MsoNormal"&gt;
&lt;font color="#000000" size="3" face="Calibri"&gt;If you picked up a copy of &lt;/font&gt; &lt;a href="http://www.amazon.com/gp/product/0735626286?ie=UTF8&amp;amp;tag=sedodream-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=0735626286"&gt; &lt;font size="3" face="Calibri"&gt;my
book&lt;/font&gt; &lt;/a&gt; &lt;font color="#000000" size="3" face="Calibri"&gt; then in &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;i style="mso-bidi-font-style: normal"&gt;Chapter
7 External Tools&lt;/i&gt;&lt;/b&gt; you will find my rules for Creating Reusable Build Elements.
In case you don’t have it here are the rules that I’ve outlined.&lt;/font&gt; 
&lt;/p&gt;
&lt;p style="TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-list: l2 level1 lfo1" class="MsoListParagraphCxSpFirst"&gt;
&lt;font color="#000000"&gt; &lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt; &lt;span style="mso-list: Ignore"&gt; &lt;font size="3" face="Calibri"&gt;1.&lt;/font&gt; &lt;span style="FONT: 7pt 'Times New Roman'"&gt; &lt;/span&gt; &lt;/span&gt; &lt;/span&gt; &lt;font size="3" face="Calibri"&gt;Needs
to be self-contained&lt;/font&gt; &lt;/font&gt; 
&lt;/p&gt;
&lt;p style="TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-list: l2 level1 lfo1" class="MsoListParagraphCxSpMiddle"&gt;
&lt;font color="#000000"&gt; &lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt; &lt;span style="mso-list: Ignore"&gt; &lt;font size="3" face="Calibri"&gt;2.&lt;/font&gt; &lt;span style="FONT: 7pt 'Times New Roman'"&gt; &lt;/span&gt; &lt;/span&gt; &lt;/span&gt; &lt;font size="3" face="Calibri"&gt;Process
needs to be transparent and extensible by the consumer&lt;/font&gt; &lt;/font&gt; 
&lt;/p&gt;
&lt;p style="TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-list: l2 level1 lfo1" class="MsoListParagraphCxSpMiddle"&gt;
&lt;font color="#000000"&gt; &lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt; &lt;span style="mso-list: Ignore"&gt; &lt;font size="3" face="Calibri"&gt;3.&lt;/font&gt; &lt;span style="FONT: 7pt 'Times New Roman'"&gt; &lt;/span&gt; &lt;/span&gt; &lt;/span&gt; &lt;font size="3" face="Calibri"&gt;Overridable
behavior&lt;/font&gt; &lt;/font&gt; 
&lt;/p&gt;
&lt;p style="TEXT-INDENT: -0.25in; MARGIN: 0in 0in 10pt 0.5in; mso-list: l2 level1 lfo1" class="MsoListParagraphCxSpLast"&gt;
&lt;font color="#000000"&gt; &lt;b style="mso-bidi-font-weight: normal"&gt; &lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt; &lt;span style="mso-list: Ignore"&gt; &lt;font size="3" face="Calibri"&gt;4.&lt;/font&gt; &lt;span style="FONT: 7pt 'Times New Roman'"&gt; &lt;/span&gt; &lt;/span&gt; &lt;/span&gt; &lt;/b&gt; &lt;b style="mso-bidi-font-weight: normal"&gt; &lt;font size="3"&gt; &lt;font face="Calibri"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?&gt;A
contract should be defined and validated&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt; &lt;/font&gt; &lt;/b&gt; &lt;/font&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="MsoNormal"&gt;
&lt;font color="#000000" size="3" face="Calibri"&gt;I personally think that this section
is one of the most important sections in the book. The ideas there are not just how
to use MSBuild but more like best practice guidance on creating uber-reusable build
scripts. It took me a while to come up with those particular rules and I am continuing
to evolve them. I’m not going to cover these topics here because it would take up
too much space and that information is already available to you. I have evolved my
validation technique and would like to discuss that here. If you have a copy of the
book then you know that I am a big fan of the pattern of splitting up data and behavior
in build scripts. To expand on this consider the project files that are created by
Visual Studio. Those project files just define a bunch of properties and items, i.e.
data. Then another file is imported, in the case of C# projects Microsoft.CSharp.targets,
which contains all the targets, i.e. behavior. By doing this you can re-use the logic
contained in the .targets files. This is the best way that I’ve found to create good
build scripts. I prefer this over using the &lt;/font&gt; &lt;a href="http://msdn.microsoft.com/en-us/library/7z253716.aspx"&gt; &lt;font size="3" face="Calibri"&gt;MSBuild
task&lt;/font&gt; &lt;/a&gt; &lt;font color="#000000" size="3" face="Calibri"&gt; to just build another
project file. There are a lot of strange problems with that technique and it can be
very confusing to debug, especially if you are building out a bunch of different files.
I think it’s better to build up one build script (via the &lt;/font&gt; &lt;a href="http://msdn.microsoft.com/en-us/library/7z253716.aspx"&gt; &lt;font size="3" face="Calibri"&gt;Import
element&lt;/font&gt; &lt;/a&gt; &lt;font color="#000000" size="3" face="Calibri"&gt;) and go with that.
Anywayz, this is a topic for another day.&lt;/font&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="MsoNormal"&gt;
&lt;font color="#000000" size="3" face="Calibri"&gt;Today we will talk about how we can
have an MSBuild script validate itself. From the samples provided with the book I
deliver the &lt;i style="mso-bidi-font-style: normal"&gt;nunit.targets&lt;/i&gt; file which contains
a target, &lt;i style="mso-bidi-font-style: normal"&gt;ValidateNUnitSettings&lt;/i&gt;, which
is shown below. You can download these files at the very end of this post.&lt;/font&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Target&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Name&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;ValidateNUnitSettings&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;!--&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; Validate
assumptions that are contracted&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Message&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Text&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;NUnitAssemblies:
@(NUnitAssemblies)&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; &lt;/span&gt; &lt;span style="COLOR: red"&gt;Importance&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;low&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Error&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Condition&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;'$(NUnitOutputDir)'==''&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Text&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;NUnitOutputDir
property not defined&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Error&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Condition&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;'@(NUnitAssemblies)'==''&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Text&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;NUnitAssemblies
not defined&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Error&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Condition&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;'%(NUnitAssemblies.ProjectName)'==''&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Text&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;Atleast
1 item in NuitAssemblies doesn't have metadata 'ProjectName' defined.&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Error&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Condition&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;!Exists('%(NUnitAssemblies.FullPath)')&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Text&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;Couldn't
locate assembly at: %(NUnitAssemblies.FullPath)&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; /&amp;gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Target&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="MsoNormal"&gt;
&lt;font color="#000000" size="3" face="Calibri"&gt;So we can see that this target expects
there to be one property, &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;i style="mso-bidi-font-style: normal"&gt;NUnitOutputDir&lt;/i&gt;&lt;/b&gt;,
and an item, &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;i style="mso-bidi-font-style: normal"&gt;NUnitAssemblies&lt;/i&gt;&lt;/b&gt;,
to be defined. If not then an error is raised. This target is placed on the dependency
list for the UnitTest target so we know that it will be executed before that target.
Since I wrote that section in the book I noticed myself “copying and pasting” these
various validate targets and just changing the property and item names. Being a fan
of the &lt;/font&gt; &lt;a href="http://en.wikipedia.org/wiki/DRY"&gt; &lt;font size="3" face="Calibri"&gt;DRY&lt;/font&gt; &lt;/a&gt; &lt;font color="#000000" size="3" face="Calibri"&gt; principal
this didn’t sit right with me. So I began to explore better options. This is what
I’ve come up with. Imagine that you have a shared .targets file, Build.Common.targets,
which just takes a bunch of project and runs the same build process on it. This is
the file which contains the targets (behavior) and then you have another file, in
this example YourProject.proj, which is the driver for the build process. This file
mostly contains properties and item (data). Below is the YourProject.proj file.&lt;/font&gt; 
&lt;/p&gt;
&lt;h1 style="MARGIN: 10pt 0in 0pt"&gt;
&lt;span style="mso-no-proof: yes"&gt; &lt;font size="5"&gt; &lt;font color="#17365d"&gt; &lt;font face="Calibri"&gt;YourProject.proj&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt; &lt;/font&gt; &lt;/font&gt; &lt;/span&gt; 
&lt;/h1&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;lt;?&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;xml&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;version&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;1.0&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; &lt;/span&gt; &lt;span style="COLOR: red"&gt;encoding&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;utf-8&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;?&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Project&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;ToolsVersion&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;3.5&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; &lt;/span&gt; &lt;span style="COLOR: red"&gt;DefaultTargets&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;Build&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; &lt;/span&gt; &lt;span style="COLOR: red"&gt;xmlns&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;PropertyGroup&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Root&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Condition&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;'$(Root)'==''&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt; &lt;font color="#000000"&gt;.\&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;Root&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;BuildInstallRoot&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Condition&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;'$(BuildInstallRoot)'==''&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt; &lt;font color="#000000"&gt;$(Root)\Build\&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;BuildInstallRoot&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;SourceRoot&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Condition&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;'$(SourceRoot)'==''&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt; &lt;font color="#000000"&gt;$(Root)&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;SourceRoot&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;OutputRoot&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Condition&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;'$(OutputRoot)'==''&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;OutputRoot&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;PropertyGroup&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;!--&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; Configurations
that we want to build &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;ItemGroup&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;AllConfigurations&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Include&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;Debug&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Configuration&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;Debug&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;Configuration&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;AllConfigurations&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;AllConfigurations&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Include&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;Release&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Configuration&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;Release&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;Configuration&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;AllConfigurations&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;ItemGroup&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;!--&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; Projects
that we want to build &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;ItemGroup&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;ProjectsToBuild&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Include&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;$(SourceRoot)Sedo.ProjectOne.csproj&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;ProjectsToBuild&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Include&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;$(SourceRoot)Sedo.ProjectTwo.csproj&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;ItemGroup&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;b style="mso-bidi-font-weight: normal"&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; &lt;span style="BACKGROUND: yellow"&gt;&amp;lt;&lt;/span&gt; &lt;/span&gt; &lt;/b&gt; &lt;b style="mso-bidi-font-weight: normal"&gt; &lt;span style="FONT-FAMILY: 'Courier New'; BACKGROUND: yellow; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Import&lt;/span&gt; &lt;/b&gt; &lt;b style="mso-bidi-font-weight: normal"&gt; &lt;span style="FONT-FAMILY: 'Courier New'; BACKGROUND: yellow; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;/b&gt; &lt;b style="mso-bidi-font-weight: normal"&gt; &lt;span style="FONT-FAMILY: 'Courier New'; BACKGROUND: yellow; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Project&lt;/span&gt; &lt;/b&gt; &lt;b style="mso-bidi-font-weight: normal"&gt; &lt;span style="FONT-FAMILY: 'Courier New'; BACKGROUND: yellow; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;/b&gt; &lt;b style="mso-bidi-font-weight: normal"&gt; &lt;span style="FONT-FAMILY: 'Courier New'; BACKGROUND: yellow; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;Build.Common.targets&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;/span&gt; &lt;/span&gt; &lt;/b&gt; &lt;b style="mso-bidi-font-weight: normal"&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/b&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Project&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="MsoNormal"&gt;
&lt;font color="#000000" size="3" face="Calibri"&gt;Here are the contents of a very crude
and simple Build.Common.targets.&lt;/font&gt; 
&lt;/p&gt;
&lt;h1 style="MARGIN: 10pt 0in 0pt"&gt;
&lt;font color="#17365d" size="5" face="Calibri"&gt;Build.Common.targets&lt;/font&gt; 
&lt;/h1&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;lt;?&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;xml&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;version&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;1.0&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; &lt;/span&gt; &lt;span style="COLOR: red"&gt;encoding&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;utf-8&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;?&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Project&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;ToolsVersion&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;3.5&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; &lt;/span&gt; &lt;span style="COLOR: red"&gt;DefaultTargets&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;Build&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; &lt;/span&gt; &lt;span style="COLOR: red"&gt;xmlns&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Target&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Name&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;ValidateBuildSettings&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;ItemGroup&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;_RequiredProperties&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Include&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;Root&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Value&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;$(Root)&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;Value&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;_RequiredProperties&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;_RequiredProperties&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Include&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildInstallRoot&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Value&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;$(BuildInstallRoot)&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;Value&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;_RequiredProperties&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;_RequiredProperties&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Include&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;SourceRoot&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Value&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;$(SourceRoot)&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;Value&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;_RequiredProperties&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;!--&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;_RequiredItems
is the item where required items should be placed.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;The
following metadata is significant:&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;REQUIRED
METADATA:&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;Identity&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;=
This will basically be used to identify the specific required item&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;RequiredValue&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;=
This is the specific value that will be validated to exist&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;OPTIONAL
METADATA&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;RequiredFilePath&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;=
Populate this with a path that should exists, if it is not empty&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;then
it will be checked to exist on disk.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;_RequiredItems&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Include&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;AllConfigurations&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;RequiredValue&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;@(AllConfigurations)&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;RequiredValue&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;_RequiredItems&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;_RequiredItems&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Include&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;AllConfigurations.Configuration&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;RequiredValue&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;%(AllConfigurations.Configuration)&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;RequiredValue&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;_RequiredItems&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;_RequiredItems&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Include&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;ProjectsToBuild&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;RequiredValue&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;%(ProjectsToBuild.Identity)&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;RequiredValue&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;RequiredFilePath&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;%(ProjectsToBuild.Identity)&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;RequiredFilePath&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;_RequiredItems&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;ItemGroup&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;!--&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; Raise
an error if any value in _RequiredProperties is missing &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Error&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Condition&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;'%(_RequiredProperties.Value)'==''&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Text&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;Missing
required property [%(_RequiredProperties.Identity)]&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;!--&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; Raise
an error if any value in _RequiredItems is empty &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Error&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Condition&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;'%(_RequiredItems.RequiredValue)'==''&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Text&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;Missing
required item value [%(_RequiredItems.Identity)]&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;!--&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; Validate
any file/directory that should exist &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Error&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Condition&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;'%(_RequiredItems.RequiredFilePath)'
!= '' and !Exists('%(_RequiredItems.RequiredFilePath)')&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Text&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;Unable
to find expeceted path [%(_RequiredItems.RequiredFilePath)] on item [%(_RequiredItems.Identity)]&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Target&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;PropertyGroup&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;BuildDependsOn&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; &lt;span style="BACKGROUND: yellow"&gt;ValidateBuildSettings&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;BeforeBuild;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;CoreBuild;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;AfterBuild;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;$(BuildDependsOn)&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;BuildDependsOn&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;PropertyGroup&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Target&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Name&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;Build&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; &lt;/span&gt; &lt;span style="COLOR: red"&gt;DependsOnTargets&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;$(BuildDependsOn)&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Target&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Name&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BeforeBuild&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Target&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Name&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;AfterBuild&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Target&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Name&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;CoreBuild&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; &lt;/span&gt; &lt;span style="COLOR: red"&gt;Outputs&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;%(AllConfigurations.Configuration)&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;!--&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;Create
a temporary property that contains the lone configuration. This is needed because
we&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;don't
want to batch MSBuild task on both ProjectsToBuild and AllConfigurations at the same&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;time.
Anywayz since this target is batched we are guaranteed that&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;it
contains a single value within the scope of this target.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;PropertyGroup&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;CurrentConfig&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;%(AllConfigurations.Configuration)&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;CurrentConfig&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;PropertyGroup&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;!--&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; Build
the projects here, for this example we just print a message &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Message&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Text&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;Building
project [%(ProjectsToBuild.Identity)] for configuration [$(CurrentConfig)]&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt; &lt;/span&gt; &lt;span style="COLOR: red"&gt;Importance&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;high&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Target&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Project&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="MsoNormal"&gt;
&lt;font color="#000000" size="3" face="Calibri"&gt;Focus your attention on the &lt;b style="mso-bidi-font-weight: normal"&gt;ValidateBuildSettings&lt;/b&gt; target.
Instead of manually validating each property and item, I create an item _&lt;b style="mso-bidi-font-weight: normal"&gt;RequiredProperties&lt;/b&gt; for
property validation and an item _&lt;b style="mso-bidi-font-weight: normal"&gt;RequiredItems&lt;/b&gt; for
item validation. Notice the leading _ which says “Don’t touch me I’m private!” The
target populates both of those items with the values that are required for the build
script to be able to execute. Then using batching those assumptions are validated.
The property validation is pretty easy, if any value for &lt;b style="mso-bidi-font-weight: normal"&gt;_RequiredProperties.Value&lt;/b&gt; is
empty then raises an error. For items I wanted to be able to not only be able to assert
the following&lt;/font&gt; 
&lt;/p&gt;
&lt;p style="TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo2" class="MsoListParagraphCxSpFirst"&gt;
&lt;font color="#000000"&gt; &lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt; &lt;span style="mso-list: Ignore"&gt; &lt;font size="3" face="Calibri"&gt;1.&lt;/font&gt; &lt;span style="FONT: 7pt 'Times New Roman'"&gt; &lt;/span&gt; &lt;/span&gt; &lt;/span&gt; &lt;font size="3" face="Calibri"&gt;The
item was defined&lt;/font&gt; &lt;/font&gt; 
&lt;/p&gt;
&lt;p style="TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo2" class="MsoListParagraphCxSpMiddle"&gt;
&lt;font color="#000000"&gt; &lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt; &lt;span style="mso-list: Ignore"&gt; &lt;font size="3" face="Calibri"&gt;2.&lt;/font&gt; &lt;span style="FONT: 7pt 'Times New Roman'"&gt; &lt;/span&gt; &lt;/span&gt; &lt;/span&gt; &lt;font size="3" face="Calibri"&gt;Certain
metadata values were defined&lt;/font&gt; &lt;/font&gt; 
&lt;/p&gt;
&lt;p style="TEXT-INDENT: -0.25in; MARGIN: 0in 0in 10pt 0.5in; mso-list: l0 level1 lfo2" class="MsoListParagraphCxSpLast"&gt;
&lt;font color="#000000"&gt; &lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt; &lt;span style="mso-list: Ignore"&gt; &lt;font size="3" face="Calibri"&gt;3.&lt;/font&gt; &lt;span style="FONT: 7pt 'Times New Roman'"&gt; &lt;/span&gt; &lt;/span&gt; &lt;/span&gt; &lt;font size="3" face="Calibri"&gt;The
file exists on disk&lt;/font&gt; &lt;/font&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="MsoNormal"&gt;
&lt;font color="#000000" size="3" face="Calibri"&gt;So I came up with the concept of having
three metadata values on that item&lt;/font&gt; 
&lt;/p&gt;
&lt;p style="TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-list: l1 level1 lfo3" class="MsoListParagraphCxSpFirst"&gt;
&lt;font color="#000000"&gt; &lt;span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"&gt; &lt;span style="mso-list: Ignore"&gt; &lt;font size="3"&gt;·&lt;/font&gt; &lt;span style="FONT: 7pt 'Times New Roman'"&gt; &lt;/span&gt; &lt;/span&gt; &lt;/span&gt; &lt;font size="3" face="Calibri"&gt;Identity&lt;/font&gt; &lt;/font&gt; 
&lt;/p&gt;
&lt;p style="TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-list: l1 level1 lfo3" class="MsoListParagraphCxSpMiddle"&gt;
&lt;font color="#000000"&gt; &lt;span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"&gt; &lt;span style="mso-list: Ignore"&gt; &lt;font size="3"&gt;·&lt;/font&gt; &lt;span style="FONT: 7pt 'Times New Roman'"&gt; &lt;/span&gt; &lt;/span&gt; &lt;/span&gt; &lt;font size="3" face="Calibri"&gt;RequiredValue&lt;/font&gt; &lt;/font&gt; 
&lt;/p&gt;
&lt;p style="TEXT-INDENT: -0.25in; MARGIN: 0in 0in 10pt 0.5in; mso-list: l1 level1 lfo3" class="MsoListParagraphCxSpLast"&gt;
&lt;font color="#000000"&gt; &lt;span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"&gt; &lt;span style="mso-list: Ignore"&gt; &lt;font size="3"&gt;·&lt;/font&gt; &lt;span style="FONT: 7pt 'Times New Roman'"&gt; &lt;/span&gt; &lt;/span&gt; &lt;/span&gt; &lt;font size="3" face="Calibri"&gt;RequiredFilePath&lt;/font&gt; &lt;/font&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="MsoNormal"&gt;
&lt;font color="#000000" size="3" face="Calibri"&gt;Identity, this is just the contents
of the Include attribute on the item itself. The RequiredValue is the metadata that
will be checked to ensure that a value exists. So if you want to make sure that an
item was simply declared then you would do&lt;/font&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;_RequiredItems&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Include&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;AllConfigurations&lt;/span&gt; &lt;font color="#000000"&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;RequiredValue&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;font color="#000000"&gt;@(AllConfigurations)&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;RequiredValue&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="MsoNormal"&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;_RequiredItems&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="MsoNormal"&gt;
&lt;font color="#000000"&gt; &lt;font size="3" face="Calibri"&gt;If the AllConfigurations item
wasn’t declared then &lt;/font&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;@(AllConfigurations)&lt;/span&gt; &lt;font size="3" face="Calibri"&gt; would
evaluate to empty and an error would be raised. You can also do this to assert an
items metadata like &lt;/font&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;%(AllConfigurations.Configuration)&lt;/span&gt; &lt;font size="3" face="Calibri"&gt;.
And for RequiredFilePath, if that metadata value was defined then the validation target
will make sure that the file is located on disk as expected.&lt;/font&gt; &lt;/font&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="MsoNormal"&gt;
&lt;font color="#000000" size="3" face="Calibri"&gt;You have to keep in mind that this is
not just about validation. It’s also about usability. You may be wondering when I
say that. But think about it, in one target I have been able to express to you (the
person consuming the .targets file) everything that you need to define in great detail.
And if you get it wrong then the process will stop itself, instead of potentially
continuing in an erroneous scenario.&lt;/font&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class="MsoNormal"&gt;
&lt;font color="#000000" size="3" face="Calibri"&gt;Here is what the result would look like
if I had forgotten to define the AllConfigurations item.&lt;/font&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" src="http://www.sedodream.com/content/binary/070609_0332_ElementsofR1.png" /&gt; 
&lt;/p&gt;
&lt;p&gt;
And here it is after I inserted it. 
&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" src="http://www.sedodream.com/content/binary/070609_0332_ElementsofR2.png" /&gt; 
&lt;/p&gt;
&lt;p&gt;
This was one of my longer posts in a while, but I think that there is much more to
this topic. I think this goes pretty deep, but if you understand these ideas then
you are well on your way to writing some sweet reusable build scripts. 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.sedodream.com/content/binary/Build.Common.targets.txt"&gt;Build.Common.targets&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.sedodream.com/content/binary/YourProject.proj.txt"&gt;YourProject.proj&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi 
&lt;/p&gt;
</description>
      <comments>http://sedodream.com/CommentView,guid,0afbc283-c3e4-4cf7-9757-83f719c258ac.aspx</comments>
      <category>book</category>
      <category>MSBuild</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=02cf772b-687f-4add-8d06-b888ef43fc04</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,02cf772b-687f-4add-8d06-b888ef43fc04.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,02cf772b-687f-4add-8d06-b888ef43fc04.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=02cf772b-687f-4add-8d06-b888ef43fc04</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p style="MARGIN-LEFT: 36pt">
The other day Dan Moseley from the MSBuild team wrote up <a href="http://www.amazon.com/review/RX6CVKXV2PY46/ref=cm_cr_rdp_perm&amp;tag=sedodream-20">a
review</a> on the <a href="http://www.amazon.com/gp/product/0735626286?ie=UTF8&amp;tag=sedodream-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0735626286">books
Amazon page</a>. Here are the contents of the review 
</p>
        <blockquote>
          <p>
I'm a developer on MSBuild; Sayed wrote this book with our encouragement, and we reviewed
it for accuracy and completeness, so I can recommend it. The documentation for MSBuild
in 2.0 and 3.5 was not great; I consider this something like the missing manual. Unfortunately
there aren't many other MSBuild books; fortunately Sayed did a good job on this one. 
</p>
        </blockquote>
        <blockquote>
          <p>
We're fixing a lot of what's "missing" in MSBuild in the upcoming version 4.0 -- I
hope Sayed can do a 2nd edition when that comes out. Plus, our docs should be better
then :-) 
</p>
        </blockquote>
        <p>
I'm glad to say that this review was posted as 5 out of 5 and that is the 9<sup>th</sup> review
(out of 9) which has been given 5 stars. When we wrote the book I knew that we had
put something together that would really meet a specific need. I'm happy to see that
the book has been accepted soo well by everyone and I hope that we are able to write
a second edition as Dan mentioned. 
</p>
        <p>
Sayed Ibrahim Hashimi 
</p>
      </body>
      <title>MSBuild Team Reviews Book</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,02cf772b-687f-4add-8d06-b888ef43fc04.aspx</guid>
      <link>http://sedodream.com/2009/06/29/MSBuildTeamReviewsBook.aspx</link>
      <pubDate>Mon, 29 Jun 2009 03:31:19 GMT</pubDate>
      <description>
		&lt;p style="MARGIN-LEFT: 36pt"&gt;
The other day Dan Moseley from the MSBuild team wrote up &lt;a href="http://www.amazon.com/review/RX6CVKXV2PY46/ref=cm_cr_rdp_perm&amp;amp;tag=sedodream-20"&gt;a
review&lt;/a&gt; on the &lt;a href="http://www.amazon.com/gp/product/0735626286?ie=UTF8&amp;amp;tag=sedodream-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=0735626286"&gt;books
Amazon page&lt;/a&gt;. Here are the contents of the review 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
I'm a developer on MSBuild; Sayed wrote this book with our encouragement, and we reviewed
it for accuracy and completeness, so I can recommend it. The documentation for MSBuild
in 2.0 and 3.5 was not great; I consider this something like the missing manual. Unfortunately
there aren't many other MSBuild books; fortunately Sayed did a good job on this one. 
&lt;/p&gt;
&lt;/blockquote&gt; &lt;blockquote&gt; 
&lt;p&gt;
We're fixing a lot of what's "missing" in MSBuild in the upcoming version 4.0 -- I
hope Sayed can do a 2nd edition when that comes out. Plus, our docs should be better
then :-) 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I'm glad to say that this review was posted as 5 out of 5 and that is the 9&lt;sup&gt;th&lt;/sup&gt; review
(out of 9) which has been given 5 stars. When we wrote the book I knew that we had
put something together that would really meet a specific need. I'm happy to see that
the book has been accepted soo well by everyone and I hope that we are able to write
a second edition as Dan mentioned. 
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi 
&lt;/p&gt;
</description>
      <comments>http://sedodream.com/CommentView,guid,02cf772b-687f-4add-8d06-b888ef43fc04.aspx</comments>
      <category>book</category>
      <category>msbuild</category>
      <category>review</category>
    </item>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=45f461f1-5463-4b70-a476-9fa0d5dfb3e6</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,45f461f1-5463-4b70-a476-9fa0d5dfb3e6.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,45f461f1-5463-4b70-a476-9fa0d5dfb3e6.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=45f461f1-5463-4b70-a476-9fa0d5dfb3e6</wfw:commentRss>
      <title>MSBuild Code Review</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,45f461f1-5463-4b70-a476-9fa0d5dfb3e6.aspx</guid>
      <link>http://sedodream.com/2009/06/03/MSBuildCodeReview.aspx</link>
      <pubDate>Wed, 03 Jun 2009 03:25:21 GMT</pubDate>
      <description>&lt;p style="MARGIN: 0in 0in 10pt" class=MsoNormal&gt;
&lt;font color=#000000 size=3 face=Calibri&gt;A long time ago a reader sent me a build script
and asked for my thoughts on it. This is my response. In this entry I have marked
up his build script with my comments inside of tags like:&lt;/font&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;****************************************&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;My
comments inside of these&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;*********************************************&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class=MsoNormal&gt;
&lt;font color=#000000 size=3 face=Calibri&gt;I thought that you guys might be interested
in this too. Here it is.&lt;/font&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 10pt" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Project&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;DefaultTargets&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;Build&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&lt;/span&gt;&lt;span style="COLOR: red"&gt;xmlns&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;****************************************&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;You
can pull these out into a seperate file, i.e., CompanyName.BuildTasks.tasks&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;*********************************************&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;UsingTask&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;TaskName&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks.MoveUpBuildNumber&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&lt;/span&gt;&lt;span style="COLOR: red"&gt;AssemblyFile&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks\bin\Debug\BuildTasks.dll&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;UsingTask&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;TaskName&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks.ReplaceInFile&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&lt;/span&gt;&lt;span style="COLOR: red"&gt;AssemblyFile&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks\bin\Debug\BuildTasks.dll&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;UsingTask&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;TaskName&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks.CheckInIntoVSS&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&lt;/span&gt;&lt;span style="COLOR: red"&gt;AssemblyFile&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks\bin\Debug\BuildTasks.dll&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;UsingTask&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;TaskName&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks.CheckOutFromVSS&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&lt;/span&gt;&lt;span style="COLOR: red"&gt;AssemblyFile&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks\bin\Debug\BuildTasks.dll&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;UsingTask&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;TaskName&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks.UndoCheckOutFromVSS&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&lt;/span&gt;&lt;span style="COLOR: red"&gt;AssemblyFile&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks\bin\Debug\BuildTasks.dll&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;UsingTask&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;TaskName&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks.GetLatestFromVSS&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&lt;/span&gt;&lt;span style="COLOR: red"&gt;AssemblyFile&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks\bin\Debug\BuildTasks.dll&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;UsingTask&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;TaskName&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks.LabelInVSS&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&lt;/span&gt;&lt;span style="COLOR: red"&gt;AssemblyFile&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks\bin\Debug\BuildTasks.dll&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;UsingTask&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;TaskName&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks.ShowMessageBox&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&lt;/span&gt;&lt;span style="COLOR: red"&gt;AssemblyFile&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;BuildTasks\bin\Debug\BuildTasks.dll&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;****************************************&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;In
order to create more extensible MSBuild files you should place conditions on Properties.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;For
example:&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;PropertyGroup
Condition="'$(VSSDatabasePath)'==''"&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;VSSDatabasePath&amp;gt;\\rataserv\vss\srcsafe.ini&amp;lt;/VSSDatabasePath&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;When
you do this users can create another file, i.e., MyCustomBuild.proj which imports
your&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;file
and just overrides a few values.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;*********************************************&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;PropertyGroup&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;VSSDatabasePath&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;\\some\path\here\srcsafe.ini&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;VSSDatabasePath&lt;/span&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;PropertyGroup&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;======================================================================================== &lt;/span&gt;&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;****************************************&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Also
for extensibility your DependsOnTargets should always be pulled from a property&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;which
pre-prendes its values to the property itself. So that is:&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;PropertyGroup&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;BuildDependsOn&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;PrebuildAndRun;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;CheckInDeliverables;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;$(BuildDependsOn);&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/BuildDependsOn&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;In
this manner external files can extend the behavior of the Build target. Without this
it is going&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;to
be difficult for people to effectively customize the build process.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;*********************************************&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Target&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Name&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;Build&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&lt;/span&gt;&lt;span style="COLOR: red"&gt;DependsOnTargets&lt;/span&gt; &lt;span style="COLOR: blue"&gt;=&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;PrebuildAndRun;CheckInDeliverables&lt;/span&gt; &lt;font color=#000000&gt;"&lt;/font&gt; &lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; &lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Target&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;!--&lt;/span&gt; &lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;****************************************&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Be
careful with names. I would recommend using a naming convention that will ensure&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;that
your Targets/Properties/Items do not collide with each other.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;For
example if I create re-usable .targets files and many of them have a "Build" target&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;then
I cannot user more than 1 at a time via an &amp;lt;Import ..&amp;gt;. Which is how I like
for&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;reusable
.targets files to be used. For example using a prefix such as in my case SedoConfig
or SedoDB.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Do
I need to expand on this?&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;/p&gt;
&lt;p style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;
&lt;span style="FONT-FAMI