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

実行されたコマンドの状態に関する同期オブジェクトまたは情報はありますか?

4

2 に答える 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

それはそれを行う必要があります。

于 2009-10-06T02:35:24.710 に答える
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
于 2010-02-27T13:57:38.610 に答える