{"id":533,"date":"2012-01-25T16:05:56","date_gmt":"2012-01-25T16:05:56","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/buckh\/2012\/01\/25\/how-to-get-the-tfs-objects-used-in-our-own-ui-integration\/"},"modified":"2012-01-25T16:05:56","modified_gmt":"2012-01-25T16:05:56","slug":"how-to-get-the-tfs-objects-used-in-our-own-ui-integration","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/buckh\/how-to-get-the-tfs-objects-used-in-our-own-ui-integration\/","title":{"rendered":"How to get the TFS objects used in our own UI integration"},"content":{"rendered":"<p>Philip, a dev on version control, recently helped with a question on how to get the TFS objects we use in our UI.&nbsp; I thought I&rsquo;d post since others may find it useful.<\/p>\n<blockquote>\n<p>We recently had a request from a customer for a VS add-in that would be able to access the same TfsTeamProjectCollection and VersionControlServer objects that our own UI integration (such as the Team Explorer and Pending Changes toolwindow) are using. In this particular case the customer wanted to hook the BeforeCheckinPendingChange event from the VersionControlServer object and take a specific action when that occurred. But the framework shown in this piece of sample code is generic &#8212; you can use it to get the very same VersionControlServer or WorkItemStore object that our integration is using to connect to TFS.<\/p>\n<p>The trick here is to hook the ProjectContextChanged event on the TeamFoundationServerExt extensibility object. While that extensibility point won&#8217;t give you the TfsTeamProjectCollection object directly, we can ask the TfsTeamProjectCollectionFactory&#8217;s static GetTeamProjectCollection method to retrieve it from a runtime cache. The cache is keyed by URI &#8212; which (handily) is provided by TeamFoundationServerExt. By the time the ProjectContextChanged event fires, the ActiveProjectContext.DomainUri property has already been updated.<\/p>\n<p>All the services in the TFS client object model are owned by the TfsTeamProjectCollection. Once we have it, we can call GetService to request the VersionControlServer object. There&#8217;s only one per TfsTeamProjectCollection; the same holds true for WorkItemStore, IBuildServer, or any of the other client object model services you may be familiar with.<\/p>\n<p>Happy extending!<\/p>\n<\/blockquote>\n<p><span style=\"color: blue\">using <\/span>System;     <br><span style=\"color: blue\">using <\/span>System.Diagnostics;     <br><span style=\"color: blue\">using <\/span>System.Windows.Forms;     <br><span style=\"color: blue\">using <\/span>Extensibility;     <br><span style=\"color: blue\">using <\/span>EnvDTE;     <br><span style=\"color: blue\">using <\/span>EnvDTE80;     <br><span style=\"color: blue\">using <\/span>Microsoft.TeamFoundation.Common;     <br><span style=\"color: blue\">using <\/span>Microsoft.TeamFoundation.Client;     <br><span style=\"color: blue\">using <\/span>Microsoft.TeamFoundation.VersionControl.Common;     <br><span style=\"color: blue\">using <\/span>Microsoft.TeamFoundation.VersionControl.Client;     <br><span style=\"color: blue\">using <\/span>Microsoft.VisualStudio.TeamFoundation;     <br><span style=\"color: blue\">using <\/span>Microsoft.VisualStudio.TeamFoundation.VersionControl;     <\/p>\n<p><span style=\"color: blue\">namespace <\/span>MyAddin1     <br>{     <br>&nbsp;&nbsp;&nbsp; <span style=\"color: gray\">\/\/\/ &lt;summary&gt;<\/span><span style=\"color: green\">The object for implementing an Add-in.<\/span><span style=\"color: gray\">&lt;\/summary&gt;      <br>&nbsp;&nbsp;&nbsp; \/\/\/ &lt;seealso class=&#8217;IDTExtensibility2&#8242; \/&gt;       <br>&nbsp;&nbsp;&nbsp; <\/span><span style=\"color: blue\">public class <\/span><span style=\"color: #2b91af\">Connect <\/span>: IDTExtensibility2     <br>&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: gray\">\/\/\/ &lt;summary&gt;<\/span><span style=\"color: green\">Implements the constructor for the Add-in object. Place your initialization code within this method.<\/span><span style=\"color: gray\">&lt;\/summary&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span style=\"color: blue\">public <\/span>Connect()     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: gray\">\/\/\/ &lt;summary&gt;<\/span><span style=\"color: green\">Implements the OnConnection method of the IDTExtensibility2 interface. Receives notification that the Add-in is being loaded.<\/span><span style=\"color: gray\">&lt;\/summary&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;param term=&#8217;application&#8217;&gt;<\/span><span style=\"color: green\">Root object of the host application.<\/span><span style=\"color: gray\">&lt;\/param&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;param term=&#8217;connectMode&#8217;&gt;<\/span><span style=\"color: green\">Describes how the Add-in is being loaded.<\/span><span style=\"color: gray\">&lt;\/param&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;param term=&#8217;addInInst&#8217;&gt;<\/span><span style=\"color: green\">Object representing this Add-in.<\/span><span style=\"color: gray\">&lt;\/param&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;seealso class=&#8217;IDTExtensibility2&#8242; \/&gt;       <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span style=\"color: blue\">public void <\/span>OnConnection(<span style=\"color: blue\">object <\/span>application, ext_ConnectMode connectMode, <span style=\"color: blue\">object <\/span>addInInst, <span style=\"color: blue\">ref <\/span><span style=\"color: #2b91af\">Array <\/span>custom)     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _applicationObject = (DTE2)application;     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _addInInstance = (AddIn)addInInst;     <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">try      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>{     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_tfsExt = _applicationObject.GetObject(<span style=\"color: #a31515\">&#8220;Microsoft.VisualStudio.TeamFoundation.TeamFoundationServerExt&#8221;<\/span>) <span style=\"color: blue\">as <\/span>TeamFoundationServerExt;     <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">if <\/span>(<span style=\"color: blue\">null <\/span>!= m_tfsExt)     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_tfsExt.ProjectContextChanged += <span style=\"color: blue\">new <\/span><span style=\"color: #2b91af\">EventHandler<\/span>(m_tfsExt_ProjectContextChanged);     <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">if <\/span>(<span style=\"color: blue\">null <\/span>!= m_tfsExt.ActiveProjectContext)     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: green\">\/\/ Run the event handler without the event actually having fired, so we pick up the initial state.      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>m_tfsExt_ProjectContextChanged(<span style=\"color: blue\">null<\/span>, <span style=\"color: #2b91af\">EventArgs<\/span>.Empty);     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">catch <\/span>(<span style=\"color: #2b91af\">Exception <\/span>ex)     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show(ex.Message);     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: gray\">\/\/\/ &lt;summary&gt;<\/span><span style=\"color: green\">Implements the OnDisconnection method of the IDTExtensibility2 interface. Receives notification that the Add-in is being unloaded.<\/span><span style=\"color: gray\">&lt;\/summary&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;param term=&#8217;disconnectMode&#8217;&gt;<\/span><span style=\"color: green\">Describes how the Add-in is being unloaded.<\/span><span style=\"color: gray\">&lt;\/param&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;param term=&#8217;custom&#8217;&gt;<\/span><span style=\"color: green\">Array of parameters that are host application specific.<\/span><span style=\"color: gray\">&lt;\/param&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;seealso class=&#8217;IDTExtensibility2&#8242; \/&gt;       <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span style=\"color: blue\">public void <\/span>OnDisconnection(ext_DisconnectMode disconnectMode, <span style=\"color: blue\">ref <\/span><span style=\"color: #2b91af\">Array <\/span>custom)     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: green\">\/\/ Unhook the ProjectContextChanged event handler.      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span style=\"color: blue\">if <\/span>(<span style=\"color: blue\">null <\/span>!= m_tfsExt)     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_tfsExt.ProjectContextChanged -= <span style=\"color: blue\">new <\/span><span style=\"color: #2b91af\">EventHandler<\/span>(m_tfsExt_ProjectContextChanged);     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_tfsExt = <span style=\"color: blue\">null<\/span>;     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: gray\">\/\/\/ &lt;summary&gt;<\/span><span style=\"color: green\">Implements the OnAddInsUpdate method of the IDTExtensibility2 interface. Receives notification when the collection of Add-ins has changed.<\/span><span style=\"color: gray\">&lt;\/summary&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;param term=&#8217;custom&#8217;&gt;<\/span><span style=\"color: green\">Array of parameters that are host application specific.<\/span><span style=\"color: gray\">&lt;\/param&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;seealso class=&#8217;IDTExtensibility2&#8242; \/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span style=\"color: blue\">public void <\/span>OnAddInsUpdate(<span style=\"color: blue\">ref <\/span><span style=\"color: #2b91af\">Array <\/span>custom)     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: gray\">\/\/\/ &lt;summary&gt;<\/span><span style=\"color: green\">Implements the OnStartupComplete method of the IDTExtensibility2 interface. Receives notification that the host application has completed loading.<\/span><span style=\"color: gray\">&lt;\/summary&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;param term=&#8217;custom&#8217;&gt;<\/span><span style=\"color: green\">Array of parameters that are host application specific.<\/span><span style=\"color: gray\">&lt;\/param&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;seealso class=&#8217;IDTExtensibility2&#8242; \/&gt;       <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span style=\"color: blue\">public void <\/span>OnStartupComplete(<span style=\"color: blue\">ref <\/span><span style=\"color: #2b91af\">Array <\/span>custom)     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: gray\">\/\/\/ &lt;summary&gt;<\/span><span style=\"color: green\">Implements the OnBeginShutdown method of the IDTExtensibility2 interface. Receives notification that the host application is being unloaded.<\/span><span style=\"color: gray\">&lt;\/summary&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;param term=&#8217;custom&#8217;&gt;<\/span><span style=\"color: green\">Array of parameters that are host application specific.<\/span><span style=\"color: gray\">&lt;\/param&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;seealso class=&#8217;IDTExtensibility2&#8242; \/&gt;       <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span style=\"color: blue\">public void <\/span>OnBeginShutdown(<span style=\"color: blue\">ref <\/span><span style=\"color: #2b91af\">Array <\/span>custom)     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: gray\">\/\/\/ &lt;summary&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ <\/span><span style=\"color: green\">Raised by the TFS Visual Studio integration package when the active project context changes.      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span style=\"color: gray\">\/\/\/ &lt;\/summary&gt;      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;param name=&#8221;sender&#8221;&gt;&lt;\/param&gt;       <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;param name=&#8221;e&#8221;&gt;&lt;\/param&gt;       <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span style=\"color: blue\">private void <\/span>m_tfsExt_ProjectContextChanged(<span style=\"color: #2b91af\">Object <\/span>sender, <span style=\"color: #2b91af\">EventArgs <\/span>e)     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">try      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>{     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">if <\/span>(<span style=\"color: blue\">null <\/span>!= m_tfsExt.ActiveProjectContext &amp;&amp;     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; !<span style=\"color: #2b91af\">String<\/span>.IsNullOrEmpty(m_tfsExt.ActiveProjectContext.DomainUri))     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SwitchToTfs(TfsTeamProjectCollectionFactory.GetTeamProjectCollection(<span style=\"color: blue\">new <\/span>Uri(m_tfsExt.ActiveProjectContext.DomainUri)));     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">else      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>{     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SwitchToTfs(<span style=\"color: blue\">null<\/span>);     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">catch <\/span>(<span style=\"color: #2b91af\">Exception <\/span>ex)     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show(ex.Message);     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">private void <\/span>SwitchToTfs(TfsTeamProjectCollection tfs)     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">if <\/span>(<span style=\"color: #2b91af\">Object<\/span>.ReferenceEquals(m_tfs, tfs))     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: green\">\/\/ No work to do; could be a team project switch only      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span style=\"color: blue\">return<\/span>;     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">if <\/span>(<span style=\"color: blue\">null <\/span>!= m_tfs)     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_tfs.GetService&lt;VersionControlServer&gt;().BeforeCheckinPendingChange -= <span style=\"color: blue\">new <\/span>ProcessingChangeEventHandler(VersionControlServer_BeforeCheckinPendingChange);     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_tfs = <span style=\"color: blue\">null<\/span>;     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">if <\/span>(<span style=\"color: blue\">null <\/span>!= tfs)     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_tfs = tfs;     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_tfs.GetService&lt;VersionControlServer&gt;().BeforeCheckinPendingChange += <span style=\"color: blue\">new <\/span>ProcessingChangeEventHandler(VersionControlServer_BeforeCheckinPendingChange);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">private void <\/span>VersionControlServer_BeforeCheckinPendingChange(<span style=\"color: #2b91af\">Object <\/span>sender, ProcessingChangeEventArgs e)     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">if <\/span>(<span style=\"color: blue\">null <\/span>!= e.PendingChange &amp;&amp;     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; !<span style=\"color: #2b91af\">String<\/span>.IsNullOrEmpty(e.PendingChange.ServerItem))     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show(<span style=\"color: #a31515\">&#8220;About to check in: &#8221; <\/span>+ e.PendingChange.ServerItem);     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">private <\/span>DTE2 _applicationObject;     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">private <\/span>AddIn _addInInstance;     <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">private <\/span>TeamFoundationServerExt m_tfsExt;     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: blue\">private <\/span>TfsTeamProjectCollection m_tfs;     <br>&nbsp;&nbsp;&nbsp; }     <br>}     <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Philip, a dev on version control, recently helped with a question on how to get the TFS objects we use in our UI.&nbsp; I thought I&rsquo;d post since others may find it useful. We recently had a request from a customer for a VS add-in that would be able to access the same TfsTeamProjectCollection and [&hellip;]<\/p>\n","protected":false},"author":94,"featured_media":10268,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[8,11,15],"class_list":["post-533","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-team-foundation","tag-tfs-2010","tag-tfs-api"],"acf":[],"blog_post_summary":"<p>Philip, a dev on version control, recently helped with a question on how to get the TFS objects we use in our UI.&nbsp; I thought I&rsquo;d post since others may find it useful. We recently had a request from a customer for a VS add-in that would be able to access the same TfsTeamProjectCollection and [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/posts\/533","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/users\/94"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/comments?post=533"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/posts\/533\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/media\/10268"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/media?parent=533"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/categories?post=533"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/tags?post=533"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}