5

我正在编写一个通过官方 SDK 与 TFS 集成的应用程序,以自动化和支持各种常见操作。尽管其中大部分是自动化的,并且 TFS API 几乎公开了我需要的所有内容,但有些操作需要用户干预,因此我需要向用户显示信息。

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

任何人都可以确认 TFS SDK 没有提供可视化项目历史的必要方法,或者如果提供的话,可以为我指明正确的方向吗?

4

2 回答 2

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 并将其加载到同一进程中,或者使用所需的命令行启动新进程)。在任何一种情况下,您可能都必须处理传递到您可能需要或不希望它们的标准输出的错误消息。

希望这可以帮助。

于 2011-12-21T05:20:46.450 回答
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[]{});
    }

}
于 2012-08-27T18:40:42.340 回答