2009-06-16 5 views
7

Je voudrais utiliser des macros pour publier mon projet d'application Web. Le petit problème est que DTE.ExecuteCommand s'exécute de manière asynchrone et que j'ai besoin d'attendre que la commande soit terminée.DTE.ExecuteCommand et wait

Exemple:

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 

Y at-il un objet de synchronisation ou des informations sur l'état de commande exécutée?

Merci

+1

Je cherche aussi une réponse à cela. J'aimerais pouvoir exécuter une série d'instructions ExecuteCommand dans une macro, mais de manière synchrone. –

+0

Malheureusement je ne sais pas encore une solution :( – TcKs

Répondre

5

Hé les gars, si vous êtes toujours à la recherche d'une réponse à celle-ci essayer. Liez dans les événements de publication et sur un appel réussi avec succès votre commande externe. Je fais une chose similaire avec la construction de la solution, puis le tir du lanceur de test MSpec (blog post).

Pour cela, vous devez ajouter un hook pour PublishEvents_OnPublishDone. Pour ce faire, en allant au EnvironmentEvents Module et Addin les éléments suivants:

<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 vous voulez seulement exécuter la commande externe font parfois quelque chose comme ça. Créez votre macro comme ceci:

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 

Puis en EnvironmentEvents ajouter ceci: (Note: CustomMacros est le nom du module où vous mettez le code ci-dessus)

<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 

Cela devrait le faire.

Cheers,

Kyle

+0

Il semble bon, je vais l'essayer – TcKs

+0

Iw fonctionne pour publier (+1), mais il ne résout pas les autres commandes (je ne suis pas sûr, il y a un solution) Cependant, thans :) – TcKs

+0

Vous pouvez aller ghetto avec votre autre et créer une sorte de mécanisme basé sur les fichiers pour déterminer ce qu'il faut faire. Appelez fondamentalement votre commande externe en utilisant un fichier de commandes qui s'exécute de manière synchrone et qui à la fin supprime un fichier temporaire quelque part. De retour dans VS, créez un sous-marin qui surveille l'existence de ce fichier. Une fois que cela se produit, éteignez vos autres macros et nettoyez le fichier. Peut-être un peu beaucoup mais pourrait fonctionner. –

2

Voici comment vous pouvez compiler seul fichier, puis lier solution complète par exemple:

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 
Questions connexes