更新:2007 年 11 月
大型專案通常包含許多子專案和其他相依性,而這些可能會在建置階段消耗大量的系統記憶體。隨著可用的系統記憶體減少,系統效能也可能跟著降低。MSBuild 3.5 可藉由從記憶體卸載專案來解決此問題,因為專案在建置結束後會將建置結果保留在快取中,以供稍後擷取。
卸載專案、快取和擷取結果
在舊版的 MSBuild 中,專案在建置後會保留在記憶體中。MSBuild 3.5 則新增了一個名為 UnloadProjectsOnCompletion 的工作屬性,可讓您從記憶體移除已完成建置的專案。
不過,專案從記憶體卸載之後,就無法再重新載入到相同的建置執行個體。由於建置通常會有目標,必須呼叫目標以收集專案中的資訊,因此,在建置期間從記憶體卸載專案可能會發生問題。為解決此問題,MSBuild 3.5 新增了另一個名為 UseResultsCache 的屬性,可用來快取建置所有專案的目標結果 (例如建置結果、項目和屬性)。
由於專案所佔用的記憶體比其建置結果多,因此卸載專案但保留其結果能更有效使用記憶體。UnloadProjectsOnCompletion 和 UseResultsCache 搭配使用不但能釋出記憶體,也可讓 MSBuild 直接從記憶體擷取建置結果 (而非從磁碟上的檔案擷取),大幅改善了建置效能。
範例
下列範例示範如何使用 UnloadProjectsOnCompletion 和 UseResultsCache。這個範例有兩個專案,分別是 MyProj1.proj 和 MyProj2.proj。
MyProj1.proj
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="default">
<Message Text="Project: MyProj1. Target: default" />
<CallTarget Targets="Normal" UseResultsCache="true"/>
</Target>
<Target Name="Normal" Outputs="Someoutput from second target">
<Message Text="Project: MyProj1. Target: second" />
</Target>
</Project>
MyProj2.proj
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="default">
<Message Text="Project: MyProj2.proj Target: default" />
<MSBuild Projects=" MyProj1.proj" Targets="default"
UnloadProjectsOnCompletion="true" />
<MSBuild Projects=" MyProj1.proj" Targets="Normal"
UnloadProjectsOnCompletion="true" >
<Output TaskParameter="TargetOutputs"
PropertyName="TargetOutput"/>
</MSBuild>
<Message Text="Output from project: MyProj2.proj target: second
= $(TargetOutput)" />
</Target>
</Project>
當您在命令列使用 msbuild.exe MyProj2.proj /tv:3.5 建置 MyProj2.proj 時,應會看到從 MyProj2 顯示 MyProj1 之目標 Normal 的輸出。