2011-11-25 13 views
5

Sto scrivendo un'app che si integra con TFS tramite gli SDK ufficiali per automatizzare e supportare varie azioni comuni. Sebbene la maggior parte di esso sia l'automazione e l'API TFS espone praticamente tutto ciò di cui ho bisogno, alcune delle azioni richiedono l'intervento dell'utente, quindi ho bisogno di visualizzare le informazioni all'utente.Mostra le finestre di cronologia degli articoli con TFS SDK

Ho trovato metodi come Difference.VisualDiffItems che mi consentono di confrontare facilmente i file visivamente utilizzando la stessa interfaccia utente utilizzata da Visual Studio. Devo anche visualizzare la cronologia di un articolo (compresi rami, rinomina, ecc.) E mi piacerebbe utilizzare un'interfaccia utente incorporata invece di dover scrivere la mia. L'interfaccia utente della cronologia degli articoli è in realtà piuttosto complessa e ho pensato che MS l'avrebbe fornita nell'SDK, ma non riesco a trovarlo.

Qualcuno può confermare che l'SDK TFS non fornisce i metodi necessari per visualizzare la cronologia di un articolo o indicarmi la direzione giusta se lo fa?

risposta

4

Utilizzando ILSpy sull'utilità TF.exe è possibile vedere che il controllo dell'interfaccia utente utilizzato per la cronologia delle visualizzazioni è Microsoft.TeamFoundation.VersionControl.Controls.DialogHistory. Questa classe è interna quindi, a meno che tu non sia felice di usare il riflesso, non sarai in grado di creare istantaneamente questo oggetto tu stesso.

In realtà, alla ricerca di quel nome della classe cresciuti questa pagina social.msdn: http://social.msdn.microsoft.com/Forums/ar/tfsversioncontrol/thread/9a10473e-d381-4e83-bde9-dd423f430feb

l'una linea che potrebbe essere più pertinente alla tua domanda è da Buck Hodges: "Si ha la possibilità di arrivare a loro attraverso la riflessione. Dal momento che non sono pubblici, possiamo cambiarli da rilascio a rilascio (inclusi i service pack), quindi si accetta il rischio di essere interrotti "

L'alternativa sarebbe chiamare TF con un riga di comando direttamente (facendo riferimento a TF.exe direttamente e caricandolo nello stesso processo OPPURE da s avanzare un nuovo processo con la riga di comando richiesta). In entrambi i casi, probabilmente dovrai lavorare con i messaggi di errore che vengono consegnati allo stdout, dove potresti o non vorresti.

Spero che questo aiuti.

4

La risposta di Jonno è molto utile e azzeccata. Sono andato avanti e ho creato uno snippet di codice per usare reflection per richiamare la finestra di dialogo (funziona per me in TFS 2010 SP1). Spero che sarà utile a qualcun altro con la stessa domanda. Come precedentemente affermato, questo metodo non è garantito per funzionare senza modifiche in qualsiasi versione futura.

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[]{}); 
    } 

} 
Problemi correlati