Показывать историю окон с помощью TFS SDK - PullRequest
5 голосов
/ 25 ноября 2011

Я пишу приложение, которое интегрируется с TFS через официальные SDK для автоматизации и поддержки различных общих действий. Хотя в основном это автоматизация, а TFS API предоставляет практически все, что мне нужно, некоторые действия требуют вмешательства пользователя, поэтому мне нужно отображать информацию для пользователя.

Я нашел такие методы, как Difference.VisualDiffItems, которые позволяют мне легко сравнивать файлы визуально, используя тот же пользовательский интерфейс, который использует Visual Studio. Мне также нужно отобразить историю элемента (включая ветви, переименования и т. Д.), И я хотел бы использовать встроенный пользовательский интерфейс вместо того, чтобы писать свой собственный. Пользовательский интерфейс истории предметов на самом деле довольно сложный, и я подумал, что MS предоставит его в SDK, но я не могу его найти.

Может ли кто-нибудь подтвердить, что TFS SDK не предоставляет необходимых методов для визуализации истории элемента или указать мне правильное направление, если это так?

Ответы [ 2 ]

4 голосов
/ 27 августа 2012

Ответ Джонно очень полезен и точен. Я пошел дальше и создал фрагмент кода для использования отражения для вызова диалога (работает для меня в 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[]{});
    }

}
4 голосов
/ 21 декабря 2011

Используя ILSpy в утилите TF.exe, вы можете видеть, что для просмотра истории используется элемент управления пользовательского интерфейса Microsoft.TeamFoundation.VersionControl.Controls.DialogHistory. Этот класс является внутренним, поэтому, если вы не довольны использованием отражения, вы не сможете создать экземпляр этого объекта самостоятельно.

На самом деле, поиск этого имени класса вызвал эту страницу в social.msdn: http://social.msdn.microsoft.com/Forums/ar/tfsversioncontrol/thread/9a10473e-d381-4e83-bde9-dd423f430feb

Единственная строка, которая может быть наиболее релевантной вашему вопросу, от Бака Ходжеса: «У вас есть возможность получить к ним информацию путем размышления. Поскольку они не являются общедоступными, мы можем изменять их от выпуска к выпуску (включая пакеты обновления), поэтому вы принимаете на себя риск быть сломанным»

Альтернативой может быть непосредственный вызов TF из командной строки (путем прямой ссылки на файл TF.exe и загрузки его в тот же процесс ИЛИ путем запуска нового процесса с необходимой командной строкой). В любом случае вам, вероятно, придется работать с сообщениями об ошибках, доставляемыми на стандартный вывод, где вы можете или не хотите их получать.

Надеюсь, это поможет.

...