2011-11-25 4 views
5

Estoy escribiendo una aplicación que se integra con TFS a través de los SDK oficiales para automatizar y dar soporte a varias acciones comunes. Aunque la mayor parte es automatización y la API TFS expone casi todo lo que necesito, algunas de las acciones necesitan la intervención del usuario, por lo que necesito mostrar información al usuario.Mostrar ventanas de historial de elementos con TFS SDK

He encontrado métodos como Difference.VisualDiffItems que me permiten comparar fácilmente archivos visualmente utilizando la misma interfaz de usuario que utiliza Visual Studio. También necesito mostrar un historial de elementos (incluyendo ramas, cambiar el nombre, etc.) y me encantaría usar una IU integrada en lugar de tener que escribir la mía. La IU del historial de elementos es en realidad bastante compleja y pensé que MS la habría proporcionado en el SDK, pero parece que no puedo encontrarla.

¿Alguien puede confirmar que el TFS SDK no proporciona los métodos necesarios para visualizar el historial de un elemento o apuntarme en la dirección correcta si lo hace?

Respuesta

4

Al utilizar ILSpy en la utilidad TF.exe, puede ver que el control de la interfaz de usuario que se utiliza para ver el historial es Microsoft.TeamFoundation.VersionControl.Controls.DialogHistory. Esta clase es interna, de modo que a menos que esté satisfecho con el uso de la reflexión, no podrá crear instancias de este objeto usted mismo.

En realidad, la búsqueda de ese nombre de la clase trajo hasta esta página social.msdn: http://social.msdn.microsoft.com/Forums/ar/tfsversioncontrol/thread/9a10473e-d381-4e83-bde9-dd423f430feb

La una línea que pueden ser más relevantes para su pregunta es de Buck Hodges: "Usted tiene la opción de acérquese a ellos mediante la reflexión. Dado que no son públicos, podemos cambiarlos de versión a versión (incluidos los paquetes de servicio), por lo que acepta el riesgo de que se rompan "

La alternativa sería llamar a TF con un línea de comando directamente (al hacer referencia a TF.exe directamente y cargarlo en el mismo proceso O mediante s tarting un nuevo proceso con la línea de comando requerida). En cualquier caso, es probable que deba trabajar con los mensajes de error que se entregan a stdout, donde puede que los desee o no.

Espero que esto ayude.

4

La respuesta de Jonno es muy útil y puntual. Seguí adelante y creé un fragmento de código para usar el reflejo para invocar el diálogo (funciona para mí en TFS 2010 SP1). Con suerte, será útil para otra persona con la misma pregunta. Como se indicó anteriormente, no se garantiza que este método funcione sin cambios en ninguna versión 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[]{}); 
    } 

} 
Cuestiones relacionadas