2012-06-09 140 views
2

我需要同步對構建於MsBuild中的項目之間的共享資源的訪問。在過去,當項目按順序運行並且在同一過程中時,這不是問題。但是現在,當MsBuild可以在多個線程和多個進程中運行項目構建時,我無法找到實現此目的的方法。如何同步MsBuild中的項目之間的共享資源

基本上,我想要的是當我的項目開始構建時,我可以對資源進行一些操作。當他們都結束了,我可以做另一個操作。

如果首先想到我可以實現自定義任務並讓每個項目都修改構建過程,那麼在構建之前和構建之後注入任務。但是,由於它們可以並行運行,甚至跨進程,我似乎沒有選擇權。

當試圖解決這個問題時,最接近的是當我在Microsoft.Build.Execution命名空間中找到BuildSubmission類(http://msdn.microsoft.com/zh-cn/library/microsoft.build .execution.buildsubmission.aspx)。但我無法找到任何有關如何與我的自定義任務中的這些類交互的信息。

任何類型的輸入或指針在某些方向將不勝感激!

/每

+0

你可以更具體地瞭解你想分享的資源嗎?可能有其他解決方案。 –

+0

那麼,資源並不是真正的單一資源,但可以說它是一個用於說明的數據庫。當構建屬於共享解決方案的一組項目時,我想確保在構建之前,到達預構建注入點的第一個項目對此數據庫執行某些操作,並且所有後續項目都瞭解它已完成,所以他們跳過這樣做。當構建會話結束時另一種方式是:在構建完最後一個項目之後,它會對數據庫執行一些其他操作,也是排他性的(其他項目不會)。 –

+0

我可以嘗試說明另一種方式。我們讓流程成爲資源。 我們有X項目的解決方案。當構建解決方案時(在MsBuild之上使用MsBuild或VS),我們要確保在任何項目開始構建之前,關閉一個進程(「Foo.exe」),在最後一個完成構建之後,我們要保證再次啓動相同的過程。 在我們的處理中,我們擁有所有的MsBuild標準任務以及製作自定義任務的選項。我們可能希望在構建之前和構建之後通過修改BuildDependsOn屬性來注入我們的自定義任務。 –

回答

0

可以實現自定義的MSBuild任務的資源訪問,並通過named mutex保護它(這些都可以用來同步單獨的進程)。也就是說,實現將首先獲取互斥鎖,檢查資源是否需要被觸及,然後纔會在資源上執行其工作並最終釋放互斥鎖。您可以使用AfterTargets or BeforeTargets強制此任務在構建之前或之後運行。

這樣,如果兩個使用此任務的項目同時到達預構建或後構建階段,那麼只有其中一個將在另一個等待時執行資源上的工作。當第一個項目釋放互斥體時,第二個會釋放互斥體,第二個會獲得它,意識到作業已經完成並立即釋放互斥體,而不觸及資源。

您應該考慮是否要爲預構建和後構建資源訪問使用相同的互斥鎖或兩個不同的互斥鎖(它們是否可以同時運行?)。