使用TFS SDK显示项目历史记录窗口

时间:2011-11-25 10:43:15

标签: .net tfs tfs-sdk

我正在编写一个通过官方SDK与TFS集成的应用程序,以自动化和支持各种常见操作。虽然大部分都是自动化,而且TFS API几乎暴露了我需要的一切,但是一些操作需要用户干预,所以我需要向用户显示信息。

我找到了诸如Difference.VisualDiffItems之类的方法,这些方法允许我使用Visual Studio使用的相同UI轻松地直观地比较文件。我还需要显示项目的历史记录(包括分支,重命名等),我很乐意使用内置的UI而不必编写自己的UI。项目历史UI实际上非常复杂,我认为MS会在SDK中提供它,但我似乎无法找到它。

任何人都可以确认TFS SDK没有提供可视化项目历史记录的必要方法,或者指出方向正确吗?

2 个答案:

答案 0 :(得分:4)

在TF.exe实用程序上使用ILSpy,您可以看到用于查看历史记录的UI控件是Microsoft.TeamFoundation.VersionControl.Controls.DialogHistory。这个类是内部的,所以除非你对使用反射感到满意,否则你将无法自己实例化这个对象。

实际上,搜索该类名称会带来这个social.msdn页面: http://social.msdn.microsoft.com/Forums/ar/tfsversioncontrol/thread/9a10473e-d381-4e83-bde9-dd423f430feb

可能与您的问题最相关的一行来自Buck Hodges: “您可以选择通过反思来获取它们。由于它们不公开,我们可能会在发布之间将其更改为发布(包括服务包),因此您可以接受被破坏的风险”

替代方法是直接使用命令行调用TF(通过直接引用TF.exe并在同一进程中加载​​它或通过启用需要命令行的新进程)。在任何一种情况下,您可能都必须使用传递给stdout的错误消息,您可能会或可能不想要它们。

希望这有帮助。

答案 1 :(得分:4)

Jonno的回答非常有用并且非常有用。我继续创建了一个代码片段,用于使用反射来调用对话框(在TFS 2010 SP1中适用于我)。希望它可以用于具有相同问题的其他人。如前所述,无法保证此方法在未来版本中不会发生任何变化。

public class TfsHistoryDialogWrapper
{
    private readonly Type _dialogHistoryType;
    private readonly object _historyDialogInstance;

    public TfsHistoryDialogWrapper(VersionControlServer versionControl, string historyItem, VersionSpec itemVersion, int itemDeletionId, RecursionType recursionType, VersionSpec versionFrom, VersionSpec versionTo, string userFilter, int maxVersions, bool? slotMode)
    {
        Assembly tfsAssembly = typeof(Microsoft.TeamFoundation.VersionControl.Controls.LocalPathLinkBox).Assembly;
        _dialogHistoryType = tfsAssembly.GetType("Microsoft.TeamFoundation.VersionControl.Controls.DialogHistory");

        _historyDialogInstance = _dialogHistoryType.GetConstructor(
                                BindingFlags.NonPublic | BindingFlags.Instance,
                                null, 
                                new Type[]{typeof(VersionControlServer), typeof(string), typeof(VersionSpec), typeof(int), typeof(RecursionType), typeof(VersionSpec), typeof(VersionSpec), typeof(string), typeof(int), typeof(bool?)},
                                null).Invoke(new object[]{ versionControl, historyItem, itemVersion, itemDeletionId, recursionType, versionFrom, versionTo, userFilter, maxVersions, slotMode });
    }

    public void ShowDialog()
    {
        _dialogHistoryType.GetMethod("ShowDialog", new Type[]{}).Invoke(_historyDialogInstance, new object[]{});
    }

}