MSBuild 可以藉由為每個處理器建立個別的建置程式,以充分利用具有多個處理器或多核心處理器的系統。 例如,如果系統有四個處理器,MSBuild 會建立四個建置程式。
MSBuild 可以同時處理多個組建,以減少整體建置時間。 不過,平行建置可能會對建置流程的發生方式造成變更。
本文說明多個組建同時執行時可能發生的程序變更。
專案間的參考
當Microsoft建置引擎在專案的平行建置期間遇到項目參考(ProjectReference 元素),則只會建置參考一次。 如果兩個專案具有相同的項目參考,則不會針對每個專案重建參考。 相反地,建置引擎會針對具有相依性之兩個專案傳回相同的項目參考。 MSBuild 也會在相同目標的操作階段中,為未來的請求提供相同的專案參考。
迴圈偵測
平行建置期間的迴圈偵測與 MSBuild 2.0 的行為相同。 其中一個差異在於,較新版本的 MSBuild 可以在不同時間或組建中報告週期的偵測。
平行建置期間的錯誤和例外狀況
在平行建置期間,錯誤和例外狀況可能會與非平行建置期間發生的錯誤和例外狀況不同。 此外,如果某個專案未建置,其他專案建置會繼續。
MSBuild 不會與失敗的建置平行停止任何專案建置。 其他項目會繼續建置,直到它們成功或失敗為止。 ContinueOnError啟用設定時,即使發生錯誤,也不會停止建置。
C++專案 (.vcxproj) 和方案 (.sln) 檔案
C++專案 (.vcxproj) 和方案 (.sln) 檔案都可以傳遞至 MSBuild 工作。
- C++專案:會呼叫 VCWrapperProject API,然後建立內部 MSBuild 專案。
- C++解決方案:會建立 SolutionWrapperProject 實例,然後建立內部 MSBuild 專案。
在這兩種情況下,產生的專案會像任何其他 MSBuild 項目一樣處理。
多進程執行
幾乎所有的建置相關活動都需要目前的目錄在整個建置程式中保持一致,以防止路徑相關錯誤。 項目無法在 MSBuild 中的不同線程上執行,因為它們可能會導致建立多個目錄。
若要避免此問題,但仍啟用多處理器組建,MSBuild 會使用 進程隔離。 此程式可讓 MSBuild 建立最大 n 進程,其中 n 等於系統上可用的處理器數目。 例如,如果 MSBuild 在具有兩個處理器的系統上建置解決方案,則只會建立兩個建置程式。 這些程式會重複使用,以建置方案中的所有專案。