2011-11-25 83 views
5

我正在編寫一個應用程序,通過官方SDK與TFS集成以自動化並支持各種常見操作。雖然它大部分是自動化,TFS API幾乎公開了我需要的一切,但有些操作需要用戶干預,所以我需要向用戶顯示信息。使用TFS SDK顯示項目歷史記錄窗口

我找到了方法,例如Difference.VisualDiffItems,這使我可以使用Visual Studio使用的相同UI以可視方式輕鬆比較文件。我還需要顯示一個項目的歷史(包括分支機構,重命名等),我很樂意使用內置的用戶界面,而不必編寫自己的用戶界面。項目歷史UI實際上相當複雜,我以爲MS會提供它在SDK中,但我似乎無法找到它。

任何人都可以確認TFS SDK沒有提供必要的方法來可視化項目的歷史記錄,或者如果它指向正確的方向嗎?

回答

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

的一條線,可能是最相關的問題是,從巴克霍奇斯: 「你可以選擇因爲它們不是公開的,所以我們可能會將它們從發佈版本更改爲發佈版本(包括服務包),因此您接受被破壞的風險「

另一種方法是用TF命令行直接引用(通過直接引用TF.exe並將其加載到相同的進程或s用所需的命令行開始一個新的進程)。無論哪種情況,您可能都必須處理將錯誤消息傳遞到標準輸出的地方,您可能會或可能不希望它們。

希望這會有所幫助。

4

喬諾的答案是非常有幫助和專注。我繼續創建了一個使用反射調用對話框的代碼片段(適用於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[]{}); 
    } 

} 
相關問題