<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Shai Raiten&amp;#39;s Blog : .NET 3.5, Source Control, Development, DEV</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/tags/.NET+3.5/Source+Control/Development/DEV/default.aspx</link><description>Tags: .NET 3.5, Source Control, Development, DEV</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>How To Create Custom Check-In Policy</title><link>http://blogs.microsoft.co.il/blogs/shair/archive/2008/09/21/how-to-create-custom-check-in-policy.aspx</link><pubDate>Sun, 21 Sep 2008 16:36:46 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:143126</guid><dc:creator>Shai Raiten</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/shair/rsscomments.aspx?PostID=143126</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/shair/archive/2008/09/21/how-to-create-custom-check-in-policy.aspx#comments</comments><description>&lt;h1&gt;How To Create Custom Check-In Policy&lt;/h1&gt; &lt;p&gt;Create a new Visual C# class library project. &lt;br /&gt;Add an assembly reference to &lt;b&gt;System.Windows.Forms.dll&lt;/b&gt;. You use this assembly to display message boxes. &lt;br /&gt;Add an assembly reference to &lt;b&gt;Microsoft.TeamFoundation.VersionControl.Client.dll.&lt;/b&gt; By default, this is installed in the following folder:\Program Files\Visual Studio 2008 Team Foundation Server\Tools &lt;br /&gt;Replace your skeleton class code implementation with the following source. Note that the class derives from the &lt;b&gt;PolicyBase&lt;/b&gt; base class and is marked as serializable.&lt;/p&gt; &lt;p&gt;Implement abstract class for &amp;#39;PolicyBase&amp;#39;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:94.2%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;height:100px;background-color:#f4f4f4;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Description
    {
        get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;Remind users to add meaningful comments to their checkins&amp;quot;&lt;/span&gt;; 
    }
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is a string that is stored with the policy definition on the source control server. If a user does not have the policy plug-in installed, this string is displayed.&lt;br /&gt;You can use this to explain to the user how they should install the policy plug-in.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; InstallationInstructions
{
    get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;To install this policy, read InstallInstructions.txt.&amp;quot;&lt;/span&gt;; }
}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;This string identifies the type of policy.&lt;br /&gt;It is displayed in the policy list when you add a new policy to a Team Project. 
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Type
    {
        get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;Custom Checkin Policy&amp;quot;&lt;/span&gt;; }
    }
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;This string is a description of the type of policy. It is displayed when you select the policy in the Add Check-in Policy dialog box. 
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; TypeDescription
    {
        get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;This policy will prompt the user to decide whether or not they should be allowed to check in.&amp;quot;&lt;/span&gt;; }
    }
&lt;/pre&gt;&lt;/div&gt;This method is called by the policy framework when you create a new check-in policy or edit an existing check-in policy. &lt;br /&gt;You can use this to display a UI specific to this policy type allowing the user to change the parameters of the policy. 
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; Edit(IPolicyEditArgs args)
   {
       &lt;span style="color:#008000;"&gt;// Do not need any custom configuration&lt;/span&gt;
       &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
   }
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;This method performs the actual policy evaluation. It is called by the policy framework at various points in time&lt;br /&gt;when policy should be evaluated. In this example, the method is invoked when various asyc events occur that may have&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; invalidated the current list of failures.&lt;br /&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; PolicyFailure[] Evaluate()
    {
        &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; proposedComment = PendingCheckin.PendingChanges.Comment;
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (String.IsNullOrEmpty(proposedComment))
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PolicyFailure[] {
                &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PolicyFailure(&lt;span style="color:#006080;"&gt;&amp;quot;Please provide some comments about your check-in&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;) };
        }
        &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PolicyFailure[0];
        }
    }
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;This method is called if the user double-clicks on a policy failure in the UI. In this case a message telling the user to supply some comments is displayed. 
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Activate(PolicyFailure failure)
    {
        MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;Please provide comments for your check-in.&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;How to fix your policy failure&amp;quot;&lt;/span&gt;);
    }
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;This method is called if the user presses F1 when a policy failure is active in the UI. In this example, a message box is displayed. 
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DisplayHelp(PolicyFailure failure)
    {
        MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;This policy helps you to remember to add comments to your check-ins.&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;Prompt Policy Help&amp;quot;&lt;/span&gt;);
    }
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;u&gt;&lt;strong&gt;The Full Code:&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.24%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;height:291px;background-color:#f4f4f4;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Windows.Forms;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Microsoft.TeamFoundation.VersionControl.Client;

[Serializable]
&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CheckForCommentsPolicy : PolicyBase
{
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Description
    {
        get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;Remind users to add meaningful comments to their checkins&amp;quot;&lt;/span&gt;; 

    }

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; InstallationInstructions
    {
        get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;To install this policy, read InstallInstructions.txt.&amp;quot;&lt;/span&gt;; }
    }

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Type
    {
        get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;Custom Checkin Policy&amp;quot;&lt;/span&gt;; }
    }

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; TypeDescription
    {
        get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;This policy will prompt the user to decide whether or not they should be allowed to check in.&amp;quot;&lt;/span&gt;; }
    }

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; Edit(IPolicyEditArgs args)
    {
        &lt;span style="color:#008000;"&gt;// Do not need any custom configuration&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
    }

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; PolicyFailure[] Evaluate()
    {
        &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; proposedComment = PendingCheckin.PendingChanges.Comment;
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (String.IsNullOrEmpty(proposedComment))
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PolicyFailure[] {
                &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PolicyFailure(&lt;span style="color:#006080;"&gt;&amp;quot;Please provide some comments about your check-in&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;) };
        }
        &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PolicyFailure[0];
        }
    }

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Activate(PolicyFailure failure)
    {
        MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;Please provide comments for your check-in.&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;How to fix your policy failure&amp;quot;&lt;/span&gt;);
    }

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DisplayHelp(PolicyFailure failure)
    {
        MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;This policy helps you to remember to add comments to your check-ins.&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;Prompt Policy Help&amp;quot;&lt;/span&gt;);
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;u&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;Register your custom Checkin Policy :&lt;/font&gt;&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start Regedit.exe and locate the following key HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\9.0\TeamFoundation\SourceControl\Checkin Policies &lt;br /&gt;The registered policies are listed in the right pane. 
&lt;li&gt;Right-click in the right-hand pane, point to &lt;b&gt;New,&lt;/b&gt; and then click &lt;b&gt;String Value&lt;/b&gt;. 
&lt;li&gt;Type the name of your custom policy dynamic link library (DLL), without the DLL extension; &lt;b&gt;Custom Checkin Policy&lt;/b&gt; in the above example.&lt;br /&gt;&lt;b&gt;Important&lt;/b&gt;: The new string name must match your DLL filename exactly, without the DLL extension. 
&lt;li&gt;Double-click the new string value and set its value to the fully qualified path and filename to the .dll containing your custom policy. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Now you can add your new check-in policy to Team Project.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=143126" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Team+Build/default.aspx">Team Build</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Team+System/default.aspx">Team System</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS+Administration/default.aspx">TFS Administration</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS+Utilities/default.aspx">TFS Utilities</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Addins/default.aspx">Addins</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/Source+Control/default.aspx">Source Control</category><category domain="http://blogs.microsoft.co.il/blogs/shair/archive/tags/DEV/default.aspx">DEV</category></item></channel></rss>