DTE.ExecuteCommand和等待

9
我希望使用宏来发布我的Web应用程序项目。问题在于,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语句。 - Todd Ropog
很遗憾,我仍然不知道解决方案 :( - TcKs
2个回答

5
如果您仍在寻找答案,请尝试以下方法。 将其与发布事件连接起来,成功推送后调用外部命令。我正在使用类似的方法构建解决方案,然后启动 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

那就可以了。


Iw适用于发布(+1),但它并不能解决其他命令(我不确定是否有解决方案)。不过还是谢谢 :) - TcKs
你可以在另一个方面采用一些“非正式”的方式,创建某种基于文件的机制来确定要做什么。基本上,使用批处理文件调用外部命令,该命令同步运行,并在最后在某个地方放置一个临时文件。回到VS中,创建一个子程序来监视该文件是否存在。一旦存在,就可以启动其他宏操作,然后清理文件。也许有点繁琐,但可能会起作用。 - K Finley

1

以下是如何编译单个文件,然后链接整个解决方案的示例:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接