<?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:georss="http://www.georss.org/georss" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Ed Squared - IntelliTrace</title>
    <link>http://www.edsquared.com/</link>
    <description>The Ramblings of Two Microsoft .NET Developers, TFS, and Visual Studio ALM Guys --- "Yes, we are both named Ed."</description>
    <language>en-us</language>
    <copyright>Ed Blankenship</copyright>
    <lastBuildDate>Tue, 27 Dec 2011 18:20:31 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 12.1.14.2</generator>
    <managingEditor>edblankenship@gmail.com</managingEditor>
    <webMaster>edblankenship@gmail.com</webMaster>
    <item>
      <trackback:ping>http://www.edsquared.com/Trackback.aspx?guid=2e6737b3-6862-44cb-8581-9110da46b74d</trackback:ping>
      <pingback:server>http://www.edsquared.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.edsquared.com/PermaLink,guid,2e6737b3-6862-44cb-8581-9110da46b74d.aspx</pingback:target>
      <dc:creator>Ed Blankenship (EdSquared.com)</dc:creator>
      <georss:point>32.85 96.85</georss:point>
      <wfw:comment>http://www.edsquared.com/CommentView,guid,2e6737b3-6862-44cb-8581-9110da46b74d.aspx</wfw:comment>
      <wfw:commentRss>http://www.edsquared.com/SyndicationService.asmx/GetEntryCommentsRss?guid=2e6737b3-6862-44cb-8581-9110da46b74d</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>
            <strong>Updates</strong> – I plan on making updates to this blog article from
time to time as I learn more and changes are made to TFS &amp; SmartAssembly to smooth
out some of the rough edges.  Come back again for the latest &amp; greatest!</em>
        </p>
        <p>
I really like tools that provide assistance with the release management &amp; maintenance
cycles of <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fen.wikipedia.org%2fwiki%2fApplication_lifecycle_management" target="_blank">ALM</a>. 
I think some of the features really add a particular shine to your application. 
It’s something that I’m currently writing an article about but I wanted to share how
to integrate one of those tools into your <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2fvstudio%2fff637362" target="_blank">Team
Foundation Server 2010</a> Build Process.  This first tool to be reviewed is <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.wintellect.com%2fcs%2fblogs%2fjrobbins%2farchive%2f2007%2f12%2f21%2fcode-signing-it-s-cheaper-and-easier-than-you-thought.aspx" target="_blank">Red
Gate’s SmartAssembly</a> product.<a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.red-gate.com%2fproducts%2fdotnet-development%2fsmartassembly%2f" target="_blank"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Red Gate SmartAssembly" border="0" alt="Red Gate SmartAssembly" align="right" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/SmartAssemblyBox_5.png" width="176" height="224" /></a></p>
        <p>
SmartAssembly is a product that can help you out with obfuscation if you need it but
I primarily want to focus on two of its other major features:
</p>
        <ul>
          <li>
            <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.red-gate.com%2fproducts%2fdotnet-development%2fsmartassembly%2ffeatures%2f%23automated-error-reporting" target="_blank">Automated
Error Reporting</a> – When an exception occurs, the end user can be prompted to send
back the exception details so that the development team can review those details. 
This can also work with server-side &amp; web applications without requiring end user
prompting. 
</li>
          <li>
            <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.red-gate.com%2fproducts%2fdotnet-development%2fsmartassembly%2ffeatures%2f%23feature-usage-reporting" target="_blank">Feature
Usage Reporting</a> – This is essentially telemetry for your application to figure
out how your users are using the application so that you can make good decisions in
the future about where to invest for future releases.  It does this by sending
back anonymous data for users who opt-in at runtime.  It will even automatically
send back data about the machine the software is being run like the operating system. 
This can be extremely useful data to product managers.</li>
        </ul>
        <p>
You don’t have to worry about any of the details because once you run your assemblies
through SmartAssembly, it instruments all of the necessary functionality automatically
for you.  If you acquire the Professional edition, you can customize the reporting
experience including the ability to host your own web server to accept the error &amp;
feature usage reports.
</p>
        <blockquote>
          <p>
            <strong>
              <em>Aside</em>
            </strong>:  Too many teams &amp; companies have blindly
adopted obfuscation for their assemblies in the past without taking into consideration
the true “total cost” of obfuscating your applications.  I’m all for obfuscation
where it makes sense to protect IP as long as the value of the protection of that
IP is worth more than the extra cost, resources, and maintenance complexity to truly
support an obfuscated product.  Each team &amp; company is going to have to make
that decision based on the resources available and the value of the IP to be protected 
– just don’t go into it blindly.
</p>
        </blockquote>
        <p>
          <em>FYI – </em>
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.preemptive.com%2fproducts%2fdotfuscator%2foverview" target="_blank">
            <em>PreEmptive’s
Dotfuscator</em>
          </a>
          <em> tool is a competing product line with a similar feature set
that I hope to be covering in a future blog post.</em>
        </p>
        <p>
Ignoring obfuscation, these two features are absolutely great for gaining visibility
about your application once it has been released.  For all of those teams that
aren’t traditional software vendors but building applications for internal use, these
are great features for those applications as well.  Software engineering teams
building internal applications are very much in need of the same type of information
as ISVs about how their internal “customers” are interacting with their applications. 
Internal applications don’t necessarily need obfuscation but they can definitely benefit
from automated error &amp; feature usage reporting!
</p>
        <p>
One part that I absolutely love about SmartAssembly is that even though the tool instruments
and changes your assembly, it also provides the ability to produce a set of matching <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fbit.ly%2fSymbolServerTFS" target="_blank">symbols
(.PDBs)</a> that are extremely important for several scenarios in TFS, the Visual
Studio ALM family of tools, as well as basic debugging.
</p>
        <p>
I am going to be spending some time in this blog article to walkthrough how to integrate
SmartAssembly into your automated TFS build process so that your teams can take advantage
of these features.  I am going to take the approach of not creating any custom
workflow activities for this particular effort.  <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fblogs.msdn.com%2fb%2fjimlamb%2farchive%2f2010%2f06%2f09%2fwindows-workflow-vs-msbuild-in-tfs-2010.aspx" target="_blank">Jim
Lamb has a good discussion</a> about when to make customizations to the MSBuild file
(essentially the Visual Studio project file) and when to make your customizations
in the Windows Workflow-based build process template.  As much as I very much
prefer customizing my build process templates using custom workflow activities, in
this case I choose to do a little customization of both without using any custom workflow
activities.  I would much rather have done this using only native Windows Workflow
activities but I’ll talk more about that a little later.
</p>
        <blockquote>
          <p>
            <strong>Disclaimer</strong>:  As a <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=https%3a%2f%2fmvp.support.microsoft.com%2fprofile%2fed.blankenship" target="_blank">Microsoft
MVP</a>, I have been a part of the <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.red-gate.com%2four-company%2fabout%2fcommunity-relations%2ffriends-of-rg" target="_blank">Friends
of Red Gate</a> group for the last four years and I have been provided Not For Resale
licenses of the Red Gate family of products though I reserve the right to offer unbiased
opinions and criticisms.  I was not paid for these contributions.  However,
I may or may not get a complimentary round the next time I see the Red Gaters at the
pub in Cambridge. <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://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/wlEmoticon-smile_2.png" /></p>
          <p>
            <strong>
              <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.codinghorror.com%2fblog%2f2007%2f03%2fthe-works-on-my-machine-certification-program.html" target="_blank">
                <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Work on My Machine Logo" border="0" alt="Works on My Machine Logo" align="right" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/WorksOnMyMachine_3.png" width="212" height="205" />
              </a>Works
on My Machine Disclaimer</strong>:  Everything in this blog article <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.codinghorror.com%2fblog%2f2007%2f03%2fthe-works-on-my-machine-certification-program.html" target="_blank">works
on my machine</a> when I wrote it.  I have the latest version of SmartAssembly
and TFS 2010 installed &amp; configured correctly.  I’ve done my best to make
this as reusable as possible for most team’s scenarios but I can’t tell you that it
will work for you.  Hopefully it gets you started on the right path though! 
Please don’t contact me and let me know that my code killed your cat.  I feel
for you… I do – I just can’t do anything about it.  You’ve been warned. 
I take the same approach that <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.hanselman.com%2fblog%2f" target="_blank">Scott</a> does
with blog contributions.
</p>
        </blockquote>
        <h1>Configuring SmartAssembly for Team Use
</h1>
        <p>
SmartAssembly has actually been designed out of the box to handle the single-developer
team scenario.  If you are using TFS, you are likely not a single-developer team
so you’ll want to a few things to get <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.red-gate.com%2fproducts%2fdotnet-development%2fsmartassembly%2fteam-package" target="_blank">SmartAssembly
setup for use with a team</a>.  The architecture for SmartAssembly can best be
described with this architecture diagram:
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.red-gate.com%2fproducts%2fdotnet-development%2fsmartassembly%2fteam-package" target="_blank">
            <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="Smart Assembly Architecture Diagram" border="0" alt="Smart Assembly Architecture Diagram" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/SmartAssemblyArchitectureDiagram_5.png" width="612" height="423" />
          </a>
          <br />
          <em>Source</em>:  <a title="http://www.red-gate.com/products/dotnet-development/smartassembly/team-package" href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.red-gate.com%2fproducts%2fdotnet-development%2fsmartassembly%2fteam-package">http://www.red-gate.com/products/dotnet-development/smartassembly/team-package</a></p>
        <p>
You’ll need to get the <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.red-gate.com%2fproducts%2fdotnet-development%2fsmartassembly%2fpricing" target="_blank">Professional</a> edition
of SmartAssembly since it allows you to store everything in a shared SQL Server database. 
One nice thing is that each developer who will need to interact with error &amp; feature
usage reports only needs a Developer edition license instead of a full Professional
edition license.  You’ll need to install &amp; configure the Professional edition
on each of your build servers.  You might as well go ahead and create a <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fbb399135.aspx%23assign_tags" target="_blank">build
agent tag</a> called “<font face="Consolas">SmartAssembly</font>” to indicate which
build agents in your build farm are hosted on servers that have SmartAssembly installed.
</p>
        <p>
When you first start SmartAssembly, you will want to setup the desktop machines &amp;
build servers to use the same SQL connection settings for the shared SmartAssembly
database.  I even like to use the <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.edsquared.com%2f2011%2f01%2f03%2fUsing%2bFriendly%2bDNS%2bNames%2bIn%2bYour%2bTFS%2bEnvironment.aspx" target="_blank">friendly
TFS DNS names</a> that I already have setup for my particular TFS environment. 
Remember that if you are using the <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.microsoft.com%2fdownload%2fen%2fdetails.aspx%3fdisplaylang%3den%26id%3d13350" target="_blank">limited
use license of SQL that is included with TFS</a>, you won’t be able to house the SmartAssembly
database on that instance.  You’ll need to purchase a legitimate SQL Server license. 
It’s a great time to upgrade to the SQL Enterprise edition if you can for TFS!  <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fbooks.google.com%2fbooks%3fid%3d9d7JUTMpZDYC%26pg%3dPA31%26lpg%3dPA31%26dq%3dSQL%2bEnterprise%2bfeatures%2bused%2bby%2bTFS%26source%3dbl%26ots%3db-vy7VYIir%26sig%3dSHCKFHEl3RvplvOWqF2DH-_1nOQ%26hl%3den%26sa%3dX%26ei%3dyVD2TsG4F-Xs0gGh4vHQAg%26ved%3d0CFEQ6AEwBg%23v%3donepage%26q%3dSQL%2520Enterprise%2520features%2520used%2520by%2520TFS%26f%3dfalse" target="_blank">TFS
will definitely take advantage of several of the features</a>.
</p>
        <p>
It is pretty easy to setup from there:
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_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="Configuring SmartAssembly Database Connection" border="0" alt="Configuring SmartAssembly Database Connection" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb.png" width="738" height="526" />
          </a>  
</p>
        <p>
Be sure to also indicate that you want to use relative paths.  Relative paths
will be very important when you are using it in a team environment with Team Foundation
Server.
</p>
        <p>
BTW, if you need to setup SmartAssembly to use SQL Authentication instead of Windows
Authentication, you can do that <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.red-gate.com%2fsupportcenter%2fcontent%2fSmartAssembly%2fhelp%2f6.5%2fSA_ConfigureErrorReports" target="_blank">using
this particular article</a><font style="background-color: #ffff00"></font>. You do
this by basically updating the settings configuration file available on a Windows
7 machine at <font face="Consolas">C:\ProgramData\Red Gate\SmartAssembly\SmartAssembly.settings</font>.
</p>
        <h1>Creating &amp; Storing the SmartAssembly Configuration File in Version Control
</h1>
        <p>
I am going to make this easy by just using a quick Windows Forms application however
you are able to process any type of assembly including Silverlight apps, ASP.NET web
applications, class libraries, etc. using SmartAssembly.
</p>
        <p>
You will want to compile your assembly at least once and then start a new SmartAssembly
project.  It actually doesn’t matter where the source &amp; destination location
of the assembly is set to in the configuration but you might want to pick a location
that all of the developers will be using.  Don’t worry about the build server
locations because we will override those later in the build process!  To keep
it simple, I’m only going to enable the following features in my SmartAssembly configuration
file:
</p>
        <ul>
          <li>
Automated Error Reporting, 
</li>
          <li>
Feature Usage Reporting, and 
</li>
          <li>
Generate Debugging Information</li>
        </ul>
        <p>
You can research more on the other options that are available but I am going to keep
this walkthrough very simple.  Once you are satisfied with your settings, click
the “Save As…” button and save the configuration file in the same folder as your Visual
Studio project file.  I even like to include the file in my Visual Studio project
so that I can work with it and check it into the version control repository along
with the rest of my project.  The SmartAssembly configuration file has a “<font face="Consolas">.saproj</font>”
file extension.
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_4.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="Visual Studio Project with Smart Assembly Configuration File" border="0" alt="Visual Studio Project with Smart Assembly Configuration File" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_1.png" width="287" height="196" />
          </a>
        </p>
        <p>
The next thing you might want to do is open the configuration file using the XML Editor
in Visual Studio to verify all of the settings look correct. You can use the “Open
With…” context menu command from the Solution Explorer window to help you out.
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_10.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="Using the Open With Command in Visual Studio Solution Explorer" border="0" alt="Using the Open With Command in Visual Studio Solution Explorer" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_4.png" width="387" height="297" />
          </a>
        </p>
        <p>
The main thing you want to do is be very mindful of using relative file paths everywhere
in the configuration file since the location of the source code location changes on
the build server &amp; developer machines.  For example, TFS Build allows you
to have multiple build agents running on any build server.  I might have three
build agents on a build server which means three builds could be running at any given
time on the build server.  You isolate each build agent on a build server by
setting the working directory to something that will be a unique value.  The
default setting is <font face="Consolas">$(SystemDrive)\Builds\$(BuildAgentId)\$(BuildDefinition<font style="background-color: #ffff00">Name</font>)</font> but
I usually change it to <font face="Consolas">$(SystemDrive)\Builds\$(BuildAgentId)\$(BuildDefinition<font style="background-color: #ffff00">Id</font>)</font> to
give me a few extra characters since we also have path length limitations to go up
against.
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fSNAGHTML5088658.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="SNAGHTML5088658" border="0" alt="SNAGHTML5088658" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/SNAGHTML5088658_thumb.png" width="522" height="504" />
          </a>
        </p>
        <h1>Defining Custom MSBuild Properties
</h1>
        <p>
At this point, we are going to define a few custom MSBuild properties that we are
going to use to trigger the SmartAssembly functionality.  The table lists the
properties I am going to define in this process.
</p>
        <table border="1" cellspacing="0" cellpadding="2" width="841">
          <tbody>
            <tr>
              <td valign="top" width="133">
                <strong>Property Name</strong>
              </td>
              <td valign="top" width="140">
                <strong>Value(s)</strong>
              </td>
              <td valign="top" width="566">
                <strong>Description</strong>
              </td>
            </tr>
            <tr>
              <td valign="top" width="133">
                <font face="Consolas">TfsBuild</font>
              </td>
              <td valign="top" width="140">
                <font face="Consolas">True, False</font>
              </td>
              <td valign="top" width="566">
Indicates whether this build is occurring using TFS.</td>
            </tr>
            <tr>
              <td valign="top" width="133">
                <font face="Consolas">RunSmartAssembly</font>
              </td>
              <td valign="top" width="140">
                <font face="Consolas">True, False</font>
              </td>
              <td valign="top" width="566">
Indicates whether the SmartAssembly processing should occur after compilation.</td>
            </tr>
            <tr>
              <td valign="top" width="133">
                <font face="Consolas">SmartAssemblyConfigurationFileRelativePath</font>
              </td>
              <td valign="top" width="140">
&lt;Relative File Path&gt;</td>
              <td valign="top" width="566">
Stores the relative path location to the <font face="Consolas">.saproj</font> configuration
file for the project.</td>
            </tr>
          </tbody>
        </table>
        <h1>Modifying the Visual Studio Project Files
</h1>
        <p>
For many of the common project types, Visual Studio project files are in fact actually
MSBuild scripts under the covers.  What we are going to do is add some custom
functionality at the end of the project file that we will later “turn on” during the
build process.  You could modify this so that you could “turn on” the functionality
at development time locally but this additional script excerpt will leave it turned
off during normal development.
</p>
        <p>
To edit a Visual Studio Project file, you can “unload” the project from the context
menu in Solution Explorer and then double-click it to open it in a new editor document
window.  You will add the following excerpt close to the bottom of your Visual
Studio project file just before the final <font face="Consolas">&lt;/Project&gt;</font> ending
tag. In my case it is a <font face="Consolas">.csproj</font> file.
</p>
        <pre class="brush: xml; auto-links: false;">&lt;!-- Red Gate SmartAssembly Custom Post-Compile Processing for TFS Builds --&gt;
&lt;UsingTask TaskName="SmartAssembly.MSBuild.Tasks.Build" AssemblyName="SmartAssembly.MSBuild.Tasks, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7f465a1c156d4d57" Condition="'$(TfsBuild)' == 'True' and '$(RunSmartAssembly)' == 'True'" /&gt;
&lt;PropertyGroup Condition="'$(TfsBuild)' == 'True' and '$(RunSmartAssembly)' == 'True'"&gt;
  &lt;!-- Uncomment this next line if the configuration file is not located in the same directory and uses the same name as the project. --&gt;
  &lt;!--&lt;SmartAssemblyConfigurationFileRelativePath&gt;SmartAssemblyConfigurationFileName.saproj&lt;/SmartAssemblyConfigurationFileRelativePath&gt;--&gt;
  &lt;!-- This will set the default name of the configuration file to the same name as the project name if the property is not defined elsewhere. --&gt;
  &lt;SmartAssemblyConfigurationFileRelativePath Condition="'$(SmartAssemblyConfigurationFileRelativePath)' == ''"&gt;$(ProjectName).saproj&lt;/SmartAssemblyConfigurationFileRelativePath&gt;
&lt;/PropertyGroup&gt;
&lt;Target Name="AfterBuild" Condition="'$(TfsBuild)' == 'True' and '$(RunSmartAssembly)' == 'True'"&gt;
  &lt;!-- Archiving the original compiled assembly and matching debugging symbols file. --&gt;
  &lt;Message Text="Archiving the original compiled assembly and matching debugging symbols file." /&gt;
  &lt;Copy SourceFiles="@(_DebugSymbolsOutputPath)" DestinationFolder="$(OutDir)Original" Condition="'$(_DebugSymbolsProduced)' == 'true' and '$(CopyBuildOutputToOutputDirectory)' == 'true' and '$(SkipCopyBuildProduct)' != 'true'" /&gt;
  &lt;Copy SourceFiles="@(MainAssembly)" DestinationFolder="$(OutDir)Original" Condition="'$(CopyBuildOutputToOutputDirectory)' == 'true' and '$(SkipCopyBuildProduct)' != 'true'" /&gt;
  &lt;!-- Process Assembly through SmartAssembly --&gt;
  &lt;SmartAssembly.MSBuild.Tasks.Build ProjectFile="$(SmartAssemblyConfigurationFileRelativePath)" Input="@(MainAssembly)" Output="@(MainAssembly)" OverwriteAssembly="True" /&gt;
&lt;/Target&gt;
</pre>
        <p>
It is a modified version of the snippet from the SmartAssembly help documentation
for integrating with MSBuild:  <a title="http://www.red-gate.com/supportcenter/Content/SmartAssembly/help/6.5/SA_UsingSmartAssemblyWithMSBuild" href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.red-gate.com%2fsupportcenter%2fContent%2fSmartAssembly%2fhelp%2f6.5%2fSA_UsingSmartAssemblyWithMSBuild">http://www.red-gate.com/supportcenter/Content/SmartAssembly/help/6.5/SA_UsingSmartAssemblyWithMSBuild</a>. 
You’ll see a little later where we are going to “turn on” the functionality by editing
the TFS build process template.  If you named your configuration file the same
name as the project name and stored it in the same location in version control you
actually don’t need to modify anything in the snippet at all.
</p>
        <p>
Notice that the snippet keeps the original copies of the assemblies and matching symbols
(.PDB) file so that they later get copied to the TFS build’s drop folder.  It
is copying the original assembly and matching symbols into another subdirectory named
“<font face="Consolas">Original</font>” instead of just outputting the SmartAssembly
instrumented assembly &amp; matching symbols to a subfolder called “<font face="Consolas">Obfuscated</font>”,
“<font face="Consolas">Instrumented</font>”, or “<font face="Consolas">Protected</font>.” 
I used to use the latter approach (as some people suggest) but if you are also compiling
installers, it is useful to create an installer during specific builds that include
the original assemblies instead of the instrumented ones.  In my installer definition
(like a <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwix.codeplex.com%2f" target="_blank">WiX</a> file)
I’ll just refer to the regular location and it will pickup whatever version the build
process created.  If I want an installer to have the original assemblies then
I just queue a new build and will set the SmartAssembly process parameter to false
for that build.  I don’t have to do anything additional in my WiX definition
files to handle this scenario.  
</p>
        <p>
Another side effect you get by using this approach is that if your build process runs
any automated tests, static code analysis, test impact analysis, etc., then it will
use the instrumented versions of the assemblies as the target of the tests and other
post-processing tools!  There are <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.usingenglish.com%2freference%2fidioms%2fthere%2bare%2bmany%2bways%2bto%2bskin%2ba%2bcat.html" target="_blank">several
ways to skin this particular cat</a> but I have fallen back to this approach after
a few years of dealing with these issues.
</p>
        <h1>Modifying the Build Process Template in Windows Workflow Foundation
</h1>
        <p>
Technically, we could just hard-code the extra MSBuild process parameters that we
need using the default TFS build process template on the Process tab of the build
definition editor window:
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_12.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="Setting Additional MSBuild Property Values in TFS 2010 Build Definition Editor" border="0" alt="Setting Additional MSBuild Property Values in TFS 2010 Build Definition Editor" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_5.png" width="1038" height="605" />
          </a>
        </p>
        <p>
If you are okay with this approach then you don’t really need to go any further. 
However, we could make this a richer experience for people who will edit and queue
these builds from day to day.  This is where we can go through and create a custom
process template.
</p>
        <p>
The first thing you will want to do is create a new build process template to start
your customizations.  I have included mine for download at the end of this blog
post but you may want to walk along.  I usually start by creating a copy of the
default build process template available from TFS.  If you aren’t familiar with
the basics of this particular process, I would highly suggest going through the walkthrough
in either of these books:
</p>
        <ul>
          <li>
            <strong>Chapter 16 – “Customizing the Build Process”</strong> -  from <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fbit.ly%2fTFS2010Book" target="_blank">Professional
Team Foundation Server 2010</a> by Wrox (Wiley) – Authors:  <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.edsquared.com" target="_blank">Ed
Blankenship</a>, <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwoodwardweb.com%2f" target="_blank">Martin
Woodward</a>, <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fblogs.msdn.com%2fb%2fgranth%2f" target="_blank">Grant
Holliday</a>, and <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fblogs.msdn.com%2fb%2fbriankel%2f" target="_blank">Brian
Keller</a></li>
          <li>
            <strong>Chapter 16 – “Process Template Customization”</strong> – from <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fbit.ly%2fMSBuild2ndEdition" target="_blank">Inside
the Microsoft Build Engine: Using MSBuild and Team Foundation Build - Second Edition</a> by
Microsoft Press – Authors:  <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fsedodream.com%2f" target="_blank">Sayed
Hashimi</a> and <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fblogs.msdn.com%2fb%2fwillbar%2f" target="_blank">William
Bartholomew</a></li>
        </ul>
        <p>
You can then change your build definition over to the newly copied build process template
using the following combo box.
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_14.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="Selecting a New TFS Build Process Template" border="0" alt="Selecting a New TFS Build Process Template" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_6.png" width="765" height="226" />
          </a>
        </p>
        <p>
If you click on the hyperlink, it will take you to the location in Source Control
Explorer where you can get the latest version into your workspace and then open the
build process template file for editing in the Windows Workflow Foundation Designer.
</p>
        <h2>Defining Build Definition Process Parameters
</h2>
        <p>
The first thing we can do is specify a new build process parameter that is exposed
to the end user of the builds by going to the “Arguments” tab in the lower left-hand
corner of the Workflow designer.
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_16.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="Arguments Tab for Windows Workflow Designer" border="0" alt="Arguments Tab for Windows Workflow Designer" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_7.png" width="301" height="157" />
          </a>
        </p>
        <p>
I am going to create a Boolean process parameter simply named “<font face="Consolas">RunSmartAssembly</font>”
and set the default value to <font face="Consolas">False</font>.  This isn’t
an MSBuild property but a workflow process parameter that will be exposed to the end
user when they are queuing a new build or when editing the build definition.
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_18.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="Creating New TFS Build Process Parameter" border="0" alt="Creating New TFS Build Process Parameter" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_8.png" width="968" height="152" />
          </a>
        </p>
        <p>
This next step is just to make things that much nicer.  We can give the TFS Build
system some additional metadata to make sure the parameter is exposed to the end user
in a nice fashion.  There are more details about the process parameter metadata
field in either of the book chapters mentioned above in case you would like to learn
more!  You edit the collection information for the <font face="Consolas">Metadata</font> parameter
that is already defined in the default build process template.  (It’s two above
the parameter we created in the previous screenshot.)  Just click the ellipsis
button in the default value field column to open up the metadata editor window.
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fSNAGHTML7d90160.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="TFS Build Process Parameter Metadata Editor" border="0" alt="TFS Build Process Parameter Metadata Editor" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/SNAGHTML7d90160_thumb.png" width="386" height="455" />
          </a>
        </p>
        <p>
Fill out the details as indicated above and save your build process template. You
won’t see the changes immediately if you were to go back to the build definition editor
because we haven’t checked-in the build process template back to the version control
repository yet.
</p>
        <h2>Verify SmartAssembly is Installed on Build Server
</h2>
        <p>
Whenever I architect a build that requires the use of a custom tool and it isn’t stored
in version control (or even if it is but someone forgot to add that workspace mapping)
I usually want to add a check in the build process to make sure that the tools are
actually available to the build server.  If the check doesn’t locate the tool
I have it give a nice build error.
</p>
        <p>
Add an <font face="Consolas">If</font> workflow activity inside the <font face="Consolas">Build
Agent Scope</font> activity (labeled “Run on Agent”) but before the section that starts
the compilation.  It doesn’t exactly matter where as long as you get them in
the agent scope but before any type of compilation begins.  I am going to set
my condition to something like the following:
</p>
        <pre class="brush: vb; auto-links: false;">RunSmartAssembly AndAlso Not System.IO.File.Exists(String.Format("{0}\{1}\{2}", Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "Red Gate\SmartAssembly 6", "SmartAssembly.exe"))
</pre>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
You can then add a <font face="Consolas">Write Build Error</font> activity with an
appropriate message to indicate that SmartAssembly was not found.  It should
look something along the lines of this following example.
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_20.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="Verifying SmartAssembly is Installed on TFS Build Server" border="0" alt="Verifying SmartAssembly is Installed on TFS Build Server" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_9.png" width="508" height="677" />
          </a>
        </p>
        <h2>Appending Additional MSBuild Properties
</h2>
        <p>
We can now work on passing in the additional MSBuild properties.  I’m going to
do this in two steps.  The first step is to append the <font face="Consolas">TfsBuild</font> MSBuild
property to the pre-defined workflow variable that is used for this purpose named <font face="Consolas">MSBuildArguments</font>. 
I’m going to do this immediately after the workflow activities we added for the previous
step using another native primitive workflow activity:  <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fdd647739.aspx" target="_blank">Assign</a>. 
It’s a super simple activity that is great for this particular purpose.  The
assignment expression that I am going to use for the <font face="Consolas">Value</font> parameter
is:
</p>
        <pre class="brush: vb; auto-links: false;">String.Format("{0} {1}", MSBuildArguments, " /p:TfsBuild=True")
</pre>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_22.png">
            <img style="background-image: none; border-right-width: 0px; margin: 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://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_2.png" width="293" height="176" />
          </a>
        </p>
        <p>
After that, we will add another <font face="Consolas">If</font> activity where the
conditional will be set to the <font face="Consolas">RunSmartAssembly</font> workflow
parameter we created earlier.  We will also add add another <font face="Consolas">Assign</font> activity
and append our remaining MSBuild property to pass into the compilation process. 
You can use this assignment expression for the Value parameter of the <font face="Consolas">Assign</font> activity:
</p>
        <pre class="brush: vb; auto-links: false;">String.Format("{0} {1}", MSBuildArguments, " /p:RunSmartAssembly=True")
</pre>
        <p>
The final sequence looks similar to the following screenshot.
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_24.png">
            <img style="background-image: none; border-right-width: 0px; margin: 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://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_3.png" width="482" height="662" />
          </a>
        </p>
        <p>
You may be asking “Why did we define the <font face="Consolas">$(TfsBuild)</font> MSBuild
property when we could have just used the <font face="Consolas">$(RunSmartAssembly)</font> property?”
That’s a great question… You don’t need it if you aren’t going to do any additional
customization. However, in general, I like to always define the <font face="Consolas">$(TfsBuild)</font> MSBuild
property so that you could customize the project files to modify the conditions based
on whether it is occurring during a TFS Build or if it’s occurring on a developer’s
machine. It’s quite handy when you need it.
</p>
        <p>
Notice that we are also performing all of the SmartAssembly processing steps before
the <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fbit.ly%2fSymbolServerTFS" target="_blank">Source
Server Indexing and Symbol Server Publishing</a> phase of the build process so that
both the original symbols and the symbols that match the instrumented assemblies are
published correctly to Symbol Server and have the appropriate indexing for Source
Server support included in those symbols.  That will be extremely useful later
whenever you need to debug against either the original or instrumented assemblies
in the future.  You can also open <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fdd264915.aspx" target="_blank">IntelliTrace</a> log
files &amp; take advantage of <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fdd264992.aspx" target="_blank">Test
Impact Analysis</a> if you keep obfuscation turned off in the SmartAssembly configuration.
</p>
        <h1>Finale
</h1>
        <p>
That’s it!  Just save the changes to your build process template and check the
file into the version control repository so it can now be used by your build definitions. 
Be sure to set your new custom workflow parameter to <font face="Consolas">True</font> and
then queue a new build!
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_26.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="Setting Custom SmartAssembly Process Parameter" border="0" alt="Setting Custom SmartAssembly Process Parameter" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_10.png" width="372" height="287" />
          </a>
        </p>
        <p>
You’ll now notice that it runs correctly even if you have defined for your build process
to compile multiple build configurations (i.e. Debug | x86, Release | AnyCPU, etc.)
</p>
        <h1>Potential Improvement Areas
</h1>
        <ul>
          <li>
            <strong>Licensing &amp; Activation for Build Servers</strong> – Unfortunately, the
way SmartAssembly is licensed you have to purchase a license for each of the build
servers you might have and activate the software on those build servers.  The
accompanying side effect is that the developer licenses are cheaper.<br />
This can be problematic in a TFS environment where you might have a build farm that
has one build controller with 20 build servers that have three agents on each of those
build servers.  It’s not that SmartAssembly would be used at the same time on
all 60 of those build agents but you also don’t know which build agent will be reserved
for a particular build at any given time.  I have resorted to using the build
agent tagging feature of TFS Build to handle making sure particular builds only reserve
an agent with SmartAssembly configured &amp; activated.  However, this causes
a complete underuse of the hardware resources available in a build farm.  
<br />
I would rather tool vendors achieve their revenue targets by increasing the per-user
license fee because and specifically for users who benefit from the advantages that
the particular tool brings to them. This licensing model if very similar to how the
Visual Studio &amp; third-party components licensing model works.  Microsoft
and other third-party component vendors give you the ability to install and use the
their tools on a build server without charge.<br />
I consider build agent machines throw-away machines.  They should remain completely
clean but don’t need to be backed up or monitored.  I usually will have a virtual
machine base image that has everything already installed &amp; ready to go so that
I can add/remove to the build farm “pool” as needed.  I even prefer to throw
away machines after 30 days and bring new build agents online to ensure the whole
build farm is kept as clean as possible.  When you have tools that require activation
&amp; licensing, this scenario quickly becomes problematic.  This leads me to
another potential area for improvement. 
</li>
          <li>
            <strong>Installation on Build Servers</strong> – If you know me well, this is a slightly
less critical criticism than the first bullet point but also a pretty big pet peeve
of mine. <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://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/wlEmoticon-smile_2.png" /> 
If you make tools, please don’t require them to be installed on the build server.
It’s another thing that has to be kept up to date on potentially many machines and
in a base system image.  I would rather be able to check them into a known version
control folder and then have the build servers download the latest version during
the build process.  There is even a supported mechanism in <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fee330987.aspx%23controller_properties" target="_blank">TFS
Build that allows the build controllers &amp; agents to watch for custom assemblies
&amp; tools</a> and whenever it notices a new version of those assemblies then it
gracefully updates all of the machines in the build farm automatically.  This
allows team members to focus &amp; introduce changes to the tools using version control
instead of having to update the base image of the build server every time there is
a new update.<br />
You also benefit from having full auditing of what exact tools version were used to
produce a specific set of assemblies.  That allows you to potentially recreate
a build you created a year ago by simply specifying what version of the source code
(including build tools) to use during that build process. 
</li>
          <li>
            <strong>Native Workflow Activity for TFS 2010 Build Process Templates</strong> - 
The process I described in this blog article is definitely much more difficult than
what it could be.  Instead of introducing customizations in the MSBuild-portion
of the TFS build process, I much rather prefer dropping in a native workflow activity
after the compilation process.  SmartAssembly unfortunately doesn’t have a custom
TFS build workflow activity at this time.  I would love to see one that allowed
me to specify multiple assembly inputs for each build configuration that occurs in
the build process and then the appropriate SmartAssembly configuration file for each
of the assemblies.  You can do some nice things with it to really make this process
super easy. 
</li>
          <li>
            <strong>Database Endpoint Instead of a Web Service Layer</strong> – SmartAssembly
requires the entire team to have access to the centralized database to manage the
automated error &amp; feature usage reports.  The software makes direct database
calls instead of going through a service layer is which is very different from the
way that tools built for TFS are designed in general.  This can be problematic
especially if you have TFS setup for your team to be able to access remotely over
HTTPS (port 443) without the use of a VPN.  Several IT organizations,really don’t
want to open their database ports or even give access to production database instances. 
My suggestion would be to have an intermediate service layer that can “integrate”
with the existing TFS IIS web sites.  This allows the tool’s service layer to
piggy back on the existing infrastructure already setup for TFS.  If you have
an SSL certificate and HTTPS configured, then you can take advantage of it. 
If you have load balancing setup for scalability, then you could potentially leverage
that as well!  We did this with our <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fwww.imaginet.com%2fSolutions%2fALM%2fPages%2fNotion-Timesheet.aspx" target="_blank">Notion
Timesheet for TFS</a> tools and one of the benefits we end up getting is that we are
able to access the service layer from anywhere we can access TFS including over the
Public Internet.  No worries about giving people access to the SQL Server instance
as well. 
</li>
          <li>
            <strong>Source Server Support</strong> – This isn’t necessarily a TFS-specific topic
but really something for anyone using build servers &amp; <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=http%3a%2f%2fbit.ly%2fSymbolServerTFS" target="_blank">Source
Server indexing</a>.  When you compile on a build server, the location of the
source code is included in the symbol information.  Your developers will normally
not download the source code to the same location as other developers and particularly
not the same location that the build server does since that changes depending on what
TFS build agent is used on a build server for any particular TFS build.  Source
Server Indexing helps to combat this particular problem by replacing the physical
location with the location in the version control repository including the branch
and version of the code used.  SmartAssembly has a feature that allows you to
review details of stack trace, object values, etc. when you open an error report. 
However, it doesn’t use the Source Server information even if it is stored in the
symbol files.  This is particularly a problem when you are in a TFS environment
and using automated builds.  SmartAssembly just ignores those additional streams
in the symbols file.  SmartAssembly should use the Source Server information
if it exists in the symbols to pull the appropriate version of source code from the
version control repository.  <em>(Red Gate Support Ticket Number:  F0041570)</em></li>
          <li>
            <strong>Additional ALM Integration with TFS</strong> – There are so many different
areas where SmartAssembly could shine if it had some additional ALM-specific integration
with TFS!</li>
        </ul>
        <h1>Download Process Template
</h1>
        <p>
If you are interested in downloading the completely customized version of the build
process template, I have included a link to it below.
</p>
        <p align="center">
          <a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;url=https%3a%2f%2fskydrive.live.com%2fredir.aspx%3fcid%3d077db794c0a4dfe0%26resid%3d77DB794C0A4DFE0!880%26parid%3d77DB794C0A4DFE0!156%26authkey%3d!AArB8779ENRg5J4" target="_blank">Download
SmartAssembly Process Template</a>
        </p>
        <p>
 
</p>
        <p>
 
</p>
        <p>
Take care,
</p>
        <p>
          <strong>Ed Blankenship</strong>
        </p>
        <img width="0" height="0" src="http://www.edsquared.com/aggbug.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d" />
        <br />
        <hr />
Brought to you by Ed Blankenship and Ed Kisinger at EdSquared.com</body>
      <title>Integrating Red Gate SmartAssembly Into TFS 2010 Build</title>
      <guid isPermaLink="false">http://www.edsquared.com/PermaLink,guid,2e6737b3-6862-44cb-8581-9110da46b74d.aspx</guid>
      <link>http://www.edsquared.com/2011/12/27/Integrating+Red+Gate+SmartAssembly+Into+TFS+2010+Build.aspx</link>
      <pubDate>Tue, 27 Dec 2011 18:20:31 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;&lt;strong&gt;Updates&lt;/strong&gt; – I plan on making updates to this blog article from
time to time as I learn more and changes are made to TFS &amp;amp; SmartAssembly to smooth
out some of the rough edges.&amp;nbsp; Come back again for the latest &amp;amp; greatest!&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
I really like tools that provide assistance with the release management &amp;amp; maintenance
cycles of &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fen.wikipedia.org%2fwiki%2fApplication_lifecycle_management" target="_blank"&gt;ALM&lt;/a&gt;.&amp;nbsp;
I think some of the features really add a particular shine to your application.&amp;nbsp;
It’s something that I’m currently writing an article about but I wanted to share how
to integrate one of those tools into your &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2fvstudio%2fff637362" target="_blank"&gt;Team
Foundation Server 2010&lt;/a&gt; Build Process.&amp;nbsp; This first tool to be reviewed is &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.wintellect.com%2fcs%2fblogs%2fjrobbins%2farchive%2f2007%2f12%2f21%2fcode-signing-it-s-cheaper-and-easier-than-you-thought.aspx" target="_blank"&gt;Red
Gate’s SmartAssembly&lt;/a&gt; product.&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.red-gate.com%2fproducts%2fdotnet-development%2fsmartassembly%2f" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Red Gate SmartAssembly" border="0" alt="Red Gate SmartAssembly" align="right" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/SmartAssemblyBox_5.png" width="176" height="224"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
SmartAssembly is a product that can help you out with obfuscation if you need it but
I primarily want to focus on two of its other major features:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.red-gate.com%2fproducts%2fdotnet-development%2fsmartassembly%2ffeatures%2f%23automated-error-reporting" target="_blank"&gt;Automated
Error Reporting&lt;/a&gt; – When an exception occurs, the end user can be prompted to send
back the exception details so that the development team can review those details.&amp;nbsp;
This can also work with server-side &amp;amp; web applications without requiring end user
prompting. 
&lt;li&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.red-gate.com%2fproducts%2fdotnet-development%2fsmartassembly%2ffeatures%2f%23feature-usage-reporting" target="_blank"&gt;Feature
Usage Reporting&lt;/a&gt; – This is essentially telemetry for your application to figure
out how your users are using the application so that you can make good decisions in
the future about where to invest for future releases.&amp;nbsp; It does this by sending
back anonymous data for users who opt-in at runtime.&amp;nbsp; It will even automatically
send back data about the machine the software is being run like the operating system.&amp;nbsp;
This can be extremely useful data to product managers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
You don’t have to worry about any of the details because once you run your assemblies
through SmartAssembly, it instruments all of the necessary functionality automatically
for you.&amp;nbsp; If you acquire the Professional edition, you can customize the reporting
experience including the ability to host your own web server to accept the error &amp;amp;
feature usage reports.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;&lt;em&gt;Aside&lt;/em&gt;&lt;/strong&gt;:&amp;nbsp; Too many teams &amp;amp; companies have blindly
adopted obfuscation for their assemblies in the past without taking into consideration
the true “total cost” of obfuscating your applications.&amp;nbsp; I’m all for obfuscation
where it makes sense to protect IP as long as the value of the protection of that
IP is worth more than the extra cost, resources, and maintenance complexity to truly
support an obfuscated product.&amp;nbsp; Each team &amp;amp; company is going to have to make
that decision based on the resources available and the value of the IP to be protected&amp;nbsp;
– just don’t go into it blindly.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;em&gt;FYI – &lt;/em&gt;&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.preemptive.com%2fproducts%2fdotfuscator%2foverview" target="_blank"&gt;&lt;em&gt;PreEmptive’s
Dotfuscator&lt;/em&gt;&lt;/a&gt;&lt;em&gt; tool is a competing product line with a similar feature set
that I hope to be covering in a future blog post.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Ignoring obfuscation, these two features are absolutely great for gaining visibility
about your application once it has been released.&amp;nbsp; For all of those teams that
aren’t traditional software vendors but building applications for internal use, these
are great features for those applications as well.&amp;nbsp; Software engineering teams
building internal applications are very much in need of the same type of information
as ISVs about how their internal “customers” are interacting with their applications.&amp;nbsp;
Internal applications don’t necessarily need obfuscation but they can definitely benefit
from automated error &amp;amp; feature usage reporting!
&lt;/p&gt;
&lt;p&gt;
One part that I absolutely love about SmartAssembly is that even though the tool instruments
and changes your assembly, it also provides the ability to produce a set of matching &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fbit.ly%2fSymbolServerTFS" target="_blank"&gt;symbols
(.PDBs)&lt;/a&gt; that are extremely important for several scenarios in TFS, the Visual
Studio ALM family of tools, as well as basic debugging.
&lt;/p&gt;
&lt;p&gt;
I am going to be spending some time in this blog article to walkthrough how to integrate
SmartAssembly into your automated TFS build process so that your teams can take advantage
of these features.&amp;nbsp; I am going to take the approach of not creating any custom
workflow activities for this particular effort.&amp;nbsp; &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fblogs.msdn.com%2fb%2fjimlamb%2farchive%2f2010%2f06%2f09%2fwindows-workflow-vs-msbuild-in-tfs-2010.aspx" target="_blank"&gt;Jim
Lamb has a good discussion&lt;/a&gt; about when to make customizations to the MSBuild file
(essentially the Visual Studio project file) and when to make your customizations
in the Windows Workflow-based build process template.&amp;nbsp; As much as I very much
prefer customizing my build process templates using custom workflow activities, in
this case I choose to do a little customization of both without using any custom workflow
activities.&amp;nbsp; I would much rather have done this using only native Windows Workflow
activities but I’ll talk more about that a little later.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;Disclaimer&lt;/strong&gt;:&amp;nbsp; As a &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=https%3a%2f%2fmvp.support.microsoft.com%2fprofile%2fed.blankenship" target="_blank"&gt;Microsoft
MVP&lt;/a&gt;, I have been a part of the &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.red-gate.com%2four-company%2fabout%2fcommunity-relations%2ffriends-of-rg" target="_blank"&gt;Friends
of Red Gate&lt;/a&gt; group for the last four years and I have been provided Not For Resale
licenses of the Red Gate family of products though I reserve the right to offer unbiased
opinions and criticisms.&amp;nbsp; I was not paid for these contributions.&amp;nbsp; However,
I may or may not get a complimentary round the next time I see the Red Gaters at the
pub in Cambridge. &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://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/wlEmoticon-smile_2.png"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.codinghorror.com%2fblog%2f2007%2f03%2fthe-works-on-my-machine-certification-program.html" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Work on My Machine Logo" border="0" alt="Works on My Machine Logo" align="right" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/WorksOnMyMachine_3.png" width="212" height="205"&gt;&lt;/a&gt;Works
on My Machine Disclaimer&lt;/strong&gt;:&amp;nbsp; Everything in this blog article &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.codinghorror.com%2fblog%2f2007%2f03%2fthe-works-on-my-machine-certification-program.html" target="_blank"&gt;works
on my machine&lt;/a&gt; when I wrote it.&amp;nbsp; I have the latest version of SmartAssembly
and TFS 2010 installed &amp;amp; configured correctly.&amp;nbsp; I’ve done my best to make
this as reusable as possible for most team’s scenarios but I can’t tell you that it
will work for you.&amp;nbsp; Hopefully it gets you started on the right path though!&amp;nbsp;
Please don’t contact me and let me know that my code killed your cat.&amp;nbsp; I feel
for you… I do – I just can’t do anything about it.&amp;nbsp; You’ve been warned.&amp;nbsp;
I take the same approach that &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.hanselman.com%2fblog%2f" target="_blank"&gt;Scott&lt;/a&gt; does
with blog contributions.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;h1&gt;Configuring SmartAssembly for Team Use
&lt;/h1&gt;
&lt;p&gt;
SmartAssembly has actually been designed out of the box to handle the single-developer
team scenario.&amp;nbsp; If you are using TFS, you are likely not a single-developer team
so you’ll want to a few things to get &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.red-gate.com%2fproducts%2fdotnet-development%2fsmartassembly%2fteam-package" target="_blank"&gt;SmartAssembly
setup for use with a team&lt;/a&gt;.&amp;nbsp; The architecture for SmartAssembly can best be
described with this architecture diagram:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.red-gate.com%2fproducts%2fdotnet-development%2fsmartassembly%2fteam-package" target="_blank"&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="Smart Assembly Architecture Diagram" border="0" alt="Smart Assembly Architecture Diagram" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/SmartAssemblyArchitectureDiagram_5.png" width="612" height="423"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;em&gt;Source&lt;/em&gt;:&amp;nbsp; &lt;a title="http://www.red-gate.com/products/dotnet-development/smartassembly/team-package" href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.red-gate.com%2fproducts%2fdotnet-development%2fsmartassembly%2fteam-package"&gt;http://www.red-gate.com/products/dotnet-development/smartassembly/team-package&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
You’ll need to get the &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.red-gate.com%2fproducts%2fdotnet-development%2fsmartassembly%2fpricing" target="_blank"&gt;Professional&lt;/a&gt; edition
of SmartAssembly since it allows you to store everything in a shared SQL Server database.&amp;nbsp;
One nice thing is that each developer who will need to interact with error &amp;amp; feature
usage reports only needs a Developer edition license instead of a full Professional
edition license.&amp;nbsp; You’ll need to install &amp;amp; configure the Professional edition
on each of your build servers.&amp;nbsp; You might as well go ahead and create a &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fbb399135.aspx%23assign_tags" target="_blank"&gt;build
agent tag&lt;/a&gt; called “&lt;font face="Consolas"&gt;SmartAssembly&lt;/font&gt;” to indicate which
build agents in your build farm are hosted on servers that have SmartAssembly installed.
&lt;/p&gt;
&lt;p&gt;
When you first start SmartAssembly, you will want to setup the desktop machines &amp;amp;
build servers to use the same SQL connection settings for the shared SmartAssembly
database.&amp;nbsp; I even like to use the &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2f2011%2f01%2f03%2fUsing%2bFriendly%2bDNS%2bNames%2bIn%2bYour%2bTFS%2bEnvironment.aspx" target="_blank"&gt;friendly
TFS DNS names&lt;/a&gt; that I already have setup for my particular TFS environment.&amp;nbsp;
Remember that if you are using the &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.microsoft.com%2fdownload%2fen%2fdetails.aspx%3fdisplaylang%3den%26id%3d13350" target="_blank"&gt;limited
use license of SQL that is included with TFS&lt;/a&gt;, you won’t be able to house the SmartAssembly
database on that instance.&amp;nbsp; You’ll need to purchase a legitimate SQL Server license.&amp;nbsp;
It’s a great time to upgrade to the SQL Enterprise edition if you can for TFS!&amp;nbsp; &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fbooks.google.com%2fbooks%3fid%3d9d7JUTMpZDYC%26pg%3dPA31%26lpg%3dPA31%26dq%3dSQL%2bEnterprise%2bfeatures%2bused%2bby%2bTFS%26source%3dbl%26ots%3db-vy7VYIir%26sig%3dSHCKFHEl3RvplvOWqF2DH-_1nOQ%26hl%3den%26sa%3dX%26ei%3dyVD2TsG4F-Xs0gGh4vHQAg%26ved%3d0CFEQ6AEwBg%23v%3donepage%26q%3dSQL%2520Enterprise%2520features%2520used%2520by%2520TFS%26f%3dfalse" target="_blank"&gt;TFS
will definitely take advantage of several of the features&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
It is pretty easy to setup from there:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_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="Configuring SmartAssembly Database Connection" border="0" alt="Configuring SmartAssembly Database Connection" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb.png" width="738" height="526"&gt;&lt;/a&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Be sure to also indicate that you want to use relative paths.&amp;nbsp; Relative paths
will be very important when you are using it in a team environment with Team Foundation
Server.
&lt;/p&gt;
&lt;p&gt;
BTW, if you need to setup SmartAssembly to use SQL Authentication instead of Windows
Authentication, you can do that &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.red-gate.com%2fsupportcenter%2fcontent%2fSmartAssembly%2fhelp%2f6.5%2fSA_ConfigureErrorReports" target="_blank"&gt;using
this particular article&lt;/a&gt;&lt;font style="background-color: #ffff00"&gt;&lt;/font&gt;. You do
this by basically updating the settings configuration file available on a Windows
7 machine at &lt;font face="Consolas"&gt;C:\ProgramData\Red Gate\SmartAssembly\SmartAssembly.settings&lt;/font&gt;.
&lt;/p&gt;
&lt;h1&gt;Creating &amp;amp; Storing the SmartAssembly Configuration File in Version Control
&lt;/h1&gt;
&lt;p&gt;
I am going to make this easy by just using a quick Windows Forms application however
you are able to process any type of assembly including Silverlight apps, ASP.NET web
applications, class libraries, etc. using SmartAssembly.
&lt;/p&gt;
&lt;p&gt;
You will want to compile your assembly at least once and then start a new SmartAssembly
project.&amp;nbsp; It actually doesn’t matter where the source &amp;amp; destination location
of the assembly is set to in the configuration but you might want to pick a location
that all of the developers will be using.&amp;nbsp; Don’t worry about the build server
locations because we will override those later in the build process!&amp;nbsp; To keep
it simple, I’m only going to enable the following features in my SmartAssembly configuration
file:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Automated Error Reporting, 
&lt;li&gt;
Feature Usage Reporting, and 
&lt;li&gt;
Generate Debugging Information&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
You can research more on the other options that are available but I am going to keep
this walkthrough very simple.&amp;nbsp; Once you are satisfied with your settings, click
the “Save As…” button and save the configuration file in the same folder as your Visual
Studio project file.&amp;nbsp; I even like to include the file in my Visual Studio project
so that I can work with it and check it into the version control repository along
with the rest of my project.&amp;nbsp; The SmartAssembly configuration file has a “&lt;font face="Consolas"&gt;.saproj&lt;/font&gt;”
file extension.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_4.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="Visual Studio Project with Smart Assembly Configuration File" border="0" alt="Visual Studio Project with Smart Assembly Configuration File" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_1.png" width="287" height="196"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The next thing you might want to do is open the configuration file using the XML Editor
in Visual Studio to verify all of the settings look correct. You can use the “Open
With…” context menu command from the Solution Explorer window to help you out.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_10.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="Using the Open With Command in Visual Studio Solution Explorer" border="0" alt="Using the Open With Command in Visual Studio Solution Explorer" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_4.png" width="387" height="297"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The main thing you want to do is be very mindful of using relative file paths everywhere
in the configuration file since the location of the source code location changes on
the build server &amp;amp; developer machines.&amp;nbsp; For example, TFS Build allows you
to have multiple build agents running on any build server.&amp;nbsp; I might have three
build agents on a build server which means three builds could be running at any given
time on the build server.&amp;nbsp; You isolate each build agent on a build server by
setting the working directory to something that will be a unique value.&amp;nbsp; The
default setting is &lt;font face="Consolas"&gt;$(SystemDrive)\Builds\$(BuildAgentId)\$(BuildDefinition&lt;font style="background-color: #ffff00"&gt;Name&lt;/font&gt;)&lt;/font&gt; but
I usually change it to &lt;font face="Consolas"&gt;$(SystemDrive)\Builds\$(BuildAgentId)\$(BuildDefinition&lt;font style="background-color: #ffff00"&gt;Id&lt;/font&gt;)&lt;/font&gt; to
give me a few extra characters since we also have path length limitations to go up
against.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fSNAGHTML5088658.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="SNAGHTML5088658" border="0" alt="SNAGHTML5088658" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/SNAGHTML5088658_thumb.png" width="522" height="504"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h1&gt;Defining Custom MSBuild Properties
&lt;/h1&gt;
&lt;p&gt;
At this point, we are going to define a few custom MSBuild properties that we are
going to use to trigger the SmartAssembly functionality.&amp;nbsp; The table lists the
properties I am going to define in this process.
&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="2" width="841"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="133"&gt;
&lt;strong&gt;Property Name&lt;/strong&gt;&lt;/td&gt;
&lt;td valign="top" width="140"&gt;
&lt;strong&gt;Value(s)&lt;/strong&gt;&lt;/td&gt;
&lt;td valign="top" width="566"&gt;
&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="133"&gt;
&lt;font face="Consolas"&gt;TfsBuild&lt;/font&gt;&lt;/td&gt;
&lt;td valign="top" width="140"&gt;
&lt;font face="Consolas"&gt;True, False&lt;/font&gt;&lt;/td&gt;
&lt;td valign="top" width="566"&gt;
Indicates whether this build is occurring using TFS.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="133"&gt;
&lt;font face="Consolas"&gt;RunSmartAssembly&lt;/font&gt;&lt;/td&gt;
&lt;td valign="top" width="140"&gt;
&lt;font face="Consolas"&gt;True, False&lt;/font&gt;&lt;/td&gt;
&lt;td valign="top" width="566"&gt;
Indicates whether the SmartAssembly processing should occur after compilation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="133"&gt;
&lt;font face="Consolas"&gt;SmartAssemblyConfigurationFileRelativePath&lt;/font&gt;&lt;/td&gt;
&lt;td valign="top" width="140"&gt;
&amp;lt;Relative File Path&amp;gt;&lt;/td&gt;
&lt;td valign="top" width="566"&gt;
Stores the relative path location to the &lt;font face="Consolas"&gt;.saproj&lt;/font&gt; configuration
file for the project.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;Modifying the Visual Studio Project Files
&lt;/h1&gt;
&lt;p&gt;
For many of the common project types, Visual Studio project files are in fact actually
MSBuild scripts under the covers.&amp;nbsp; What we are going to do is add some custom
functionality at the end of the project file that we will later “turn on” during the
build process.&amp;nbsp; You could modify this so that you could “turn on” the functionality
at development time locally but this additional script excerpt will leave it turned
off during normal development.
&lt;/p&gt;
&lt;p&gt;
To edit a Visual Studio Project file, you can “unload” the project from the context
menu in Solution Explorer and then double-click it to open it in a new editor document
window.&amp;nbsp; You will add the following excerpt close to the bottom of your Visual
Studio project file just before the final &lt;font face="Consolas"&gt;&amp;lt;/Project&amp;gt;&lt;/font&gt; ending
tag. In my case it is a &lt;font face="Consolas"&gt;.csproj&lt;/font&gt; file.
&lt;/p&gt;
&lt;pre class="brush: xml; auto-links: false;"&gt;&amp;lt;!-- Red Gate SmartAssembly Custom Post-Compile Processing for TFS Builds --&amp;gt;
&amp;lt;UsingTask TaskName="SmartAssembly.MSBuild.Tasks.Build" AssemblyName="SmartAssembly.MSBuild.Tasks, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7f465a1c156d4d57" Condition="'$(TfsBuild)' == 'True' and '$(RunSmartAssembly)' == 'True'" /&amp;gt;
&amp;lt;PropertyGroup Condition="'$(TfsBuild)' == 'True' and '$(RunSmartAssembly)' == 'True'"&amp;gt;
  &amp;lt;!-- Uncomment this next line if the configuration file is not located in the same directory and uses the same name as the project. --&amp;gt;
  &amp;lt;!--&amp;lt;SmartAssemblyConfigurationFileRelativePath&amp;gt;SmartAssemblyConfigurationFileName.saproj&amp;lt;/SmartAssemblyConfigurationFileRelativePath&amp;gt;--&amp;gt;
  &amp;lt;!-- This will set the default name of the configuration file to the same name as the project name if the property is not defined elsewhere. --&amp;gt;
  &amp;lt;SmartAssemblyConfigurationFileRelativePath Condition="'$(SmartAssemblyConfigurationFileRelativePath)' == ''"&amp;gt;$(ProjectName).saproj&amp;lt;/SmartAssemblyConfigurationFileRelativePath&amp;gt;
&amp;lt;/PropertyGroup&amp;gt;
&amp;lt;Target Name="AfterBuild" Condition="'$(TfsBuild)' == 'True' and '$(RunSmartAssembly)' == 'True'"&amp;gt;
  &amp;lt;!-- Archiving the original compiled assembly and matching debugging symbols file. --&amp;gt;
  &amp;lt;Message Text="Archiving the original compiled assembly and matching debugging symbols file." /&amp;gt;
  &amp;lt;Copy SourceFiles="@(_DebugSymbolsOutputPath)" DestinationFolder="$(OutDir)Original" Condition="'$(_DebugSymbolsProduced)' == 'true' and '$(CopyBuildOutputToOutputDirectory)' == 'true' and '$(SkipCopyBuildProduct)' != 'true'" /&amp;gt;
  &amp;lt;Copy SourceFiles="@(MainAssembly)" DestinationFolder="$(OutDir)Original" Condition="'$(CopyBuildOutputToOutputDirectory)' == 'true' and '$(SkipCopyBuildProduct)' != 'true'" /&amp;gt;
  &amp;lt;!-- Process Assembly through SmartAssembly --&amp;gt;
  &amp;lt;SmartAssembly.MSBuild.Tasks.Build ProjectFile="$(SmartAssemblyConfigurationFileRelativePath)" Input="@(MainAssembly)" Output="@(MainAssembly)" OverwriteAssembly="True" /&amp;gt;
&amp;lt;/Target&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
It is a modified version of the snippet from the SmartAssembly help documentation
for integrating with MSBuild:&amp;nbsp; &lt;a title="http://www.red-gate.com/supportcenter/Content/SmartAssembly/help/6.5/SA_UsingSmartAssemblyWithMSBuild" href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.red-gate.com%2fsupportcenter%2fContent%2fSmartAssembly%2fhelp%2f6.5%2fSA_UsingSmartAssemblyWithMSBuild"&gt;http://www.red-gate.com/supportcenter/Content/SmartAssembly/help/6.5/SA_UsingSmartAssemblyWithMSBuild&lt;/a&gt;.&amp;nbsp;
You’ll see a little later where we are going to “turn on” the functionality by editing
the TFS build process template.&amp;nbsp; If you named your configuration file the same
name as the project name and stored it in the same location in version control you
actually don’t need to modify anything in the snippet at all.
&lt;/p&gt;
&lt;p&gt;
Notice that the snippet keeps the original copies of the assemblies and matching symbols
(.PDB) file so that they later get copied to the TFS build’s drop folder.&amp;nbsp; It
is copying the original assembly and matching symbols into another subdirectory named
“&lt;font face="Consolas"&gt;Original&lt;/font&gt;” instead of just outputting the SmartAssembly
instrumented assembly &amp;amp; matching symbols to a subfolder called “&lt;font face="Consolas"&gt;Obfuscated&lt;/font&gt;”,
“&lt;font face="Consolas"&gt;Instrumented&lt;/font&gt;”, or “&lt;font face="Consolas"&gt;Protected&lt;/font&gt;.”&amp;nbsp;
I used to use the latter approach (as some people suggest) but if you are also compiling
installers, it is useful to create an installer during specific builds that include
the original assemblies instead of the instrumented ones.&amp;nbsp; In my installer definition
(like a &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwix.codeplex.com%2f" target="_blank"&gt;WiX&lt;/a&gt; file)
I’ll just refer to the regular location and it will pickup whatever version the build
process created.&amp;nbsp; If I want an installer to have the original assemblies then
I just queue a new build and will set the SmartAssembly process parameter to false
for that build.&amp;nbsp; I don’t have to do anything additional in my WiX definition
files to handle this scenario.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Another side effect you get by using this approach is that if your build process runs
any automated tests, static code analysis, test impact analysis, etc., then it will
use the instrumented versions of the assemblies as the target of the tests and other
post-processing tools!&amp;nbsp; There are &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.usingenglish.com%2freference%2fidioms%2fthere%2bare%2bmany%2bways%2bto%2bskin%2ba%2bcat.html" target="_blank"&gt;several
ways to skin this particular cat&lt;/a&gt; but I have fallen back to this approach after
a few years of dealing with these issues.
&lt;/p&gt;
&lt;h1&gt;Modifying the Build Process Template in Windows Workflow Foundation
&lt;/h1&gt;
&lt;p&gt;
Technically, we could just hard-code the extra MSBuild process parameters that we
need using the default TFS build process template on the Process tab of the build
definition editor window:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_12.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="Setting Additional MSBuild Property Values in TFS 2010 Build Definition Editor" border="0" alt="Setting Additional MSBuild Property Values in TFS 2010 Build Definition Editor" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_5.png" width="1038" height="605"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
If you are okay with this approach then you don’t really need to go any further.&amp;nbsp;
However, we could make this a richer experience for people who will edit and queue
these builds from day to day.&amp;nbsp; This is where we can go through and create a custom
process template.
&lt;/p&gt;
&lt;p&gt;
The first thing you will want to do is create a new build process template to start
your customizations.&amp;nbsp; I have included mine for download at the end of this blog
post but you may want to walk along.&amp;nbsp; I usually start by creating a copy of the
default build process template available from TFS.&amp;nbsp; If you aren’t familiar with
the basics of this particular process, I would highly suggest going through the walkthrough
in either of these books:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chapter 16 – “Customizing the Build Process”&lt;/strong&gt; -&amp;nbsp; from &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fbit.ly%2fTFS2010Book" target="_blank"&gt;Professional
Team Foundation Server 2010&lt;/a&gt; by Wrox (Wiley) – Authors:&amp;nbsp; &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.edsquared.com" target="_blank"&gt;Ed
Blankenship&lt;/a&gt;, &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwoodwardweb.com%2f" target="_blank"&gt;Martin
Woodward&lt;/a&gt;, &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fblogs.msdn.com%2fb%2fgranth%2f" target="_blank"&gt;Grant
Holliday&lt;/a&gt;, and &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fblogs.msdn.com%2fb%2fbriankel%2f" target="_blank"&gt;Brian
Keller&lt;/a&gt; 
&lt;li&gt;
&lt;strong&gt;Chapter 16 – “Process Template Customization”&lt;/strong&gt; – from &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fbit.ly%2fMSBuild2ndEdition" target="_blank"&gt;Inside
the Microsoft Build Engine: Using MSBuild and Team Foundation Build - Second Edition&lt;/a&gt; by
Microsoft Press – Authors:&amp;nbsp; &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fsedodream.com%2f" target="_blank"&gt;Sayed
Hashimi&lt;/a&gt; and &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fblogs.msdn.com%2fb%2fwillbar%2f" target="_blank"&gt;William
Bartholomew&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
You can then change your build definition over to the newly copied build process template
using the following combo box.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_14.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="Selecting a New TFS Build Process Template" border="0" alt="Selecting a New TFS Build Process Template" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_6.png" width="765" height="226"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
If you click on the hyperlink, it will take you to the location in Source Control
Explorer where you can get the latest version into your workspace and then open the
build process template file for editing in the Windows Workflow Foundation Designer.
&lt;/p&gt;
&lt;h2&gt;Defining Build Definition Process Parameters
&lt;/h2&gt;
&lt;p&gt;
The first thing we can do is specify a new build process parameter that is exposed
to the end user of the builds by going to the “Arguments” tab in the lower left-hand
corner of the Workflow designer.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_16.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="Arguments Tab for Windows Workflow Designer" border="0" alt="Arguments Tab for Windows Workflow Designer" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_7.png" width="301" height="157"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
I am going to create a Boolean process parameter simply named “&lt;font face="Consolas"&gt;RunSmartAssembly&lt;/font&gt;”
and set the default value to &lt;font face="Consolas"&gt;False&lt;/font&gt;.&amp;nbsp; This isn’t
an MSBuild property but a workflow process parameter that will be exposed to the end
user when they are queuing a new build or when editing the build definition.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_18.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="Creating New TFS Build Process Parameter" border="0" alt="Creating New TFS Build Process Parameter" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_8.png" width="968" height="152"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
This next step is just to make things that much nicer.&amp;nbsp; We can give the TFS Build
system some additional metadata to make sure the parameter is exposed to the end user
in a nice fashion.&amp;nbsp; There are more details about the process parameter metadata
field in either of the book chapters mentioned above in case you would like to learn
more!&amp;nbsp; You edit the collection information for the &lt;font face="Consolas"&gt;Metadata&lt;/font&gt; parameter
that is already defined in the default build process template.&amp;nbsp; (It’s two above
the parameter we created in the previous screenshot.)&amp;nbsp; Just click the ellipsis
button in the default value field column to open up the metadata editor window.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fSNAGHTML7d90160.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="TFS Build Process Parameter Metadata Editor" border="0" alt="TFS Build Process Parameter Metadata Editor" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/SNAGHTML7d90160_thumb.png" width="386" height="455"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Fill out the details as indicated above and save your build process template. You
won’t see the changes immediately if you were to go back to the build definition editor
because we haven’t checked-in the build process template back to the version control
repository yet.
&lt;/p&gt;
&lt;h2&gt;Verify SmartAssembly is Installed on Build Server
&lt;/h2&gt;
&lt;p&gt;
Whenever I architect a build that requires the use of a custom tool and it isn’t stored
in version control (or even if it is but someone forgot to add that workspace mapping)
I usually want to add a check in the build process to make sure that the tools are
actually available to the build server.&amp;nbsp; If the check doesn’t locate the tool
I have it give a nice build error.
&lt;/p&gt;
&lt;p&gt;
Add an &lt;font face="Consolas"&gt;If&lt;/font&gt; workflow activity inside the &lt;font face="Consolas"&gt;Build
Agent Scope&lt;/font&gt; activity (labeled “Run on Agent”) but before the section that starts
the compilation.&amp;nbsp; It doesn’t exactly matter where as long as you get them in
the agent scope but before any type of compilation begins.&amp;nbsp; I am going to set
my condition to something like the following:
&lt;/p&gt;
&lt;pre class="brush: vb; auto-links: false;"&gt;RunSmartAssembly AndAlso Not System.IO.File.Exists(String.Format("{0}\{1}\{2}", Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "Red Gate\SmartAssembly 6", "SmartAssembly.exe"))
&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
You can then add a &lt;font face="Consolas"&gt;Write Build Error&lt;/font&gt; activity with an
appropriate message to indicate that SmartAssembly was not found.&amp;nbsp; It should
look something along the lines of this following example.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_20.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="Verifying SmartAssembly is Installed on TFS Build Server" border="0" alt="Verifying SmartAssembly is Installed on TFS Build Server" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_9.png" width="508" height="677"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h2&gt;Appending Additional MSBuild Properties
&lt;/h2&gt;
&lt;p&gt;
We can now work on passing in the additional MSBuild properties.&amp;nbsp; I’m going to
do this in two steps.&amp;nbsp; The first step is to append the &lt;font face="Consolas"&gt;TfsBuild&lt;/font&gt; MSBuild
property to the pre-defined workflow variable that is used for this purpose named &lt;font face="Consolas"&gt;MSBuildArguments&lt;/font&gt;.&amp;nbsp;
I’m going to do this immediately after the workflow activities we added for the previous
step using another native primitive workflow activity:&amp;nbsp; &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fdd647739.aspx" target="_blank"&gt;Assign&lt;/a&gt;.&amp;nbsp;
It’s a super simple activity that is great for this particular purpose.&amp;nbsp; The
assignment expression that I am going to use for the &lt;font face="Consolas"&gt;Value&lt;/font&gt; parameter
is:
&lt;/p&gt;
&lt;pre class="brush: vb; auto-links: false;"&gt;String.Format("{0} {1}", MSBuildArguments, " /p:TfsBuild=True")
&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_22.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 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://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_2.png" width="293" height="176"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
After that, we will add another &lt;font face="Consolas"&gt;If&lt;/font&gt; activity where the
conditional will be set to the &lt;font face="Consolas"&gt;RunSmartAssembly&lt;/font&gt; workflow
parameter we created earlier.&amp;nbsp; We will also add add another &lt;font face="Consolas"&gt;Assign&lt;/font&gt; activity
and append our remaining MSBuild property to pass into the compilation process.&amp;nbsp;
You can use this assignment expression for the Value parameter of the &lt;font face="Consolas"&gt;Assign&lt;/font&gt; activity:
&lt;/p&gt;
&lt;pre class="brush: vb; auto-links: false;"&gt;String.Format("{0} {1}", MSBuildArguments, " /p:RunSmartAssembly=True")
&lt;/pre&gt;
&lt;p&gt;
The final sequence looks similar to the following screenshot.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_24.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 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://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_3.png" width="482" height="662"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
You may be asking “Why did we define the &lt;font face="Consolas"&gt;$(TfsBuild)&lt;/font&gt; MSBuild
property when we could have just used the &lt;font face="Consolas"&gt;$(RunSmartAssembly)&lt;/font&gt; property?”
That’s a great question… You don’t need it if you aren’t going to do any additional
customization. However, in general, I like to always define the &lt;font face="Consolas"&gt;$(TfsBuild)&lt;/font&gt; MSBuild
property so that you could customize the project files to modify the conditions based
on whether it is occurring during a TFS Build or if it’s occurring on a developer’s
machine. It’s quite handy when you need it.
&lt;/p&gt;
&lt;p&gt;
Notice that we are also performing all of the SmartAssembly processing steps before
the &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fbit.ly%2fSymbolServerTFS" target="_blank"&gt;Source
Server Indexing and Symbol Server Publishing&lt;/a&gt; phase of the build process so that
both the original symbols and the symbols that match the instrumented assemblies are
published correctly to Symbol Server and have the appropriate indexing for Source
Server support included in those symbols.&amp;nbsp; That will be extremely useful later
whenever you need to debug against either the original or instrumented assemblies
in the future.&amp;nbsp; You can also open &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fdd264915.aspx" target="_blank"&gt;IntelliTrace&lt;/a&gt; log
files &amp;amp; take advantage of &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fdd264992.aspx" target="_blank"&gt;Test
Impact Analysis&lt;/a&gt; if you keep obfuscation turned off in the SmartAssembly configuration.
&lt;/p&gt;
&lt;h1&gt;Finale
&lt;/h1&gt;
&lt;p&gt;
That’s it!&amp;nbsp; Just save the changes to your build process template and check the
file into the version control repository so it can now be used by your build definitions.&amp;nbsp;
Be sure to set your new custom workflow parameter to &lt;font face="Consolas"&gt;True&lt;/font&gt; and
then queue a new build!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fdbb6c39a79dc_68DE%2fimage_26.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="Setting Custom SmartAssembly Process Parameter" border="0" alt="Setting Custom SmartAssembly Process Parameter" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/image_thumb_10.png" width="372" height="287"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
You’ll now notice that it runs correctly even if you have defined for your build process
to compile multiple build configurations (i.e. Debug | x86, Release | AnyCPU, etc.)
&lt;/p&gt;
&lt;h1&gt;Potential Improvement Areas
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Licensing &amp;amp; Activation for Build Servers&lt;/strong&gt; – Unfortunately, the
way SmartAssembly is licensed you have to purchase a license for each of the build
servers you might have and activate the software on those build servers.&amp;nbsp; The
accompanying side effect is that the developer licenses are cheaper.&lt;br&gt;
This can be problematic in a TFS environment where you might have a build farm that
has one build controller with 20 build servers that have three agents on each of those
build servers.&amp;nbsp; It’s not that SmartAssembly would be used at the same time on
all 60 of those build agents but you also don’t know which build agent will be reserved
for a particular build at any given time.&amp;nbsp; I have resorted to using the build
agent tagging feature of TFS Build to handle making sure particular builds only reserve
an agent with SmartAssembly configured &amp;amp; activated.&amp;nbsp; However, this causes
a complete underuse of the hardware resources available in a build farm.&amp;nbsp; 
&lt;br&gt;
I would rather tool vendors achieve their revenue targets by increasing the per-user
license fee because and specifically for users who benefit from the advantages that
the particular tool brings to them. This licensing model if very similar to how the
Visual Studio &amp;amp; third-party components licensing model works.&amp;nbsp; Microsoft
and other third-party component vendors give you the ability to install and use the
their tools on a build server without charge.&lt;br&gt;
I consider build agent machines throw-away machines.&amp;nbsp; They should remain completely
clean but don’t need to be backed up or monitored.&amp;nbsp; I usually will have a virtual
machine base image that has everything already installed &amp;amp; ready to go so that
I can add/remove to the build farm “pool” as needed.&amp;nbsp; I even prefer to throw
away machines after 30 days and bring new build agents online to ensure the whole
build farm is kept as clean as possible.&amp;nbsp; When you have tools that require activation
&amp;amp; licensing, this scenario quickly becomes problematic.&amp;nbsp; This leads me to
another potential area for improvement. 
&lt;li&gt;
&lt;strong&gt;Installation on Build Servers&lt;/strong&gt; – If you know me well, this is a slightly
less critical criticism than the first bullet point but also a pretty big pet peeve
of mine. &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://www.edsquared.com/content/binary/Windows-Live-Writer/dbb6c39a79dc_68DE/wlEmoticon-smile_2.png"&gt;&amp;nbsp;
If you make tools, please don’t require them to be installed on the build server.
It’s another thing that has to be kept up to date on potentially many machines and
in a base system image.&amp;nbsp; I would rather be able to check them into a known version
control folder and then have the build servers download the latest version during
the build process.&amp;nbsp; There is even a supported mechanism in &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fee330987.aspx%23controller_properties" target="_blank"&gt;TFS
Build that allows the build controllers &amp;amp; agents to watch for custom assemblies
&amp;amp; tools&lt;/a&gt; and whenever it notices a new version of those assemblies then it
gracefully updates all of the machines in the build farm automatically.&amp;nbsp; This
allows team members to focus &amp;amp; introduce changes to the tools using version control
instead of having to update the base image of the build server every time there is
a new update.&lt;br&gt;
You also benefit from having full auditing of what exact tools version were used to
produce a specific set of assemblies.&amp;nbsp; That allows you to potentially recreate
a build you created a year ago by simply specifying what version of the source code
(including build tools) to use during that build process. 
&lt;li&gt;
&lt;strong&gt;Native Workflow Activity for TFS 2010 Build Process Templates&lt;/strong&gt; -&amp;nbsp;
The process I described in this blog article is definitely much more difficult than
what it could be.&amp;nbsp; Instead of introducing customizations in the MSBuild-portion
of the TFS build process, I much rather prefer dropping in a native workflow activity
after the compilation process.&amp;nbsp; SmartAssembly unfortunately doesn’t have a custom
TFS build workflow activity at this time.&amp;nbsp; I would love to see one that allowed
me to specify multiple assembly inputs for each build configuration that occurs in
the build process and then the appropriate SmartAssembly configuration file for each
of the assemblies.&amp;nbsp; You can do some nice things with it to really make this process
super easy. 
&lt;li&gt;
&lt;strong&gt;Database Endpoint Instead of a Web Service Layer&lt;/strong&gt; – SmartAssembly
requires the entire team to have access to the centralized database to manage the
automated error &amp;amp; feature usage reports.&amp;nbsp; The software makes direct database
calls instead of going through a service layer is which is very different from the
way that tools built for TFS are designed in general.&amp;nbsp; This can be problematic
especially if you have TFS setup for your team to be able to access remotely over
HTTPS (port 443) without the use of a VPN.&amp;nbsp; Several IT organizations,really don’t
want to open their database ports or even give access to production database instances.&amp;nbsp;
My suggestion would be to have an intermediate service layer that can “integrate”
with the existing TFS IIS web sites.&amp;nbsp; This allows the tool’s service layer to
piggy back on the existing infrastructure already setup for TFS.&amp;nbsp; If you have
an SSL certificate and HTTPS configured, then you can take advantage of it.&amp;nbsp;
If you have load balancing setup for scalability, then you could potentially leverage
that as well!&amp;nbsp; We did this with our &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fwww.imaginet.com%2fSolutions%2fALM%2fPages%2fNotion-Timesheet.aspx" target="_blank"&gt;Notion
Timesheet for TFS&lt;/a&gt; tools and one of the benefits we end up getting is that we are
able to access the service layer from anywhere we can access TFS including over the
Public Internet.&amp;nbsp; No worries about giving people access to the SQL Server instance
as well. 
&lt;li&gt;
&lt;strong&gt;Source Server Support&lt;/strong&gt; – This isn’t necessarily a TFS-specific topic
but really something for anyone using build servers &amp;amp; &lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=http%3a%2f%2fbit.ly%2fSymbolServerTFS" target="_blank"&gt;Source
Server indexing&lt;/a&gt;.&amp;nbsp; When you compile on a build server, the location of the
source code is included in the symbol information.&amp;nbsp; Your developers will normally
not download the source code to the same location as other developers and particularly
not the same location that the build server does since that changes depending on what
TFS build agent is used on a build server for any particular TFS build.&amp;nbsp; Source
Server Indexing helps to combat this particular problem by replacing the physical
location with the location in the version control repository including the branch
and version of the code used.&amp;nbsp; SmartAssembly has a feature that allows you to
review details of stack trace, object values, etc. when you open an error report.&amp;nbsp;
However, it doesn’t use the Source Server information even if it is stored in the
symbol files.&amp;nbsp; This is particularly a problem when you are in a TFS environment
and using automated builds.&amp;nbsp; SmartAssembly just ignores those additional streams
in the symbols file.&amp;nbsp; SmartAssembly should use the Source Server information
if it exists in the symbols to pull the appropriate version of source code from the
version control repository.&amp;nbsp; &lt;em&gt;(Red Gate Support Ticket Number:&amp;nbsp; F0041570)&lt;/em&gt; 
&lt;li&gt;
&lt;strong&gt;Additional ALM Integration with TFS&lt;/strong&gt; – There are so many different
areas where SmartAssembly could shine if it had some additional ALM-specific integration
with TFS!&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Download Process Template
&lt;/h1&gt;
&lt;p&gt;
If you are interested in downloading the completely customized version of the build
process template, I have included a link to it below.
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d&amp;amp;url=https%3a%2f%2fskydrive.live.com%2fredir.aspx%3fcid%3d077db794c0a4dfe0%26resid%3d77DB794C0A4DFE0!880%26parid%3d77DB794C0A4DFE0!156%26authkey%3d!AArB8779ENRg5J4" target="_blank"&gt;Download
SmartAssembly Process Template&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Take care,
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Ed Blankenship&lt;/strong&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edsquared.com/aggbug.ashx?id=2e6737b3-6862-44cb-8581-9110da46b74d" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Brought to you by Ed Blankenship and Ed Kisinger at EdSquared.com</description>
      <comments>http://www.edsquared.com/CommentView,guid,2e6737b3-6862-44cb-8581-9110da46b74d.aspx</comments>
      <category>IntelliTrace</category>
      <category>Red Gate</category>
      <category>TFS</category>
      <category>Tools</category>
      <category>VSTS Building &amp; Releasing</category>
    </item>
    <item>
      <trackback:ping>http://www.edsquared.com/Trackback.aspx?guid=a4216b56-4831-4c3f-b85f-f12bd89b4c1f</trackback:ping>
      <pingback:server>http://www.edsquared.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.edsquared.com/PermaLink,guid,a4216b56-4831-4c3f-b85f-f12bd89b4c1f.aspx</pingback:target>
      <dc:creator>Ed Blankenship (EdSquared.com)</dc:creator>
      <georss:point>32.85 96.85</georss:point>
      <wfw:comment>http://www.edsquared.com/CommentView,guid,a4216b56-4831-4c3f-b85f-f12bd89b4c1f.aspx</wfw:comment>
      <wfw:commentRss>http://www.edsquared.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a4216b56-4831-4c3f-b85f-f12bd89b4c1f</wfw:commentRss>
      <slash:comments>11</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
As <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fblogs.msdn.com%2fb%2fjimlamb%2farchive%2f2009%2f06%2f15%2fsymbol-and-source-server-in-tfs-2010.aspx" target="_blank">Jim
Lamb announced in June 2009</a>, TFS 2010 introduces support for <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fms680641(v%3dvs.85).aspx" target="_blank">Source
Server</a> and <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fms680693(v%3dvs.85).aspx" target="_blank">Symbol
Server</a> as part of the default automated build process template. This is a really
key feature addition but I have found that many developers ask about why it would
be so important and why it would help them. Ultimately, we are starting to have more
and more tools that need access to the symbol file information and the original source
code that was used for compilation. For example, some of the tools that come to mind
are:
</p>
        <ul>
          <li>
            <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fsc65sadd.aspx" target="_blank">Visual
Studio Debugging</a> including the <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fbt727f1t.aspx" target="_blank">Remote
Debugger</a></li>
          <li>
            <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fdd264915.aspx" target="_blank">IntelliTrace</a>
          </li>
          <li>
            <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fz9z62c29.aspx" target="_blank">Visual
Studio Profiler</a>
          </li>
          <li>
            <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.microsoft.com%2fwhdc%2fdevtools%2fdebugging%2fdefault.mspx" target="_blank">WinDBG</a>
          </li>
        </ul>
        <p>
By setting up Source Server and Symbol Server support during your build process, you’ll
be able to work with assemblies &amp; executables that come from the build servers
and still use tools that need information from them.
</p>
        <h1>What are Symbols?
</h1>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_2.png">
            <img style="background-image: none; border-right-width: 0px; margin: 5px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb.png" width="271" height="261" />
          </a>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.wintellect.com%2fCS%2fblogs%2fjrobbins" target="_blank">John
Robbins</a> has an excellent blog post to get started about learning what symbols
are titled: “<a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.wintellect.com%2fCS%2fblogs%2fjrobbins%2farchive%2f2009%2f05%2f11%2fpdb-files-what-every-developer-must-know.aspx" target="_blank">PDB
Files: What Every Developer Must Know</a>.” I highly recommend you take a moment to
read through it.
</p>
        <p>
So to summarize from John’s article, the symbol files are the .PDB files that match
a particular assembly and contain important information that’s necessary for debugging
tools. Specifically for .NET assemblies, the symbol files include:
</p>
        <ul>
          <li>
Source File Names and Line Numbers 
</li>
          <li>
Local Variable Names</li>
        </ul>
        <p>
He also reminds us one very important statement about symbol files: “<strong><u><font color="#ff0000" size="3">PDB
files are as important as source code!</font></u></strong>” That is absolutely true!
I cringe any time I hear from a developer that says “oh, those .PDB files take up
so much space so I’m going to delete them.” Ouch – The sad thing is those are developers
that keep people like John in business whenever they run into problems in production. <img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/wlEmoticon-smile_2.png" /> Save
yourself some time, money, and effort and keep your symbol files around. Not to say
that John doesn’t earn every penny but I’m sure his life is much better whenever you
do have your symbols!
</p>
        <p>
This is exactly where Symbol Server helps out. Essentially, the Symbol Server is a
central location for your company that keeps the .PDB files for you. Therefore, you
can install your application (without symbols) that was compiled from a build server
and whenever you want to use a debugging tool like Visual Studio, it will know how
to contact the Symbol Server location to get the matching set of symbols. More about
how to configure Visual Studio to look for a Symbol Server further down in this blog
post.
</p>
        <p>
John also mentions how to manually perform the steps necessary for completing the
loop with Source Server and Symbol Server. Thankfully, since you are using TFS 2010
Build, <strong><em>you don’t have to go through those steps</em></strong>. The functionality
is included in the default build build process template (but not the Upgrade Template).
</p>
        <hr />
        <p>
          <strong>Aside</strong>: If you are performing obfuscation using your favorite .NET
obfuscation utility, <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.red-gate.com%2fsupportcenter%2fContent%3fp%3dSmartAssembly%26c%3dSmartAssembly%2fhelp%2f5.5%2fSA_GeneratingDebugInfo.htm%26toc%3dSmartAssembly%2fhelp%2f5.5%2ftoc1210451.htm" target="_blank">you
will want to make sure you produce symbol files that match the newly created assemblies</a>.
This is because the variable names and other information change by the obfuscator.
What I will normally do will do is keep both the original assemblies with their matching
symbol files in addition to the obfuscated assemblies with match symbol files. I store
the artifacts for the obfuscated assemblies in a sub-folder called “Obfuscated.”
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_4.png">
            <img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_1.png" width="636" height="198" />
          </a>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_6.png">
            <img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_2.png" width="665" height="190" />
          </a>
        </p>
        <p>
          <hr />
        </p>
        <h1>How to Setup Symbol Server
</h1>
        <p>
A common misconception about Symbol Server is that you actually have to set up a server
and install the Symbol Server software. Not at all! All you have to do is setup a
file share on another server. If you are using my suggestion about <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2f2011%2f01%2f03%2fUsing%2bFriendly%2bDNS%2bNames%2bIn%2bYour%2bTFS%2bEnvironment.aspx" target="_blank">using
friendly DNS names with TFS</a>, you might extend that for the symbol server as well:
</p>
        <blockquote>
          <p>
            <a href="$Symbols">
              <strong>
                <font size="4" face="Consolas">\\symbols.contoso.local\Symbols</font>
              </strong>
            </a>
          </p>
        </blockquote>
        <p>
On my particular demonstration machine, I have a local file share that contains some
of the symbols that were published from my TFS 2010 Builds:
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_8.png">
            <img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_3.png" width="761" height="211" />
          </a>
        </p>
        <h1>How to Configure Build to Index for Source Server and Publish to Symbol Server
</h1>
        <p>
Configuring the build definition to use the new Symbol Server location, couldn’t be
easier. Open up the build definition editor and navigate to the Process tab. There,
you will see all of the process parameters. If you are using the default build process
template then you will find the Source Server and Symbol Server settings underneath
the “2. Basic” category as shown below.
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_10.png">
            <img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_4.png" width="656" height="276" />
          </a>
        </p>
        <p>
The build process will then do all the work for you!
</p>
        <h1>Source Server Indexing
</h1>
        <p>
What actually happens when the build process is actually running it’s Source Server
indexing? Let me first start by discussing the problems with symbols that come from
a build server (or another machine.) One of the pieces of information that is stored
inside of the symbol file is the location of the original source file that was used
for compilation into the assembly you are debugging. This can be a problem because
for my particular case, the local location of the source code file on the build server
is:
</p>
        <blockquote>
          <p>
            <font face="Consolas">C:\LocalBuilds\1\2\Sources\Source\Calculator\Calculator\Form1.cs</font> at
version 32 from the MAIN branch
</p>
        </blockquote>
        <p>
Not only do you to have put all of the source files in the same exact spot but you
would have to get it from the right branch and even the exact same changeset version
from the TFS version control repository. That’s a lot of manual work… This is where
the indexing for Source Server helps you out. You’ll also notice that if you are producing
symbols from your obfuscation utility, those can indexed for Source Server support
as well.
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_12.png">
            <img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_5.png" width="1262" height="282" />
          </a>
        </p>
        <p>
When the TFS 2010 Build runs the source indexing for Source Server, it writes an alternate
stream of information in the symbol files that will provide the following information
for each source file:
</p>
        <ul>
          <li>
Source Control provider’s information and the command-line utility to use to get the
file (In our case that would be using <font face="Consolas">tf.exe</font>) 
</li>
          <li>
Full TFS Version Control Repository Server Path including the branch name 
</li>
          <li>
Version 
</li>
        </ul>
        <p>
The default build process template uses the <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fff558877(v%3dVS.85).aspx" target="_blank">srctool.exe</a> command-line
utility first to list all of the local source file locations that are stored in the
symbol file. Then, it generates a temporary file that contains the exact alternate
stream information for Source Server. The Source Server stream is named <font face="Consolas">srcsrv</font>.
Finally, the build process uses the <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fff558874(v%3dVS.85).aspx" target="_blank">pdbstr.exe</a> command-utility
to add that stream information to write the relevant information. If you are ever
curious about what that <font face="Consolas">srcsrv</font> stream actually contains,
you can run this command-line utility:
</p>
        <blockquote>
          <font face="Consolas">C:\Builds\Calculator MAIN\Calculator MAIN_11.02.11.06\Debug\Obfuscated&gt;<font style="background-color: #ffff00">pdbstr.exe
–<strong>r</strong></font></font>
          <font face="Consolas">-p:Calculator.pdb <font style="background-color: #ffff00">-s:srcsrv</font></font>
          <br />
          <font face="Consolas">SRCSRV: ini ------------------------------------------------</font>
          <br />
          <font face="Consolas">VERSION=3</font>
          <br />
          <font face="Consolas">INDEXVERSION=2</font>
          <br />
          <font face="Consolas">VERCTRL=Team Foundation Server</font>
          <br />
          <font face="Consolas">DATETIME=Fri Feb 11 00:41:58 2011</font>
          <br />
          <font face="Consolas">INDEXER=TFSTB</font>
          <br />
          <font face="Consolas">SRCSRV: variables ------------------------------------------</font>
          <br />
          <font face="Consolas">TFS_EXTRACT_CMD=tf.exe view /version:%var4% /noprompt "$%var3%"
/server:%fnvar%(</font>
          <font face="Consolas">%var2%) /console &gt;%srcsrvtrg%</font>
          <br />
          <font face="Consolas">TFS_EXTRACT_TARGET=%targ%\%var2%%fnbksl%(%var3%)\%fnfile%(%var5%)</font>
          <br />
          <font face="Consolas">SRCSRVVERCTRL=tfs</font>
          <br />
          <font face="Consolas">SRCSRVERRDESC=access</font>
          <br />
          <font face="Consolas">SRCSRVERRVAR=var2</font>
          <br />
          <font style="background-color: #ffff00" face="Consolas">VSTFSSERVER=http://localhost:8080/tfs/DefaultCollection</font>
          <br />
          <font face="Consolas">SRCSRVTRG=%TFS_extract_target%</font>
          <br />
          <font face="Consolas">SRCSRVCMD=%TFS_extract_cmd%</font>
          <br />
          <font face="Consolas">SRCSRV: source files ---------------------------------------</font>
          <br />
          <font face="Consolas">C:\LocalBuilds\1\2\Sources\Source\Calculator\Calculator\Form1.cs*VSTFSSERVER*/Ca</font>
          <font face="Consolas">lculator/MAIN/Source/Calculator/Calculator/Form1.cs*32*Form1;C32.cs</font>
          <br />
          <font face="Consolas">C:\LocalBuilds\1\2\Sources\Source\Calculator\Calculator\Form1.Designer.cs*VSTFSS</font>
          <font face="Consolas">ERVER*/Calculator/MAIN/Source/Calculator/Calculator/Form1.Designer.cs*30*Form1.Designer;C30.cs</font>
          <br />
          <font face="Consolas">C:\LocalBuilds\1\2\Sources\Source\Calculator\Calculator\Program.cs*VSTFSSERVER*/</font>
          <font face="Consolas">Calculator/MAIN/Source/Calculator/Calculator/Program.cs*30*Program;C30.cs</font>
          <br />
          <font face="Consolas">C:\LocalBuilds\1\2\Sources\Source\Calculator\Calculator\Properties\Settings.Designer.cs*VSTFSSERVER*/Calculator/MAIN/Source/Calculator/Calculator/Properties/Settings.Designer.cs*11*Settings.Designer;C11.cs</font>
          <br />
          <font face="Consolas">SRCSRV: end ------------------------------------------------</font>
        </blockquote>
        <h1>Publishing to Symbol Server
</h1>
        <p>
Publishing the symbols is the easier part of it. Essentially, the default build process
template calls the <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fms681417(v%3dvs.85).aspx" target="_blank">symstore.exe</a> add
utility to publish the symbol files to the specified symbol server path. Additionally,
there is some metadata added for the build information in TFS that will specify that
symbols were published. This will be useful whenever the build retention policies
kick in which we’ll cover further down.
</p>
        <h1>Configuring Visual Studio to Use Symbol Server and Enabling Source Server Support
</h1>
        <p>
The next step is for each of the developers to configure <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.microsoft.com%2fvisualstudio%2f" target="_blank">Visual
Studio 2010</a> to look for symbols if they aren’t found in the symbol server location
for the company. You can get to it by going to <font face="Consolas">Tools –&gt; Options</font> and
then the <font face="Consolas">Debugging –&gt; Symbols</font> options pages as shown
below. Other debugging tools have similar options.
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fSNAGHTML23f64f5.png">
            <img style="background-image: none; border-right-width: 0px; margin: 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML23f64f5" border="0" alt="SNAGHTML23f64f5" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/SNAGHTML23f64f5_thumb.png" width="761" height="444" />
          </a>
        </p>
        <p>
The next thing you will want to do is to enable source server support in Visual Studio.
You can do that by going to the Debugging –&gt; General options tab as shown below.
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fSNAGHTML243d0c1.png">
            <img style="background-image: none; border-right-width: 0px; margin: 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML243d0c1" border="0" alt="SNAGHTML243d0c1" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/SNAGHTML243d0c1_thumb.png" width="761" height="444" />
          </a>
        </p>
        <p>
Now, just start using your debugging tool and in my case I have attached my Visual
Studio Debugger to the process of my application that came from the build drop folder.
Visual Studio gives me a small warning before it attempts to grab the source code
from the TFS Version Control repository as shown below. You can see the exact command-line
utility including arguments that is used by the debugger to retrieve the correct version
of the file. Pure magic…
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fSNAGHTML226bcf3.png">
            <img style="background-image: none; border-right-width: 0px; margin: 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML226bcf3" border="0" alt="SNAGHTML226bcf3" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/SNAGHTML226bcf3_thumb.png" width="459" height="320" />
          </a>
        </p>
        <p>
          <strong>
            <font color="#ff0000">Update</font>
          </strong>:  (2/14/2011) John Robbins
has helped out by letting us know <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.wintellect.com%2fCS%2fblogs%2fjrobbins%2farchive%2f2011%2f02%2f12%2fdisabling-the-visual-studio-source-server-security-warning-dialog.aspx" target="_blank">how
we can disable this really annoying Source Server security dialog</a> any time the
debugger wants to get something from Source Server.  Thanks John!
</p>
        <hr />
        <p>
          <strong>Aside</strong>: If you notice, in my situation I have a particular problem.
Since the TFS 2010 Build services are installed on the same machine as my application
tier on my laptop, the default configuration for the build service to connect to TFS
used <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2flocalhost"><font face="Consolas">http://localhost</font></a>. <img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-sadsmile" alt="Sad smile" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/wlEmoticon-sadsmile_2.png" /> That’s
not going to be good whenever I have another developer start debugging using the assembly
from my build server and the symbols. Their Visual Studio Debugger instance will try
to hit <font face="Consolas">localhost</font> on their machine (where the source doesn’t
exist).
</p>
        <p>
For this reason, it’s important to make sure when you are configuring the build service
to use the <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2f2011%2f01%2f03%2fUsing%2bFriendly%2bDNS%2bNames%2bIn%2bYour%2bTFS%2bEnvironment.aspx" target="_blank">fully-qualified
friendly DNS name for your application tier server</a>. (Check out the <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2f2011%2f01%2f03%2fUsing%2bFriendly%2bDNS%2bNames%2bIn%2bYour%2bTFS%2bEnvironment.aspx" target="_blank">blog
post</a> that’s linked to find out more information about this topic).
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_14.png">
            <img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_6.png" width="546" height="208" />
          </a>
        </p>
        <hr />
        <h2>How Does Visual Studio Know Which Symbols Match for the Executable?
</h2>
        <p>
You have to always have symbol files that exactly match the assemblies you are debugging.
How does Visual Studio know this though? There is actually a GUID that is embedded
to both the assembly and the symbol file. You can find out what that GUID is by running
the <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fc1h23y6c(loband).aspx" target="_blank"><font face="Consolas">DUMPBIN</font></a> command-line
utility as shown below.
</p>
        <blockquote>
          <p>
            <font face="Consolas">C:\Builds\Calculator MAIN\Calculator MAIN_11.02.11.06\Debug&gt;<font style="background-color: #ffff00">dumpbin
Calculator.exe /HEADERS</font></font>
          </p>
          <p>
            <font face="Consolas">Microsoft (R) COFF/PE Dumper Version 10.00.31118.01<br />
Copyright (C) Microsoft Corporation. All rights reserved.</font>
          </p>
          <p>
            <br />
            <font face="Consolas">Dump of file Calculator.exe</font>
          </p>
          <p>
            <font face="Consolas">
              <em>
                <snipped brevity="brevity" for="for">
                </snipped>
              </em>
            </font>
          </p>
          <p>
            <font face="Consolas">Debug Directories</font>
          </p>
          <p>
            <font face="Consolas">Time Type Size RVA Pointer<br />
-------- ------ -------- -------- --------<br />
4D54CC09 cv 69 00003864 1A64 Format: RSDS, {<font style="background-color: #ffff00">B7C62014-02BD-4F35-9718-104CE8CFB14C</font>}, <font style="background-color: #00ff00">1</font>,
c:\LocalBuilds\1\2\Sources\Source\Calculator\Calculator\obj\Debug\Calculator.pdb</font>
          </p>
          <p>
            <font face="Consolas">
              <em>
                <snipped brevity="brevity" for="for">
                </snipped>
              </em>
            </font>
          </p>
        </blockquote>
        <p>
You can see the GUID highlighted above. If you were to go check out the Symbol Server
file share, you can also find the GUID used to differentiate between all of the different
versions of the symbol files that are stored for a particular assembly. 
</p>
        <p>
          <strong>
            <font color="#ff0000">Update</font>
          </strong>:  (2/15/2011) I learned
something new from <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fblogs.msdn.com%2fb%2fchrissc%2f" target="_blank">Chris
Schmich</a> from the Visual Studio Diagnostics team.  He indicated that the PDB
age (which is <font style="background-color: #00ff00">highlighted</font> above in
green) is also used to match the symbols.  You’ll notice that the PDB age for
all of my symbols is 1 and is appended to the end of the GUID when stored in Symbol
Server.  Thanks Chris for the extra information!
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_16.png">
            <img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_7.png" width="627" height="364" />
          </a>
        </p>
        <h1>IntelliTrace Files and Symbol Server
</h1>
        <p>
I also wanted to mention that when testers use Microsoft Test Manager and run manual
test cases where they have collected IntelliTrace logs, you’ll notice that when you
open one of those IntelliTrace logs (for example attached to a bug work item) you
will see the Symbol Server location that was collected from the assembly being tested
as well:
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_18.png">
            <img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_8.png" width="874" height="462" />
          </a>
        </p>
        <p>
This green-light should be awesome for you as a developer now because you can connect
to the Symbol Server location and start debugging using the IntelliTrace log and the
Source Server information contained inside of the symbols.
</p>
        <h1>Retention Policies
</h1>
        <p>
One other thing to consider: as you have more and more builds performed using TFS
2010 Build, you’ll want to set up your retention policies. The Symbol Server file
share can start to go up in size pretty quickly so you can have the retention policies
also delete the corresponding symbols from Symbol Server if you choose by setting
the “What to Delete” option.
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_20.png">
            <img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_9.png" width="748" height="332" />
          </a>
        </p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fSNAGHTML25e109f.png">
            <img style="background-image: none; border-right-width: 0px; margin: 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML25e109f" border="0" alt="SNAGHTML25e109f" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/SNAGHTML25e109f_thumb.png" width="634" height="425" />
          </a>
        </p>
        <p>
You want to also make sure, however, that any “Released” <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fgg475877.aspx%23retainindefinitely" target="_blank">builds
should be marked as “Retain Indefinitely”</a> to ensure that the retention policies
never delete the symbols (or anything else about the build for that matter!)
</p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_22.png">
            <img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_10.png" width="881" height="386" />
          </a>
        </p>
        <h3>
        </h3>
        <h2>Summary
</h2>
        <p>
There you go! Your developers will be very appreciative whenever all of this is setup.
You’ll have a system that stores your symbols for whenever you need them and those
symbols will have information to let the debugging utilities know where to grab the
original source code from the TFS version control repository.
</p>
        <p>
          <strong>Ed Blankenship</strong>
        </p>
        <img width="0" height="0" src="http://www.edsquared.com/aggbug.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f" />
        <br />
        <hr />
Brought to you by Ed Blankenship and Ed Kisinger at EdSquared.com</body>
      <title>Source Server and Symbol Server Support in TFS 2010</title>
      <guid isPermaLink="false">http://www.edsquared.com/PermaLink,guid,a4216b56-4831-4c3f-b85f-f12bd89b4c1f.aspx</guid>
      <link>http://www.edsquared.com/2011/02/12/Source+Server+And+Symbol+Server+Support+In+TFS+2010.aspx</link>
      <pubDate>Sat, 12 Feb 2011 00:40:56 GMT</pubDate>
      <description>&lt;p&gt;
As &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fblogs.msdn.com%2fb%2fjimlamb%2farchive%2f2009%2f06%2f15%2fsymbol-and-source-server-in-tfs-2010.aspx" target="_blank"&gt;Jim
Lamb announced in June 2009&lt;/a&gt;, TFS 2010 introduces support for &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fms680641(v%3dvs.85).aspx" target="_blank"&gt;Source
Server&lt;/a&gt; and &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fms680693(v%3dvs.85).aspx" target="_blank"&gt;Symbol
Server&lt;/a&gt; as part of the default automated build process template. This is a really
key feature addition but I have found that many developers ask about why it would
be so important and why it would help them. Ultimately, we are starting to have more
and more tools that need access to the symbol file information and the original source
code that was used for compilation. For example, some of the tools that come to mind
are:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fsc65sadd.aspx" target="_blank"&gt;Visual
Studio Debugging&lt;/a&gt; including the &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fbt727f1t.aspx" target="_blank"&gt;Remote
Debugger&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fdd264915.aspx" target="_blank"&gt;IntelliTrace&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fz9z62c29.aspx" target="_blank"&gt;Visual
Studio Profiler&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.microsoft.com%2fwhdc%2fdevtools%2fdebugging%2fdefault.mspx" target="_blank"&gt;WinDBG&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
By setting up Source Server and Symbol Server support during your build process, you’ll
be able to work with assemblies &amp;amp; executables that come from the build servers
and still use tools that need information from them.
&lt;/p&gt;
&lt;h1&gt;What are Symbols?
&lt;/h1&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb.png" width="271" height="261"&gt;&lt;/a&gt;&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.wintellect.com%2fCS%2fblogs%2fjrobbins" target="_blank"&gt;John
Robbins&lt;/a&gt; has an excellent blog post to get started about learning what symbols
are titled: “&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.wintellect.com%2fCS%2fblogs%2fjrobbins%2farchive%2f2009%2f05%2f11%2fpdb-files-what-every-developer-must-know.aspx" target="_blank"&gt;PDB
Files: What Every Developer Must Know&lt;/a&gt;.” I highly recommend you take a moment to
read through it.
&lt;/p&gt;
&lt;p&gt;
So to summarize from John’s article, the symbol files are the .PDB files that match
a particular assembly and contain important information that’s necessary for debugging
tools. Specifically for .NET assemblies, the symbol files include:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Source File Names and Line Numbers 
&lt;li&gt;
Local Variable Names&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
He also reminds us one very important statement about symbol files: “&lt;strong&gt;&lt;u&gt;&lt;font color="#ff0000" size="3"&gt;PDB
files are as important as source code!&lt;/font&gt;&lt;/u&gt;&lt;/strong&gt;” That is absolutely true!
I cringe any time I hear from a developer that says “oh, those .PDB files take up
so much space so I’m going to delete them.” Ouch – The sad thing is those are developers
that keep people like John in business whenever they run into problems in production. &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/wlEmoticon-smile_2.png"&gt; Save
yourself some time, money, and effort and keep your symbol files around. Not to say
that John doesn’t earn every penny but I’m sure his life is much better whenever you
do have your symbols!
&lt;/p&gt;
&lt;p&gt;
This is exactly where Symbol Server helps out. Essentially, the Symbol Server is a
central location for your company that keeps the .PDB files for you. Therefore, you
can install your application (without symbols) that was compiled from a build server
and whenever you want to use a debugging tool like Visual Studio, it will know how
to contact the Symbol Server location to get the matching set of symbols. More about
how to configure Visual Studio to look for a Symbol Server further down in this blog
post.
&lt;/p&gt;
&lt;p&gt;
John also mentions how to manually perform the steps necessary for completing the
loop with Source Server and Symbol Server. Thankfully, since you are using TFS 2010
Build, &lt;strong&gt;&lt;em&gt;you don’t have to go through those steps&lt;/em&gt;&lt;/strong&gt;. The functionality
is included in the default build build process template (but not the Upgrade Template).
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;strong&gt;Aside&lt;/strong&gt;: If you are performing obfuscation using your favorite .NET
obfuscation utility, &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.red-gate.com%2fsupportcenter%2fContent%3fp%3dSmartAssembly%26c%3dSmartAssembly%2fhelp%2f5.5%2fSA_GeneratingDebugInfo.htm%26toc%3dSmartAssembly%2fhelp%2f5.5%2ftoc1210451.htm" target="_blank"&gt;you
will want to make sure you produce symbol files that match the newly created assemblies&lt;/a&gt;.
This is because the variable names and other information change by the obfuscator.
What I will normally do will do is keep both the original assemblies with their matching
symbol files in addition to the obfuscated assemblies with match symbol files. I store
the artifacts for the obfuscated assemblies in a sub-folder called “Obfuscated.”
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_1.png" width="636" height="198"&gt;&lt;/a&gt;&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_6.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_2.png" width="665" height="190"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;hr&gt;
&lt;h1&gt;How to Setup Symbol Server
&lt;/h1&gt;
&lt;p&gt;
A common misconception about Symbol Server is that you actually have to set up a server
and install the Symbol Server software. Not at all! All you have to do is setup a
file share on another server. If you are using my suggestion about &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2f2011%2f01%2f03%2fUsing%2bFriendly%2bDNS%2bNames%2bIn%2bYour%2bTFS%2bEnvironment.aspx" target="_blank"&gt;using
friendly DNS names with TFS&lt;/a&gt;, you might extend that for the symbol server as well:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;a href="$Symbols"&gt;&lt;strong&gt;&lt;font size="4" face="Consolas"&gt;\\symbols.contoso.local\Symbols&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
On my particular demonstration machine, I have a local file share that contains some
of the symbols that were published from my TFS 2010 Builds:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_8.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_3.png" width="761" height="211"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h1&gt;How to Configure Build to Index for Source Server and Publish to Symbol Server
&lt;/h1&gt;
&lt;p&gt;
Configuring the build definition to use the new Symbol Server location, couldn’t be
easier. Open up the build definition editor and navigate to the Process tab. There,
you will see all of the process parameters. If you are using the default build process
template then you will find the Source Server and Symbol Server settings underneath
the “2. Basic” category as shown below.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_10.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_4.png" width="656" height="276"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The build process will then do all the work for you!
&lt;/p&gt;
&lt;h1&gt;Source Server Indexing
&lt;/h1&gt;
&lt;p&gt;
What actually happens when the build process is actually running it’s Source Server
indexing? Let me first start by discussing the problems with symbols that come from
a build server (or another machine.) One of the pieces of information that is stored
inside of the symbol file is the location of the original source file that was used
for compilation into the assembly you are debugging. This can be a problem because
for my particular case, the local location of the source code file on the build server
is:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Consolas"&gt;C:\LocalBuilds\1\2\Sources\Source\Calculator\Calculator\Form1.cs&lt;/font&gt; at
version 32 from the MAIN branch
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Not only do you to have put all of the source files in the same exact spot but you
would have to get it from the right branch and even the exact same changeset version
from the TFS version control repository. That’s a lot of manual work… This is where
the indexing for Source Server helps you out. You’ll also notice that if you are producing
symbols from your obfuscation utility, those can indexed for Source Server support
as well.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_12.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_5.png" width="1262" height="282"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
When the TFS 2010 Build runs the source indexing for Source Server, it writes an alternate
stream of information in the symbol files that will provide the following information
for each source file:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Source Control provider’s information and the command-line utility to use to get the
file (In our case that would be using &lt;font face="Consolas"&gt;tf.exe&lt;/font&gt;) 
&lt;li&gt;
Full TFS Version Control Repository Server Path including the branch name 
&lt;li&gt;
Version 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The default build process template uses the &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fff558877(v%3dVS.85).aspx" target="_blank"&gt;srctool.exe&lt;/a&gt; command-line
utility first to list all of the local source file locations that are stored in the
symbol file. Then, it generates a temporary file that contains the exact alternate
stream information for Source Server. The Source Server stream is named &lt;font face="Consolas"&gt;srcsrv&lt;/font&gt;.
Finally, the build process uses the &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fff558874(v%3dVS.85).aspx" target="_blank"&gt;pdbstr.exe&lt;/a&gt; command-utility
to add that stream information to write the relevant information. If you are ever
curious about what that &lt;font face="Consolas"&gt;srcsrv&lt;/font&gt; stream actually contains,
you can run this command-line utility:
&lt;/p&gt;
&lt;blockquote&gt;&lt;font face="Consolas"&gt;C:\Builds\Calculator MAIN\Calculator MAIN_11.02.11.06\Debug\Obfuscated&amp;gt;&lt;font style="background-color: #ffff00"&gt;pdbstr.exe
–&lt;strong&gt;r&lt;/strong&gt;&lt;/font&gt; &lt;/font&gt;&lt;font face="Consolas"&gt;-p:Calculator.pdb &lt;font style="background-color: #ffff00"&gt;-s:srcsrv&lt;/font&gt;&lt;/font&gt;
&lt;br&gt;
&lt;font face="Consolas"&gt;SRCSRV: ini ------------------------------------------------&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;VERSION=3&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;INDEXVERSION=2&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;VERCTRL=Team Foundation Server&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;DATETIME=Fri Feb 11 00:41:58 2011&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;INDEXER=TFSTB&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;SRCSRV: variables ------------------------------------------&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;TFS_EXTRACT_CMD=tf.exe view /version:%var4% /noprompt "$%var3%"
/server:%fnvar%(&lt;/font&gt;&lt;font face="Consolas"&gt;%var2%) /console &amp;gt;%srcsrvtrg%&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;TFS_EXTRACT_TARGET=%targ%\%var2%%fnbksl%(%var3%)\%fnfile%(%var5%)&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;SRCSRVVERCTRL=tfs&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;SRCSRVERRDESC=access&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;SRCSRVERRVAR=var2&lt;/font&gt; 
&lt;br&gt;
&lt;font style="background-color: #ffff00" face="Consolas"&gt;VSTFSSERVER=http://localhost:8080/tfs/DefaultCollection&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;SRCSRVTRG=%TFS_extract_target%&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;SRCSRVCMD=%TFS_extract_cmd%&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;SRCSRV: source files ---------------------------------------&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;C:\LocalBuilds\1\2\Sources\Source\Calculator\Calculator\Form1.cs*VSTFSSERVER*/Ca&lt;/font&gt;&lt;font face="Consolas"&gt;lculator/MAIN/Source/Calculator/Calculator/Form1.cs*32*Form1;C32.cs&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;C:\LocalBuilds\1\2\Sources\Source\Calculator\Calculator\Form1.Designer.cs*VSTFSS&lt;/font&gt;&lt;font face="Consolas"&gt;ERVER*/Calculator/MAIN/Source/Calculator/Calculator/Form1.Designer.cs*30*Form1.Designer;C30.cs&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;C:\LocalBuilds\1\2\Sources\Source\Calculator\Calculator\Program.cs*VSTFSSERVER*/&lt;/font&gt;&lt;font face="Consolas"&gt;Calculator/MAIN/Source/Calculator/Calculator/Program.cs*30*Program;C30.cs&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;C:\LocalBuilds\1\2\Sources\Source\Calculator\Calculator\Properties\Settings.Designer.cs*VSTFSSERVER*/Calculator/MAIN/Source/Calculator/Calculator/Properties/Settings.Designer.cs*11*Settings.Designer;C11.cs&lt;/font&gt; 
&lt;br&gt;
&lt;font face="Consolas"&gt;SRCSRV: end ------------------------------------------------&lt;/font&gt; &lt;/blockquote&gt; 
&lt;h1&gt;Publishing to Symbol Server
&lt;/h1&gt;
&lt;p&gt;
Publishing the symbols is the easier part of it. Essentially, the default build process
template calls the &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fms681417(v%3dvs.85).aspx" target="_blank"&gt;symstore.exe&lt;/a&gt; add
utility to publish the symbol files to the specified symbol server path. Additionally,
there is some metadata added for the build information in TFS that will specify that
symbols were published. This will be useful whenever the build retention policies
kick in which we’ll cover further down.
&lt;/p&gt;
&lt;h1&gt;Configuring Visual Studio to Use Symbol Server and Enabling Source Server Support
&lt;/h1&gt;
&lt;p&gt;
The next step is for each of the developers to configure &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.microsoft.com%2fvisualstudio%2f" target="_blank"&gt;Visual
Studio 2010&lt;/a&gt; to look for symbols if they aren’t found in the symbol server location
for the company. You can get to it by going to &lt;font face="Consolas"&gt;Tools –&amp;gt; Options&lt;/font&gt; and
then the &lt;font face="Consolas"&gt;Debugging –&amp;gt; Symbols&lt;/font&gt; options pages as shown
below. Other debugging tools have similar options.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fSNAGHTML23f64f5.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML23f64f5" border="0" alt="SNAGHTML23f64f5" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/SNAGHTML23f64f5_thumb.png" width="761" height="444"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The next thing you will want to do is to enable source server support in Visual Studio.
You can do that by going to the Debugging –&amp;gt; General options tab as shown below.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fSNAGHTML243d0c1.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML243d0c1" border="0" alt="SNAGHTML243d0c1" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/SNAGHTML243d0c1_thumb.png" width="761" height="444"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Now, just start using your debugging tool and in my case I have attached my Visual
Studio Debugger to the process of my application that came from the build drop folder.
Visual Studio gives me a small warning before it attempts to grab the source code
from the TFS Version Control repository as shown below. You can see the exact command-line
utility including arguments that is used by the debugger to retrieve the correct version
of the file. Pure magic…
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fSNAGHTML226bcf3.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML226bcf3" border="0" alt="SNAGHTML226bcf3" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/SNAGHTML226bcf3_thumb.png" width="459" height="320"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;font color="#ff0000"&gt;Update&lt;/font&gt;&lt;/strong&gt;:&amp;nbsp; (2/14/2011) John Robbins
has helped out by letting us know &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.wintellect.com%2fCS%2fblogs%2fjrobbins%2farchive%2f2011%2f02%2f12%2fdisabling-the-visual-studio-source-server-security-warning-dialog.aspx" target="_blank"&gt;how
we can disable this really annoying Source Server security dialog&lt;/a&gt; any time the
debugger wants to get something from Source Server.&amp;nbsp; Thanks John!
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;strong&gt;Aside&lt;/strong&gt;: If you notice, in my situation I have a particular problem.
Since the TFS 2010 Build services are installed on the same machine as my application
tier on my laptop, the default configuration for the build service to connect to TFS
used &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2flocalhost"&gt;&lt;font face="Consolas"&gt;http://localhost&lt;/font&gt;&lt;/a&gt;. &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-sadsmile" alt="Sad smile" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/wlEmoticon-sadsmile_2.png"&gt; That’s
not going to be good whenever I have another developer start debugging using the assembly
from my build server and the symbols. Their Visual Studio Debugger instance will try
to hit &lt;font face="Consolas"&gt;localhost&lt;/font&gt; on their machine (where the source doesn’t
exist).
&lt;/p&gt;
&lt;p&gt;
For this reason, it’s important to make sure when you are configuring the build service
to use the &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2f2011%2f01%2f03%2fUsing%2bFriendly%2bDNS%2bNames%2bIn%2bYour%2bTFS%2bEnvironment.aspx" target="_blank"&gt;fully-qualified
friendly DNS name for your application tier server&lt;/a&gt;. (Check out the &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2f2011%2f01%2f03%2fUsing%2bFriendly%2bDNS%2bNames%2bIn%2bYour%2bTFS%2bEnvironment.aspx" target="_blank"&gt;blog
post&lt;/a&gt; that’s linked to find out more information about this topic).
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_14.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_6.png" width="546" height="208"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;How Does Visual Studio Know Which Symbols Match for the Executable?
&lt;/h2&gt;
&lt;p&gt;
You have to always have symbol files that exactly match the assemblies you are debugging.
How does Visual Studio know this though? There is actually a GUID that is embedded
to both the assembly and the symbol file. You can find out what that GUID is by running
the &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fc1h23y6c(loband).aspx" target="_blank"&gt;&lt;font face="Consolas"&gt;DUMPBIN&lt;/font&gt;&lt;/a&gt; command-line
utility as shown below.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Consolas"&gt;C:\Builds\Calculator MAIN\Calculator MAIN_11.02.11.06\Debug&amp;gt;&lt;font style="background-color: #ffff00"&gt;dumpbin
Calculator.exe /HEADERS&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;Microsoft (R) COFF/PE Dumper Version 10.00.31118.01&lt;br&gt;
Copyright (C) Microsoft Corporation. All rights reserved.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
&lt;font face="Consolas"&gt;Dump of file Calculator.exe&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;&lt;em&gt;
&lt;snipped brevity for&gt;
&lt;/em&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;Debug Directories&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;Time Type Size RVA Pointer&lt;br&gt;
-------- ------ -------- -------- --------&lt;br&gt;
4D54CC09 cv 69 00003864 1A64 Format: RSDS, {&lt;font style="background-color: #ffff00"&gt;B7C62014-02BD-4F35-9718-104CE8CFB14C&lt;/font&gt;}, &lt;font style="background-color: #00ff00"&gt;1&lt;/font&gt;,
c:\LocalBuilds\1\2\Sources\Source\Calculator\Calculator\obj\Debug\Calculator.pdb&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;&lt;em&gt;
&lt;snipped brevity for&gt;
&lt;/em&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
You can see the GUID highlighted above. If you were to go check out the Symbol Server
file share, you can also find the GUID used to differentiate between all of the different
versions of the symbol files that are stored for a particular assembly. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;font color="#ff0000"&gt;Update&lt;/font&gt;&lt;/strong&gt;:&amp;nbsp; (2/15/2011) I learned
something new from &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fblogs.msdn.com%2fb%2fchrissc%2f" target="_blank"&gt;Chris
Schmich&lt;/a&gt; from the Visual Studio Diagnostics team.&amp;nbsp; He indicated that the PDB
age (which is &lt;font style="background-color: #00ff00"&gt;highlighted&lt;/font&gt; above in
green) is also used to match the symbols.&amp;nbsp; You’ll notice that the PDB age for
all of my symbols is 1 and is appended to the end of the GUID when stored in Symbol
Server.&amp;nbsp; Thanks Chris for the extra information!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_16.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_7.png" width="627" height="364"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h1&gt;IntelliTrace Files and Symbol Server
&lt;/h1&gt;
&lt;p&gt;
I also wanted to mention that when testers use Microsoft Test Manager and run manual
test cases where they have collected IntelliTrace logs, you’ll notice that when you
open one of those IntelliTrace logs (for example attached to a bug work item) you
will see the Symbol Server location that was collected from the assembly being tested
as well:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_18.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_8.png" width="874" height="462"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
This green-light should be awesome for you as a developer now because you can connect
to the Symbol Server location and start debugging using the IntelliTrace log and the
Source Server information contained inside of the symbols.
&lt;/p&gt;
&lt;h1&gt;Retention Policies
&lt;/h1&gt;
&lt;p&gt;
One other thing to consider: as you have more and more builds performed using TFS
2010 Build, you’ll want to set up your retention policies. The Symbol Server file
share can start to go up in size pretty quickly so you can have the retention policies
also delete the corresponding symbols from Symbol Server if you choose by setting
the “What to Delete” option.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_20.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_9.png" width="748" height="332"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fSNAGHTML25e109f.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML25e109f" border="0" alt="SNAGHTML25e109f" src="http://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/SNAGHTML25e109f_thumb.png" width="634" height="425"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
You want to also make sure, however, that any “Released” &lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fgg475877.aspx%23retainindefinitely" target="_blank"&gt;builds
should be marked as “Retain Indefinitely”&lt;/a&gt; to ensure that the retention policies
never delete the symbols (or anything else about the build for that matter!)
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2fcontent%2fbinary%2fWindows-Live-Writer%2fSource-Server-and-Symbol-Server-Support-_80F8%2fimage_22.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; 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://www.edsquared.com/content/binary/Windows-Live-Writer/Source-Server-and-Symbol-Server-Support-_80F8/image_thumb_10.png" width="881" height="386"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h2&gt;Summary
&lt;/h2&gt;
&lt;p&gt;
There you go! Your developers will be very appreciative whenever all of this is setup.
You’ll have a system that stores your symbols for whenever you need them and those
symbols will have information to let the debugging utilities know where to grab the
original source code from the TFS version control repository.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Ed Blankenship&lt;/strong&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edsquared.com/aggbug.ashx?id=a4216b56-4831-4c3f-b85f-f12bd89b4c1f" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Brought to you by Ed Blankenship and Ed Kisinger at EdSquared.com</description>
      <comments>http://www.edsquared.com/CommentView,guid,a4216b56-4831-4c3f-b85f-f12bd89b4c1f.aspx</comments>
      <category>IntelliTrace</category>
      <category>TFS</category>
      <category>Tools</category>
      <category>VSTS</category>
      <category>VSTS Administering</category>
      <category>VSTS Building &amp; Releasing</category>
      <category>VSTS Version Control</category>
    </item>
    <item>
      <trackback:ping>http://www.edsquared.com/Trackback.aspx?guid=bc7f54e3-8762-4edd-970a-859dfd79a3d0</trackback:ping>
      <pingback:server>http://www.edsquared.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.edsquared.com/PermaLink,guid,bc7f54e3-8762-4edd-970a-859dfd79a3d0.aspx</pingback:target>
      <dc:creator>Ed Blankenship (EdSquared.com)</dc:creator>
      <georss:point>32.85 96.85</georss:point>
      <wfw:comment>http://www.edsquared.com/CommentView,guid,bc7f54e3-8762-4edd-970a-859dfd79a3d0.aspx</wfw:comment>
      <wfw:commentRss>http://www.edsquared.com/SyndicationService.asmx/GetEntryCommentsRss?guid=bc7f54e3-8762-4edd-970a-859dfd79a3d0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
There is a great article in the <a href="http://www.edsquared.com/ct.ashx?id=bc7f54e3-8762-4edd-970a-859dfd79a3d0&amp;url=http%3a%2f%2fwww.sdtimes.com%2fcontent%2fSDTimesPDFEdition.aspx%3fFile%3dsdtimes251.pdf" target="_blank">August
1, 2010 edition of the SD Times</a> by <a href="http://www.edsquared.com/ct.ashx?id=bc7f54e3-8762-4edd-970a-859dfd79a3d0&amp;url=http%3a%2f%2fwww.sdtimes.com%2fabout%2fDavidWorthington" target="_blank">Dave
Worthington</a> (<a href="http://www.edsquared.com/ct.ashx?id=bc7f54e3-8762-4edd-970a-859dfd79a3d0&amp;url=http%3a%2f%2ftwitter.com%2fdcworthington" target="_blank">@dcworthington</a>)
about the <a href="http://www.edsquared.com/ct.ashx?id=bc7f54e3-8762-4edd-970a-859dfd79a3d0&amp;url=http%3a%2f%2fwww.microsoft.com%2fvisualstudio" target="_blank">Visual
Studio 2010</a> ALM tools including <a href="http://www.edsquared.com/ct.ashx?id=bc7f54e3-8762-4edd-970a-859dfd79a3d0&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2fvstudio%2fff637362.aspx" target="_blank">Team
Foundation Server 2010</a>.  It’s titled <strong>“</strong><a href="http://www.edsquared.com/ct.ashx?id=bc7f54e3-8762-4edd-970a-859dfd79a3d0&amp;url=http%3a%2f%2fwww.sdtimes.com%2fMICROSOFT_S_ISLANDS_IN_THE_STREAM%2fBy_David_Worthington%2fAbout_ALM_and_MICROSOFT%2f34531" target="_blank"><strong>Microsoft’s
islands in the stream</strong></a><strong>.”</strong>  Some really great colleagues
in the ALM community have been interviewed and provided some pretty honest feedback
from what we have been seeing over the last year or so.  Check it out!
</p>
        <p>
 
</p>
        <p>
          <strong>Ed Blankenship</strong>
        </p>
        <img width="0" height="0" src="http://www.edsquared.com/aggbug.ashx?id=bc7f54e3-8762-4edd-970a-859dfd79a3d0" />
        <br />
        <hr />
Brought to you by Ed Blankenship and Ed Kisinger at EdSquared.com</body>
      <title>Microsoft’s Islands in the Stream</title>
      <guid isPermaLink="false">http://www.edsquared.com/PermaLink,guid,bc7f54e3-8762-4edd-970a-859dfd79a3d0.aspx</guid>
      <link>http://www.edsquared.com/2010/08/07/Microsofts+Islands+In+The+Stream.aspx</link>
      <pubDate>Sat, 07 Aug 2010 10:30:13 GMT</pubDate>
      <description>&lt;p&gt;
There is a great article in the &lt;a href="http://www.edsquared.com/ct.ashx?id=bc7f54e3-8762-4edd-970a-859dfd79a3d0&amp;amp;url=http%3a%2f%2fwww.sdtimes.com%2fcontent%2fSDTimesPDFEdition.aspx%3fFile%3dsdtimes251.pdf" target="_blank"&gt;August
1, 2010 edition of the SD Times&lt;/a&gt; by &lt;a href="http://www.edsquared.com/ct.ashx?id=bc7f54e3-8762-4edd-970a-859dfd79a3d0&amp;amp;url=http%3a%2f%2fwww.sdtimes.com%2fabout%2fDavidWorthington" target="_blank"&gt;Dave
Worthington&lt;/a&gt; (&lt;a href="http://www.edsquared.com/ct.ashx?id=bc7f54e3-8762-4edd-970a-859dfd79a3d0&amp;amp;url=http%3a%2f%2ftwitter.com%2fdcworthington" target="_blank"&gt;@dcworthington&lt;/a&gt;)
about the &lt;a href="http://www.edsquared.com/ct.ashx?id=bc7f54e3-8762-4edd-970a-859dfd79a3d0&amp;amp;url=http%3a%2f%2fwww.microsoft.com%2fvisualstudio" target="_blank"&gt;Visual
Studio 2010&lt;/a&gt; ALM tools including &lt;a href="http://www.edsquared.com/ct.ashx?id=bc7f54e3-8762-4edd-970a-859dfd79a3d0&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2fvstudio%2fff637362.aspx" target="_blank"&gt;Team
Foundation Server 2010&lt;/a&gt;.&amp;nbsp; It’s titled &lt;strong&gt;“&lt;/strong&gt;&lt;a href="http://www.edsquared.com/ct.ashx?id=bc7f54e3-8762-4edd-970a-859dfd79a3d0&amp;amp;url=http%3a%2f%2fwww.sdtimes.com%2fMICROSOFT_S_ISLANDS_IN_THE_STREAM%2fBy_David_Worthington%2fAbout_ALM_and_MICROSOFT%2f34531" target="_blank"&gt;&lt;strong&gt;Microsoft’s
islands in the stream&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.”&lt;/strong&gt;&amp;nbsp; Some really great colleagues
in the ALM community have been interviewed and provided some pretty honest feedback
from what we have been seeing over the last year or so.&amp;nbsp; Check it out!
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Ed Blankenship&lt;/strong&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edsquared.com/aggbug.ashx?id=bc7f54e3-8762-4edd-970a-859dfd79a3d0" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Brought to you by Ed Blankenship and Ed Kisinger at EdSquared.com</description>
      <comments>http://www.edsquared.com/CommentView,guid,bc7f54e3-8762-4edd-970a-859dfd79a3d0.aspx</comments>
      <category>IntelliTrace</category>
      <category>Lab Management</category>
      <category>TFS</category>
      <category>VSTS</category>
    </item>
    <item>
      <trackback:ping>http://www.edsquared.com/Trackback.aspx?guid=34c168af-6478-4777-9b45-54d1395dcb28</trackback:ping>
      <pingback:server>http://www.edsquared.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.edsquared.com/PermaLink,guid,34c168af-6478-4777-9b45-54d1395dcb28.aspx</pingback:target>
      <dc:creator>Ed Blankenship (EdSquared.com)</dc:creator>
      <georss:point>32.85 96.85</georss:point>
      <wfw:comment>http://www.edsquared.com/CommentView,guid,34c168af-6478-4777-9b45-54d1395dcb28.aspx</wfw:comment>
      <wfw:commentRss>http://www.edsquared.com/SyndicationService.asmx/GetEntryCommentsRss?guid=34c168af-6478-4777-9b45-54d1395dcb28</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <div style="padding-bottom: 5px; margin: 5px; padding-left: 5px; padding-right: 5px; display: inline; float: left; padding-top: 5px" id="scid:7dc1bd33-94bd-46fd-a20b-0131235bcd47:8b62623e-0fc8-44d5-9d3f-39fdde2ad2e1" class="wlWriterSmartContent">
          <table border="0" cellspacing="0" cellpadding="2" width="400">
            <tbody>
              <tr>
                <td valign="top" width="400">
                  <p>
                    <a title="Professional Application Lifecycle Management with Visual Studio 2010 (9780470484265): Mickey Gousset, Brian Keller, Ajoy Krishnamoorthy, Martin Woodward: Books" href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;url=http%3a%2f%2fwww.amazon.com%2fexec%2fobidos%2fASIN%2f0470484268%2fblankenship-20">
                      <img style="float: left" border="0" align="left" src="http://images.amazon.com/images/P/0470484268.01.MZZZZZZZ.jpg" />Professional
Application Lifecycle Management with Visual Studio 2010 (9780470484265): Mickey Gousset,
Brian Keller, Ajoy Krishnamoorthy, Martin Woodward: Books</a>
                    <br />
                    <br />
                    <b>ISBN</b>: 0470484268<br /><b>ISBN-13</b>: 9780470484265
</p>
                </td>
              </tr>
            </tbody>
          </table>
        </div>
        <p>
During the first week of April, a little package was sitting on my front porch with
the first book to be released on the <a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;url=http%3a%2f%2fwww.microsoft.com%2fvisualstudio" target="_blank">Visual
Studio 2010</a> release that deals with the new <a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;url=http%3a%2f%2fen.wikipedia.org%2fwiki%2fApplication_lifecycle_management" target="_blank">Application
Lifecycle Management (ALM)</a> features.  For those of you who don’t know, this
essentially means the former “Team System” line of products as we were exposed to
it in the 2005 and 2008 releases.  Although the entire Visual Studio suite of
products is considered something that helps you with ALM, the book primarily focused
on <a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;url=http%3a%2f%2fwww.microsoft.com%2fvisualstudio%2fen-us%2fproducts%2f2010-editions%2fultimate" target="_blank">Visual
Studio 2010 Ultimate</a>, Visual Studio 2010 Premium, Visual Studio 2010 Test Professional,
Visual Studio 2010 Lab Management, and <a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2fteamsystem%2fdefault.aspx" target="_blank">Team
Foundation Server</a> 2010.  During the Introduction, I even appreciated how
the authors discussed about “where Team System went.”  It’s the best explanation
of the branding change that I’ve seen to date.
</p>
        <p>
I was extremely excited to start immediately reading the book.  Even though I
have been closely involved with the 2010 release as a Microsoft MVP, when I started
to read this book my goal was to be exposed deeper in the feature set being introduced
in the 2010 release.
</p>
        <p>
At the time of writing this blog post, the book was selling for <a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;url=http%3a%2f%2fwww.amazon.com%2fgp%2fproduct%2f0470484268%3fie%3dUTF8%26tag%3dblankenship-20%26linkCode%3das2%26camp%3d1789%26creative%3d390957%26creativeASIN%3d0470484268" target="_blank">$34.64
at Amazon</a>.  The suggested retail price is $54.99.  It is currently #7
in the Software Development books category!
</p>
        <h2>Strengths
</h2>
        <p>
If you are new to the ALM features in Visual Studio, I felt this book really offered
you the ability to get the high-level overview of all of those features.  It’s
essentially similar to a “survey” course that you would have taken in college.  
It’s 696 pages that ends up going through all of the Visual Studio client and server
features at just the right level of detail. There were even some areas that I felt
that I learned more about and hadn’t been exposed to heavily in the past.
</p>
        <p>
The architecture features were something that I had hoped to learn the most from. 
They have just never been something that I dived into great detail during the 2010
release cycle.   All of the new UML diagrams that are available including
the new architecture features like Use Case, Activity, Sequence, Component, Class,
Dependency, and Layer Diagrams.  There was a also a great introduction to the
Architecture Explorer.
</p>
        <p>
The testing features have really been what has made up a majority of the Visual Studio
2010 release and the book definitely reflects that.  Going through the testing
features, I really felt like I understood the end to end story.  It felt very
rounded out!  These chapters are where I picked up a majority of the nuggets
of information.  I can’t tell you how many times I said “wow, I didn’t know you
could do that.”  I also feel like this is a great place to pick up some introductory
knowledge about how <a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;url=http%3a%2f%2fwww.edsquared.com%2f2010%2f02%2f24%2fNews%2bUpdate%2bOn%2bTeam%2bLab%2bManagement%2bWith%2bTFS%2b2010.aspx" target="_blank">Visual
Studio Team Lab Management</a> fits into the ALM story.  I also kept thinking
how great this book would be for the testers on your team that are new to the Microsoft
testing platform and Team Foundation Server.
</p>
        <p>
There are so many changes to TFS, I can’t even begin to start describing them. 
Thankfully, the book did a great job.  Especially with the revamp of Team Build
to use Windows Workflow Foundation.  You can even download the Team Build chapter
from the book for free here:  <a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;url=http%3a%2f%2fmedia.wiley.com%2fproduct_data%2fexcerpt%2f68%2f04704842%2f0470484268-3.pdf">Team
Foundation Build</a>.  Other than automated builds, you’ll get a good pass by
all of the rest of the new TFS 2010 features and architecture/topology changes.
</p>
        <p>
There was a whole chapter dedicated to debugging with <a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2fmagazine%2fee336126.aspx" target="_blank">IntelliTrace</a>! 
That’s awesome.  I’m very much a fan of IntelliTrace and think that will truly
change the way you develop.
</p>
        <h2>Criticisms
</h2>
        <p>
I have been hoping to have a book available out there that really only discusses TFS. 
The book definitely has a few chapters available on TFS and spends a good amount of
time but that discussion is not the nitty gritty that I think some readers out there
are really looking for.  With that said, I don’t think this book was positioned
for the “<a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2fteamsystem%2fdefault.aspx" target="_blank">TFS</a> Administrator”
exclusively.  Again, I really think this is a survey-level review of the entire
ALM stack of features for Visual Studio.  That doesn’t allow you to go into the
depths of any particular product.  There currently isn’t a book available for
TFS 2010 with the level of detail that I am sure some readers out there are hoping
for.  We’ll see what happens in the months to come…
</p>
        <p>
My next criticism isn’t so much for the content of the book as what is media choices
are available.  I own a Kindle DX and I imagine a few other techies in the world
have some type of eBook reader as well.  I was hoping to have a CD that contained
a DRM-free PDF that I could copy over to my Kindle DX whenever I’m traveling and need
a quick resource for reference.  <a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;url=http%3a%2f%2ftwitter.com%2fwrox%2fstatuses%2f11654171837" target="_blank">Wrox
certainly does allow you to get a PDF</a> of books but you have to order them separately
even if you had purchased the hard copy.
</p>
        <p>
Finally, the only other thing that I noticed was in that chapter about IntelliTrace
(see above) there wasn’t a mention of Symbol &amp; Source Server.  I couldn’t
believe it.  There is definitely a discussion later in the book about Team Build’s
integration with Symbol &amp; Source server but I was hoping to have seen some more
detail in the IntelliTrace chapter about the importance of having them setup for your
organization.  You’ll want to put two and two together.
</p>
        <p>
 
</p>
        <p>
Now that I’m finished scrounging from the bottom of the barrel to find some criticisms…
:)
</p>
        <h3>My Recommendation
</h3>
        <p>
Hands down, get this book.  I think it’s well worth it.   I know each
of the authors and it really looks like they put a tremendous amount of effort into
writing the book.  The topics are really presented well and at the right level
of detail for someone really wanting a crash course in all of the Visual Studio ALM
features.  I can’t even tell you how many new nuggets of information that I ran
across of things that I didn’t even realize were in the product.
</p>
        <p>
It certainly gets my stamp of approval! :)  Kudos to the authors.
</p>
        <p>
 
</p>
        <p>
Very respectfully,
</p>
        <p>
          <strong>Ed Blankenship</strong>
        </p>
        <p>
          <a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;url=http%3a%2f%2fwww.edsquared.com%2f2010%2f02%2f24%2fMicrosoft%2bMVP%2bOf%2bThe%2bYear%2bFor%2bVSTS%2bTFS.aspx" target="_blank">Microsoft
MVP of the Year</a>, Visual Studio ALM and Team Foundation Server
</p>
        <img width="0" height="0" src="http://www.edsquared.com/aggbug.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28" />
        <br />
        <hr />
Brought to you by Ed Blankenship and Ed Kisinger at EdSquared.com</body>
      <title>Book Review for Wrox Professional Application Lifecycle Management with Visual Studio 2010</title>
      <guid isPermaLink="false">http://www.edsquared.com/PermaLink,guid,34c168af-6478-4777-9b45-54d1395dcb28.aspx</guid>
      <link>http://www.edsquared.com/2010/05/11/Book+Review+For+Wrox+Professional+Application+Lifecycle+Management+With+Visual+Studio+2010.aspx</link>
      <pubDate>Tue, 11 May 2010 14:24:05 GMT</pubDate>
      <description>&lt;div style="padding-bottom: 5px; margin: 5px; padding-left: 5px; padding-right: 5px; display: inline; float: left; padding-top: 5px" id="scid:7dc1bd33-94bd-46fd-a20b-0131235bcd47:8b62623e-0fc8-44d5-9d3f-39fdde2ad2e1" class="wlWriterSmartContent"&gt;
&lt;table border="0" cellspacing="0" cellpadding="2" width="400"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="400"&gt;
&lt;p&gt;
&lt;a title="Professional Application Lifecycle Management with Visual Studio 2010 (9780470484265): Mickey Gousset, Brian Keller, Ajoy Krishnamoorthy, Martin Woodward: Books" href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;amp;url=http%3a%2f%2fwww.amazon.com%2fexec%2fobidos%2fASIN%2f0470484268%2fblankenship-20"&gt;&lt;img style="float: left" border="0" align="left" src="http://images.amazon.com/images/P/0470484268.01.MZZZZZZZ.jpg"&gt;Professional
Application Lifecycle Management with Visual Studio 2010 (9780470484265): Mickey Gousset,
Brian Keller, Ajoy Krishnamoorthy, Martin Woodward: Books&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
&lt;b&gt;ISBN&lt;/b&gt;: 0470484268&lt;br&gt;
&lt;b&gt;ISBN-13&lt;/b&gt;: 9780470484265
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;
During the first week of April, a little package was sitting on my front porch with
the first book to be released on the &lt;a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;amp;url=http%3a%2f%2fwww.microsoft.com%2fvisualstudio" target="_blank"&gt;Visual
Studio 2010&lt;/a&gt; release that deals with the new &lt;a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;amp;url=http%3a%2f%2fen.wikipedia.org%2fwiki%2fApplication_lifecycle_management" target="_blank"&gt;Application
Lifecycle Management (ALM)&lt;/a&gt; features.&amp;nbsp; For those of you who don’t know, this
essentially means the former “Team System” line of products as we were exposed to
it in the 2005 and 2008 releases.&amp;nbsp; Although the entire Visual Studio suite of
products is considered something that helps you with ALM, the book primarily focused
on &lt;a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;amp;url=http%3a%2f%2fwww.microsoft.com%2fvisualstudio%2fen-us%2fproducts%2f2010-editions%2fultimate" target="_blank"&gt;Visual
Studio 2010 Ultimate&lt;/a&gt;, Visual Studio 2010 Premium, Visual Studio 2010 Test Professional,
Visual Studio 2010 Lab Management, and &lt;a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2fteamsystem%2fdefault.aspx" target="_blank"&gt;Team
Foundation Server&lt;/a&gt; 2010.&amp;nbsp; During the Introduction, I even appreciated how
the authors discussed about “where Team System went.”&amp;nbsp; It’s the best explanation
of the branding change that I’ve seen to date.
&lt;/p&gt;
&lt;p&gt;
I was extremely excited to start immediately reading the book.&amp;nbsp; Even though I
have been closely involved with the 2010 release as a Microsoft MVP, when I started
to read this book my goal was to be exposed deeper in the feature set being introduced
in the 2010 release.
&lt;/p&gt;
&lt;p&gt;
At the time of writing this blog post, the book was selling for &lt;a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;amp;url=http%3a%2f%2fwww.amazon.com%2fgp%2fproduct%2f0470484268%3fie%3dUTF8%26tag%3dblankenship-20%26linkCode%3das2%26camp%3d1789%26creative%3d390957%26creativeASIN%3d0470484268" target="_blank"&gt;$34.64
at Amazon&lt;/a&gt;.&amp;nbsp; The suggested retail price is $54.99.&amp;nbsp; It is currently #7
in the Software Development books category!
&lt;/p&gt;
&lt;h2&gt;Strengths
&lt;/h2&gt;
&lt;p&gt;
If you are new to the ALM features in Visual Studio, I felt this book really offered
you the ability to get the high-level overview of all of those features.&amp;nbsp; It’s
essentially similar to a “survey” course that you would have taken in college.&amp;nbsp;&amp;nbsp;
It’s 696 pages that ends up going through all of the Visual Studio client and server
features at just the right level of detail. There were even some areas that I felt
that I learned more about and hadn’t been exposed to heavily in the past.
&lt;/p&gt;
&lt;p&gt;
The architecture features were something that I had hoped to learn the most from.&amp;nbsp;
They have just never been something that I dived into great detail during the 2010
release cycle.&amp;nbsp;&amp;nbsp; All of the new UML diagrams that are available including
the new architecture features like Use Case, Activity, Sequence, Component, Class,
Dependency, and Layer Diagrams.&amp;nbsp; There was a also a great introduction to the
Architecture Explorer.
&lt;/p&gt;
&lt;p&gt;
The testing features have really been what has made up a majority of the Visual Studio
2010 release and the book definitely reflects that.&amp;nbsp; Going through the testing
features, I really felt like I understood the end to end story.&amp;nbsp; It felt very
rounded out!&amp;nbsp; These chapters are where I picked up a majority of the nuggets
of information.&amp;nbsp; I can’t tell you how many times I said “wow, I didn’t know you
could do that.”&amp;nbsp; I also feel like this is a great place to pick up some introductory
knowledge about how &lt;a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2f2010%2f02%2f24%2fNews%2bUpdate%2bOn%2bTeam%2bLab%2bManagement%2bWith%2bTFS%2b2010.aspx" target="_blank"&gt;Visual
Studio Team Lab Management&lt;/a&gt; fits into the ALM story.&amp;nbsp; I also kept thinking
how great this book would be for the testers on your team that are new to the Microsoft
testing platform and Team Foundation Server.
&lt;/p&gt;
&lt;p&gt;
There are so many changes to TFS, I can’t even begin to start describing them.&amp;nbsp;
Thankfully, the book did a great job.&amp;nbsp; Especially with the revamp of Team Build
to use Windows Workflow Foundation.&amp;nbsp; You can even download the Team Build chapter
from the book for free here:&amp;nbsp; &lt;a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;amp;url=http%3a%2f%2fmedia.wiley.com%2fproduct_data%2fexcerpt%2f68%2f04704842%2f0470484268-3.pdf"&gt;Team
Foundation Build&lt;/a&gt;.&amp;nbsp; Other than automated builds, you’ll get a good pass by
all of the rest of the new TFS 2010 features and architecture/topology changes.
&lt;/p&gt;
&lt;p&gt;
There was a whole chapter dedicated to debugging with &lt;a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2fmagazine%2fee336126.aspx" target="_blank"&gt;IntelliTrace&lt;/a&gt;!&amp;nbsp;
That’s awesome.&amp;nbsp; I’m very much a fan of IntelliTrace and think that will truly
change the way you develop.
&lt;/p&gt;
&lt;h2&gt;Criticisms
&lt;/h2&gt;
&lt;p&gt;
I have been hoping to have a book available out there that really only discusses TFS.&amp;nbsp;
The book definitely has a few chapters available on TFS and spends a good amount of
time but that discussion is not the nitty gritty that I think some readers out there
are really looking for.&amp;nbsp; With that said, I don’t think this book was positioned
for the “&lt;a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2fteamsystem%2fdefault.aspx" target="_blank"&gt;TFS&lt;/a&gt; Administrator”
exclusively.&amp;nbsp; Again, I really think this is a survey-level review of the entire
ALM stack of features for Visual Studio.&amp;nbsp; That doesn’t allow you to go into the
depths of any particular product.&amp;nbsp; There currently isn’t a book available for
TFS 2010 with the level of detail that I am sure some readers out there are hoping
for.&amp;nbsp; We’ll see what happens in the months to come…
&lt;/p&gt;
&lt;p&gt;
My next criticism isn’t so much for the content of the book as what is media choices
are available.&amp;nbsp; I own a Kindle DX and I imagine a few other techies in the world
have some type of eBook reader as well.&amp;nbsp; I was hoping to have a CD that contained
a DRM-free PDF that I could copy over to my Kindle DX whenever I’m traveling and need
a quick resource for reference.&amp;nbsp; &lt;a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;amp;url=http%3a%2f%2ftwitter.com%2fwrox%2fstatuses%2f11654171837" target="_blank"&gt;Wrox
certainly does allow you to get a PDF&lt;/a&gt; of books but you have to order them separately
even if you had purchased the hard copy.
&lt;/p&gt;
&lt;p&gt;
Finally, the only other thing that I noticed was in that chapter about IntelliTrace
(see above) there wasn’t a mention of Symbol &amp;amp; Source Server.&amp;nbsp; I couldn’t
believe it.&amp;nbsp; There is definitely a discussion later in the book about Team Build’s
integration with Symbol &amp;amp; Source server but I was hoping to have seen some more
detail in the IntelliTrace chapter about the importance of having them setup for your
organization.&amp;nbsp; You’ll want to put two and two together.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Now that I’m finished scrounging from the bottom of the barrel to find some criticisms…
:)
&lt;/p&gt;
&lt;h3&gt;My Recommendation
&lt;/h3&gt;
&lt;p&gt;
Hands down, get this book.&amp;nbsp; I think it’s well worth it.&amp;nbsp;&amp;nbsp; I know each
of the authors and it really looks like they put a tremendous amount of effort into
writing the book.&amp;nbsp; The topics are really presented well and at the right level
of detail for someone really wanting a crash course in all of the Visual Studio ALM
features.&amp;nbsp; I can’t even tell you how many new nuggets of information that I ran
across of things that I didn’t even realize were in the product.
&lt;/p&gt;
&lt;p&gt;
It certainly gets my stamp of approval! :)&amp;nbsp; Kudos to the authors.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Very respectfully,
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Ed Blankenship&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.edsquared.com/ct.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28&amp;amp;url=http%3a%2f%2fwww.edsquared.com%2f2010%2f02%2f24%2fMicrosoft%2bMVP%2bOf%2bThe%2bYear%2bFor%2bVSTS%2bTFS.aspx" target="_blank"&gt;Microsoft
MVP of the Year&lt;/a&gt;, Visual Studio ALM and Team Foundation Server
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edsquared.com/aggbug.ashx?id=34c168af-6478-4777-9b45-54d1395dcb28" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Brought to you by Ed Blankenship and Ed Kisinger at EdSquared.com</description>
      <comments>http://www.edsquared.com/CommentView,guid,34c168af-6478-4777-9b45-54d1395dcb28.aspx</comments>
      <category>Book Review</category>
      <category>IntelliTrace</category>
      <category>Lab Management</category>
      <category>Reporting</category>
      <category>TFS</category>
      <category>VSTS</category>
      <category>VSTS Administering</category>
      <category>VSTS Building &amp; Releasing</category>
      <category>VSTS Developing</category>
      <category>VSTS Process</category>
      <category>VSTS Testing</category>
      <category>VSTS Version Control</category>
    </item>
    <item>
      <trackback:ping>http://www.edsquared.com/Trackback.aspx?guid=1be0367f-bd0b-4846-9ee5-48950cff4269</trackback:ping>
      <pingback:server>http://www.edsquared.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.edsquared.com/PermaLink,guid,1be0367f-bd0b-4846-9ee5-48950cff4269.aspx</pingback:target>
      <dc:creator>Ed Blankenship (EdSquared.com)</dc:creator>
      <georss:point>32.85 96.85</georss:point>
      <wfw:comment>http://www.edsquared.com/CommentView,guid,1be0367f-bd0b-4846-9ee5-48950cff4269.aspx</wfw:comment>
      <wfw:commentRss>http://www.edsquared.com/SyndicationService.asmx/GetEntryCommentsRss?guid=1be0367f-bd0b-4846-9ee5-48950cff4269</wfw:commentRss>
      <slash:comments>8</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I’ve been hearing this question quite a bit…  “Can I collect an IntelliTrace
log in Production?”  This would be a really good idea <a href="http://www.edsquared.com/ct.ashx?id=1be0367f-bd0b-4846-9ee5-48950cff4269&amp;url=http%3a%2f%2fblogs.msdn.com%2fianhu%2farchive%2f2009%2f11%2f16%2fintellitrace-itrace-files.aspx" target="_blank">especially
now that there is a standalone command-line utility, IntelliTrace.exe</a>, that you
can run to collect IntelliTrace log files.  Unfortunately, it looks like the <a href="http://www.edsquared.com/ct.ashx?id=1be0367f-bd0b-4846-9ee5-48950cff4269&amp;url=http%3a%2f%2fwww.microsoft.com%2fdownloads%2fdetails.aspx%3fFamilyID%3d2B1504E6-0BF1-46DA-BE0E-85CC792C6B9D%26displaylang%3den" target="_blank">Visual
Studio 2010 Licensing White Paper</a> answers that question for us on page 28:
</p>
        <blockquote>
          <p>
            <em>The IntelliTrace DDA and/or IntelliTrace.exe <strong><u>cannot</u></strong> be
used:</em>
          </p>
          <ul>
            <li>
              <em>
                <font color="#ff0000">
                  <strong>On a device or server in a production environment.</strong>
                </font>
              </em>
            </li>
            <li>
              <em>For purposes of system or application monitoring.</em>
            </li>
            <li>
              <em>In non-interactive scenarios other than as part of an automated test or debugging-data
collection session.</em>
            </li>
          </ul>
        </blockquote>
        <p>
Bummer! :(  Honestly, I imagine that has to do with something around how IntelliTrace
works and Microsoft doesn’t feel comfortable the impact it may have on running Production
environments.  Just my conjecture though…
</p>
        <p>
You’ll notice that you can use IntelliTrace in other instances though; most notably
on development &amp; test environments!
</p>
        <blockquote>
          <p>
            <em>The IntelliTrace diagnostic data adapter (DDA) and/or IntelliTrace.exe <strong><u>can</u></strong> be
used for test and debugging purposes:</em>
          </p>
          <ul>
            <li>
              <em>As part of an interactive test or debugging session.</em>
            </li>
            <li>
              <em>As part of an automated test or debugging-data collection session that is authored
by a licensed user and triggered by the same or another licensed user.</em>
            </li>
          </ul>
        </blockquote>
        <p>
You can even share IntelliTrace files between two companies as long as both companies
are properly licensed!
</p>
        <blockquote>
          <p>
            <em>IntelliTrace files may be shared among two or more companies as long as all users
capturing and debugging IntelliTrace files are licensed with either Visual Studio
2010 Ultimate or Visual Studio Test Professional 2010, depending on the activities
they are performing. For example, a company can share IntelliTrace files with an external
development consultant. Similarly. a company can use an external company for testing
purposes and debug IntelliTrace files provided by that vendor.</em>
          </p>
        </blockquote>
        <p>
Here were the common scenarios mentioned in the licensing white paper.  See if
you happen to fit into one of them:
</p>
        <blockquote>
          <p>
            <em>
              <strong>
                <font size="4">Example 1</font>
              </strong>: Finding a defect in a test environment
Company A is building a Web application. All the developers are licensed for Visual
Studio 2010 Ultimate with MSDN, and the testers are licensed with Visual Studio Test
Professional 2010 with MSDN. During a test run a defect is discovered in the test
environment that is difficult to reproduce in a development environment. The test
machines have previously been configured with the Visual Studio Test Agent 2010, which
includes the IntelliTrace DDA. The tester uses the Microsoft Test Manager to execute
the test case with the IntelliTrace diagnostic data adapter (DDA) enabled. When the
defect is encountered, the tester files a new bug, with the IntelliTrace files from
each of the test machines is automatically attached to the bug. When a developer opens
the bug using Visual Studio Ultimate, he or she can open the IntelliTrace files and
step through the execution. </em>
          </p>
          <p>
            <em>
              <strong>
                <font size="4">Example 2</font>
              </strong>: Working with an external consultant
In Example 1, Company A uses an external consultant to help with development. If the
external consultant is licensed for Visual Studio Ultimate, he or she can open and
debug the IntelliTrace files provided by Company A. </em>
          </p>
          <p>
            <em>
              <strong>
                <font size="4">Example 3</font>
              </strong>: Working with an external test
vendor In Example 1, Company A uses Company B as an outsourced test vendor. The two
companies can work together using IntelliTrace as long as all developers at Company
A and all testers at company B are licensed appropriately.</em>
          </p>
        </blockquote>
        <p>
I’m not sure what the minimal <em><u>technical</u></em> footprint is to get IntelliTrace.exe
to collect an iTrace file just yet but my answer right now will be to have one of
these installed:
</p>
        <ul>
          <li>
Visual Studio 2010 Ultimate</li>
          <li>
Visual Studio 2010 Test Professional</li>
          <li>
Visual Studio 2010 Test Agents (additional software) &lt;--- probably the smallest
impact to a system</li>
        </ul>
        <p>
If I find out some more information about this scenario, then I’ll be putting together
a future blog post!
</p>
        <p>
 
</p>
        <p>
Take care,
</p>
        <p>
          <strong>Ed Blankenship</strong>
        </p>
        <img width="0" height="0" src="http://www.edsquared.com/aggbug.ashx?id=1be0367f-bd0b-4846-9ee5-48950cff4269" />
        <br />
        <hr />
Brought to you by Ed Blankenship and Ed Kisinger at EdSquared.com</body>
      <title>Can I Collect an IntelliTrace Log in Production?</title>
      <guid isPermaLink="false">http://www.edsquared.com/PermaLink,guid,1be0367f-bd0b-4846-9ee5-48950cff4269.aspx</guid>
      <link>http://www.edsquared.com/2010/02/12/Can+I+Collect+An+IntelliTrace+Log+In+Production.aspx</link>
      <pubDate>Fri, 12 Feb 2010 13:00:00 GMT</pubDate>
      <description>&lt;p&gt;
I’ve been hearing this question quite a bit…&amp;nbsp; “Can I collect an IntelliTrace
log in Production?”&amp;nbsp; This would be a really good idea &lt;a href="http://www.edsquared.com/ct.ashx?id=1be0367f-bd0b-4846-9ee5-48950cff4269&amp;amp;url=http%3a%2f%2fblogs.msdn.com%2fianhu%2farchive%2f2009%2f11%2f16%2fintellitrace-itrace-files.aspx" target="_blank"&gt;especially
now that there is a standalone command-line utility, IntelliTrace.exe&lt;/a&gt;, that you
can run to collect IntelliTrace log files.&amp;nbsp; Unfortunately, it looks like the &lt;a href="http://www.edsquared.com/ct.ashx?id=1be0367f-bd0b-4846-9ee5-48950cff4269&amp;amp;url=http%3a%2f%2fwww.microsoft.com%2fdownloads%2fdetails.aspx%3fFamilyID%3d2B1504E6-0BF1-46DA-BE0E-85CC792C6B9D%26displaylang%3den" target="_blank"&gt;Visual
Studio 2010 Licensing White Paper&lt;/a&gt; answers that question for us on page 28:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;The IntelliTrace DDA and/or IntelliTrace.exe &lt;strong&gt;&lt;u&gt;cannot&lt;/u&gt;&lt;/strong&gt; be
used:&lt;/em&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;On a device or server in a production environment.&lt;/strong&gt;&lt;/font&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;For purposes of system or application monitoring.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;In non-interactive scenarios other than as part of an automated test or debugging-data
collection session.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Bummer! :(&amp;nbsp; Honestly, I imagine that has to do with something around how IntelliTrace
works and Microsoft doesn’t feel comfortable the impact it may have on running Production
environments.&amp;nbsp; Just my conjecture though…
&lt;/p&gt;
&lt;p&gt;
You’ll notice that you can use IntelliTrace in other instances though; most notably
on development &amp;amp; test environments!
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;The IntelliTrace diagnostic data adapter (DDA) and/or IntelliTrace.exe &lt;strong&gt;&lt;u&gt;can&lt;/u&gt;&lt;/strong&gt; be
used for test and debugging purposes:&lt;/em&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;As part of an interactive test or debugging session.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;As part of an automated test or debugging-data collection session that is authored
by a licensed user and triggered by the same or another licensed user.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
You can even share IntelliTrace files between two companies as long as both companies
are properly licensed!
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;IntelliTrace files may be shared among two or more companies as long as all users
capturing and debugging IntelliTrace files are licensed with either Visual Studio
2010 Ultimate or Visual Studio Test Professional 2010, depending on the activities
they are performing. For example, a company can share IntelliTrace files with an external
development consultant. Similarly. a company can use an external company for testing
purposes and debug IntelliTrace files provided by that vendor.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Here were the common scenarios mentioned in the licensing white paper.&amp;nbsp; See if
you happen to fit into one of them:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;&lt;font size="4"&gt;Example 1&lt;/font&gt;&lt;/strong&gt;: Finding a defect in a test environment
Company A is building a Web application. All the developers are licensed for Visual
Studio 2010 Ultimate with MSDN, and the testers are licensed with Visual Studio Test
Professional 2010 with MSDN. During a test run a defect is discovered in the test
environment that is difficult to reproduce in a development environment. The test
machines have previously been configured with the Visual Studio Test Agent 2010, which
includes the IntelliTrace DDA. The tester uses the Microsoft Test Manager to execute
the test case with the IntelliTrace diagnostic data adapter (DDA) enabled. When the
defect is encountered, the tester files a new bug, with the IntelliTrace files from
each of the test machines is automatically attached to the bug. When a developer opens
the bug using Visual Studio Ultimate, he or she can open the IntelliTrace files and
step through the execution. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;&lt;font size="4"&gt;Example 2&lt;/font&gt;&lt;/strong&gt;: Working with an external consultant
In Example 1, Company A uses an external consultant to help with development. If the
external consultant is licensed for Visual Studio Ultimate, he or she can open and
debug the IntelliTrace files provided by Company A. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;&lt;font size="4"&gt;Example 3&lt;/font&gt;&lt;/strong&gt;: Working with an external test
vendor In Example 1, Company A uses Company B as an outsourced test vendor. The two
companies can work together using IntelliTrace as long as all developers at Company
A and all testers at company B are licensed appropriately.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I’m not sure what the minimal &lt;em&gt;&lt;u&gt;technical&lt;/u&gt;&lt;/em&gt; footprint is to get IntelliTrace.exe
to collect an iTrace file just yet but my answer right now will be to have one of
these installed:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Visual Studio 2010 Ultimate&lt;/li&gt;
&lt;li&gt;
Visual Studio 2010 Test Professional&lt;/li&gt;
&lt;li&gt;
Visual Studio 2010 Test Agents (additional software) &amp;lt;--- probably the smallest
impact to a system&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
If I find out some more information about this scenario, then I’ll be putting together
a future blog post!
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Take care,
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Ed Blankenship&lt;/strong&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edsquared.com/aggbug.ashx?id=1be0367f-bd0b-4846-9ee5-48950cff4269" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Brought to you by Ed Blankenship and Ed Kisinger at EdSquared.com</description>
      <comments>http://www.edsquared.com/CommentView,guid,1be0367f-bd0b-4846-9ee5-48950cff4269.aspx</comments>
      <category>IntelliTrace</category>
      <category>Licensing</category>
      <category>VSTS</category>
      <category>VSTS Developing</category>
      <category>VSTS Testing</category>
    </item>
  </channel>
</rss>