代码之家  ›  专栏  ›  技术社区  ›  Ian manuel aldana

在Visual Studio外部使用版本控制文本资源管理器

  •  0
  • Ian manuel aldana  · 技术社区  · 15 年前

    我正在开发一个TFS工具来帮助我们公司的开发人员。

    这个工具需要能够像在源代码管理资源管理器中那样“浏览”TFS服务器。我相信通过使用versioncontrolext.explorer.selecteditems,将弹出一个用户界面,允许用户浏览TFS服务器(如果我错了,请纠正我)。

    但是,只有在Visual Studio(又称插件)内部开发时,才能访问VersionControlExt。不幸的是,我正在开发一个不能在vs.

    所以问题是,我可以在Visual Studio之外使用版本控制文本吗?如果是,怎么办?

    Here's 尝试在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);
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Patrick S    14 年前
    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 });
            }
    
        2
  •  0
  •   Ian manuel aldana    14 年前

    结果我不需要那个探险家。

    我通过使用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);
                    }