2009-06-16 15 views
7

Me gustaría usar macros para publicar mi proyecto de aplicación web. El pequeño problema es que DTE.ExecuteCommand se ejecuta de forma asíncrona, y debo esperar hasta que el comando finalice.DTE.ExecuteCommand y espere

Ejemplo:

DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() 
    DTE.ActiveWindow.Object.GetItem("04 - Products\04 - Products.WSS").Select(vsUISelectionType.vsUISelectionTypeSelect) 
    DTE.ExecuteCommand("ClassViewContextMenus.ClassViewProject.Publish") 
    '// now I want copy (and overwrite) some files, but AFTER the publish 

¿Hay algún objeto de sincronización o información sobre el estado del comando ejecutado?

Gracias

+1

También estoy buscando una respuesta a esto. Me gustaría poder ejecutar una serie de instrucciones ExecuteCommand en una macro, pero sincrónicamente. –

+0

Desafortunadamente todavía no sé una solución :( – TcKs

Respuesta

5

Hola chicos, si todavía está buscando una respuesta a esta prueba esto.

Ate los eventos de publicación y en una llamada de inserción exitosa a su comando externo. Estoy haciendo algo similar al construir la solución y luego activar el corredor de prueba MSpec (blog post).

Para hacer esto, necesita agregar un gancho para PublishEvents_OnPublishDone. Hacer esto de ir al Módulo EnvironmentEvents y addin lo siguiente:

<System.contextStaticAttribute()> Public WithEvents PublishEvents As EnvDTE80.PublishEvents 

Private Sub PublishEvents_OnPublishDone(ByVal Success As Boolean) Handles PublishEvents.OnPublishDone 
    'call custom module sub here. 
End Sub 

Si sólo desea ejecutar el comando externo a veces hacer algo como esto. Crear la macro como esta:

Public runExternalCommandOnComplete As Boolean = False 

Sub PublishAndRunExternalCommand() 

    DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() 
    DTE.ActiveWindow.Object.GetItem("04 - Products\04 - Products.WSS").Select(vsUISelectionType.vsUISelectionTypeSelect) 
    DTE.ExecuteCommand("ClassViewContextMenus.ClassViewProject.Publish") 

    runExternalCommandOnComplete = True 

End Sub 

Luego, en EnvironmentEvents añadir lo siguiente: (Nota: CustomMacros es el nombre del módulo donde se coloca el código anterior)

<System.contextStaticAttribute()> Public WithEvents PublishEvents As EnvDTE80.PublishEvents 

Private Sub PublishEvents_OnPublishDone(ByVal Success As Boolean) Handles PublishEvents.OnPublishDone 
    CustomMacros.runExternalCommandOnComplete = False 
    'Where ExternalCommand1 matches the command you want to run 
    DTE.ExecuteCommand("Tools.ExternalCommand1") 
End Sub 

Eso debería hacerlo.

Saludos,

Kyle

+0

Se ve bien, lo intentaré. – TcKs

+0

Iw funciona para publicar (+1), pero no resuelve los otros comandos (no estoy seguro, hay un solución). Sin embargo, thans :) – TcKs

+0

Puede ir a ghetto con su otro y crear algún tipo de mecanismo basado en archivos para determinar qué hacer. Básicamente llame a su comando externo utilizando un archivo por lotes que se ejecuta de forma síncrona y al final coloca un archivo temporal en algún lugar. De vuelta en VS crea un sub que luego observa que ese archivo exista. Una vez que avanza y dispara tus otras cosas macro y luego limpia el archivo. Tal vez un poco demasiado, pero podría funcionar. –

2

Así es como se puede compilar una sola fila, y luego enlazar toda la solución, por ejemplo:

Dim WithEvents t As Timers.Timer 

Sub test() 
    DTE.ExecuteCommand("Build.Compile") 
    t = New Timers.Timer 
    t.Interval = 0.05 
    t.Start() 
End Sub 

Sub t_Elapsed(ByVal ee As Object, ByVal dd As Timers.ElapsedEventArgs) Handles t.Elapsed 

    If DTE.Solution.SolutionBuild.BuildState <> vsBuildState.vsBuildStateInProgress Then 
     t.Stop() 
     DTE.ExecuteCommand("Build.Link") 
    End If 

End Sub