2009-06-16 96 views
7

我想用宏來發布我的webapplication項目。小問題是,DTE.ExecuteCommand異步運行,我需要等待命令完成。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 

有一些同步對象或約執行的命令的狀態信息?

感謝

+1

我也在尋找一個答案。我希望能夠在宏中同時運行一系列ExecuteCommand語句。 – 2009-08-20 14:28:55

+0

不幸的是,我仍然不知道解決方案:( – TcKs 2009-08-20 16:08:26

回答

5

嘿,夥計們,如果你還在尋找一個答案,這一個嘗試。

綁定到發佈事件併成功推送您的外部命令。我正在構建解決方案,然後開始MSpec測試運行器(blog post)做類似的事情。

爲此,您需要爲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

這裏是你如何編譯單個文件,然後鏈接整體解決方案,例如:

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