【问题标题】:Show item history windows with TFS SDK使用 TFS SDK 显示项目历史记录窗口
【发布时间】:2012-08-28 02:40:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net tfs tfs-sdk


    【解决方案1】:

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

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      Jonno 的回答非常有帮助且准确。我继续创建了一个代码 sn-p 用于使用反射来调用对话框(在 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[]{});
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多