2009-06-16 11 views
7

Vorrei utilizzare le macro per pubblicare il mio progetto di applicazione web. Il piccolo problema è che DTE.ExecuteCommand viene eseguito in modo asincrono e devo attendere il completamento del comando.DTE.ExecuteCommand e attendere

Esempio:

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 

c'è qualche oggetto di sincronizzazione o di informazioni sullo stato del comando eseguito?

Grazie

+1

Sto anche alla ricerca di una risposta a questo. Mi piacerebbe essere in grado di eseguire una serie di istruzioni ExecuteCommand in una macro, ma in modo sincrono. –

+0

Purtroppo non so una soluzione :( – TcKs

risposta

5

Hey ragazzi, se siete ancora alla ricerca di una risposta a questo provare questo.

Collegati agli eventi di pubblicazione e su una chiamata push riuscita il tuo comando esterno. Sto facendo una cosa simile con la costruzione della soluzione e poi l'esecuzione del runner di test MSpec (blog post).

Per fare ciò è necessario aggiungere un hook per PublishEvents_OnPublishDone. A tale scopo, andando al modulo EnvironmentEvents e Addin il seguente:

<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 

Se si desidera solo eseguire il comando esterno a volte fare qualcosa di simile. Crea il tuo macro in questo modo:

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 

Poi nel EnvironmentEvents aggiungere questo: (Nota: CustomMacros è il nome del modulo in cui si inserisce il codice di cui sopra)

<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 

Che dovrebbe farlo.

Cheers,

Kyle

+0

Sembra buono, lo proverò. – TcKs

+0

Iw funziona per la pubblicazione (+1), ma non risolve gli altri comandi (non sono sicuro, c'è un soluzione) Tuttavia, thans :) – TcKs

+0

Si potrebbe andare ghetto con l'altro e creare una sorta di meccanismo basato su file per determinare cosa fare. In pratica, chiama il tuo comando esterno utilizzando un file batch che viene eseguito in modo sincrono e alla fine rilascia un file temporaneo da qualche parte. Di nuovo in VS crea un sub che poi cerca che quel file esista. Una volta fatto andare avanti e sparare le altre cose di macro e quindi ripulire il file. Forse un po 'ma potrebbe funzionare. –

2

Ecco come è possibile compilare un singolo file, e quindi collegare l'intera soluzione per esempio:

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 
Problemi correlati