我正在编写一个通过官方SDK与TFS集成的应用程序,以自动化和支持各种常见操作。虽然大部分都是自动化,而且TFS API几乎暴露了我需要的一切,但是一些操作需要用户干预,所以我需要向用户显示信息。
我找到了诸如Difference.VisualDiffItems
之类的方法,这些方法允许我使用Visual Studio使用的相同UI轻松地直观地比较文件。我还需要显示项目的历史记录(包括分支,重命名等),我很乐意使用内置的UI而不必编写自己的UI。项目历史UI实际上非常复杂,我认为MS会在SDK中提供它,但我似乎无法找到它。
任何人都可以确认TFS SDK没有提供可视化项目历史记录的必要方法,或者指出方向正确吗?
答案 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[]{});
}
}