2010-01-22 35 views
0

我正在開發一個TFS工具來協助我們公司的開發人員。在Visual Studio外部使用VersionControlExt.Explorer

這個工具需要能夠像在源代碼管理資源管理器中一樣「瀏覽」TFS服務器。我相信通過使用VersionControlExt.Explorer.SelectedItems,將彈出一個用戶界面,使用戶能夠瀏覽TFS服務器(如果我錯了,請糾正我)。

但是,只有在Visual Studio(又名插件)內開發時纔可以訪問VersionControlExt。不幸的是,我正在開發一個Windows應用程序,它贏得了VS.

所以問題是,我可以在Visual Studio之外使用VersionControlExt嗎?如果是,如何?

Here's上使用Changset詳細信息對話框的Visual Studio之外的企圖

string path = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
Assembly vcControls = Assembly.LoadFile(path + @"\Microsoft.TeamFoundation.VersionControl.Controls.dll"); 
Assembly vcClient = Assembly.LoadFile(path + @"\Microsoft.TeamFoundation.VersionControl.Client.dll"); 

Type dialogChangesetDetailsType = vcControls.GetType("Microsoft.TeamFoundation.VersionControl.Controls.DialogChangesetDetails",true); 
Type[] ctorTypes = new Type[3] {vcClient.GetType("Microsoft.TeamFoundation.VersionControl.Client.VersionControlSever"), 

vcClient.GetType("Microsoft.TeamFoundation.VersionControl.Client.Changeset"), typeof(System.Boolean)}; 

ConstructorInfo ctorInfo = dialogChangesetDetailsType.GetConstructor(ctorTypes); 
Object[] ctorObjects = new Object[3] {VersionControlHelper.CurrentVersionControlServer, uc.ChangeSet, true}; 
Object oDialog = ctorInfo.Invoke(ctorObjects); 
dialogChangesetDetailsType.InvokeMember("ShowDialog", BindingFlags.InvokeMethod, null, oDialog, null); 
+0

只是好奇,爲什麼不使用由微軟提供的網絡版本,包括在默認與TFS2010安裝以及:http://msdn.microsoft.com/en-us/teamsystem/bb980951.aspx 我很好奇,因爲我們有類似的情況,網絡版本沒有滿足什麼需求? – 2010-01-22 13:31:59

+0

也有計劃在我們的構建系統中加入這個工具。請注意,我們的構建系統是從1995年開始的,仍然使用批處理文件(而不是TFS構建系統)。 – Ian 2010-01-24 09:29:35

回答

0

原來,我並不真的需要資源管理器。

我通過使用TreeView控件和VersionControlServer.GetItems()完成了此操作。

下面的代碼片段:

 treeView.Sort(); //Alphabetically ordered 

     //Get Initial List of Projects 
     try 
     { 
      ItemSet itemSet = vcs.GetItems(@"$/", RecursionType.OneLevel); 

      foreach (Item item in itemSet.Items) 
      { 
       if (item.ServerItem == @"$/") //Ignore self 
        continue; 

       TreeNode node = new TreeNode(item.ServerItem, new TreeNode[] { new TreeNode() }); 
       node.Tag = item.ServerItem; 

       if (item.DeletionId != 0) 
        node.ForeColor = Color.Red; 

       treeView.Nodes.Add(node); 
      } 
     } 

然後,每次用戶展開節點,我得到的所有節點下的項目。

TreeNode curNode = e.Node; 
       curNode.FirstNode.Remove(); //Remove blank dummy node 


       ItemSet items = vcs.GetItems(curNode.Tag.ToString(), VersionSpec.Latest, RecursionType.OneLevel, DeletedState.Any, ItemType.Folder); 

       foreach (Item item in items.Items) 
       { 
        if (item.ServerItem == curNode.Tag.ToString()) //Ignore self 
         continue; 

        string Name = System.IO.Path.GetFileName(item.ServerItem); 

        TreeNode node = new TreeNode(Name, new TreeNode[] { new TreeNode() }); 
        node.Tag = item.ServerItem; 

        if (item.DeletionId != 0) 
         node.ForeColor = Color.Red; 

        curNode.Nodes.Add(node); 
       } 
1
public void ShowChangeSetDetails(Form owner, Changeset changeSet) 
     { 
      string path = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
      Assembly vcControls = Assembly.LoadFrom(path + @"\Microsoft.TeamFoundation.VersionControl.Controls.dll"); 
      Assembly vcClient = Assembly.LoadFrom(path + @"\Microsoft.TeamFoundation.VersionControl.Client.dll"); 

      Type dialogChangesetDetailsType = 
       vcControls.GetType("Microsoft.TeamFoundation.VersionControl.Controls.DialogChangesetDetails", true); 

      MethodInfo methodInfo = 
       dialogChangesetDetailsType.GetMethod(
        "ShowChangeset", 
        BindingFlags.Static | BindingFlags.NonPublic, 
        null, 
        new Type[] { typeof(IWin32Window), changeSet.VersionControlServer.GetType(), changeSet.GetType(), typeof(bool) }, 
        null); 
      methodInfo.Invoke(null, new object[] { owner, changeSet.VersionControlServer, changeSet, true }); 
     } 
相關問題