2009-06-16 17 views
7

Tôi muốn sử dụng các macro để xuất bản dự án ứng dụng web của tôi. Vấn đề nhỏ là, DTE.ExecuteCommand chạy không đồng bộ, và tôi cần đợi cho đến khi lệnh được thực hiện.DTE.ExecuteCommand và đợi

Ví dụ:

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 

Có một số đối tượng đồng bộ hóa hoặc thông tin về trạng thái của lệnh thực thi?

Cảm ơn

+1

Tôi cũng đang tìm kiếm một câu trả lời cho điều này. Tôi muốn có thể chạy một loạt các câu lệnh ExecuteCommand trong macro, nhưng đồng bộ. –

+0

Thật không may tôi không biết một giải pháp: ( – TcKs

Trả lời

5

Xin chào các bạn, nếu bạn vẫn đang tìm câu trả lời cho câu trả lời này, hãy thử.

Gắn vào các sự kiện xuất bản và trên một cuộc gọi push thành công, hãy gọi lệnh bên ngoài của bạn. Tôi đang làm một điều tương tự với việc xây dựng các giải pháp và sau đó bắn các Á hậu thử nghiệm MSpec (blog post).

Để thực hiện việc này, bạn cần phải thêm vào móc cho PublishEvents_OnPublishDone. Thực hiện việc này bằng cách chuyển đến Mô-đun EnvironmentEvents và thêm vào các nội dung sau:

<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 

Nếu bạn chỉ muốn chạy lệnh bên ngoài đôi khi làm điều gì đó như thế này. Tạo macro của bạn như thế này:

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 

Sau đó, trong EnvironmentEvents thêm thế này: (Lưu ý: CustomMacros là tên của module, nơi bạn đặt đoạn mã trên)

<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 

Điều đó sẽ làm điều đó.

Chúc mừng,

Kyle

+0

Có vẻ tốt, tôi sẽ thử nó. – TcKs

+0

Iw làm việc để xuất bản (+1), nhưng nó không giải quyết các lệnh khác (tôi không chắc chắn, có một giải pháp) Tuy nhiên, thans :) – TcKs

+0

Bạn có thể đi đến khu ổ chuột với người khác và tạo một số loại cơ chế dựa trên tệp để xác định việc cần làm. Về cơ bản gọi lệnh bên ngoài của bạn bằng cách sử dụng một tập tin thực thi mà chạy đồng bộ và ở cuối giọt một tập tin tạm thời ở đâu đó. Quay trở lại VS tạo một phụ mà sau đó đồng hồ cho tập tin đó tồn tại. Một khi nó đi trước và bắn ra công cụ vĩ mô khác của bạn và sau đó làm sạch các tập tin. Có thể hơi nhiều nhưng có thể hoạt động. –

2

Đây là cách bạn có thể biên dịch tập tin duy nhất, và sau đó liên kết toàn bộ giải pháp ví dụ:

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 
Các vấn đề liên quan