DTE.ExecuteCommand и ждать - PullRequest
       59

DTE.ExecuteCommand и ждать

8 голосов
/ 16 июня 2009

Я хотел бы использовать макросы для публикации своего проекта веб-приложения. Небольшая проблема в том, что DTE.ExecuteCommand запускается асинхронно, и мне нужно подождать, пока команда не будет выполнена.

Пример:

    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

Есть ли какой-либо объект синхронизации или информация о состоянии выполненной команды?

Ответы [ 2 ]

5 голосов
/ 06 октября 2009

Эй, ребята, если вы все еще ищете ответ на этот вопрос, попробуйте это.

Свяжитесь с событиями публикации и при успешном нажатии вызовите вашу внешнюю команду. Я делаю то же самое с созданием решения, а затем запускаю тестер MSpec ( сообщение в блоге ).

Для этого вам нужно добавить ловушку для PublishEvents_OnPublishDone. Сделайте это, зайдя в модуль EnvironmentEvents и добавив следующее:

<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

Если вы хотите запустить только внешнюю команду, иногда делайте что-то подобное. Создайте свой макрос так:

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

Затем в EnvironmentEvents добавьте это: (Примечание: CustomMacros - это имя модуля, в который вы поместили код выше)

<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

Это должно сделать это.

Приветствия

Кайл

2 голосов
/ 27 февраля 2010

Вот как вы можете скомпилировать один файл, а затем связать все решение, например:

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
...