共用方式為


在建置大型專案時有效使用記憶體

更新: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 的輸出。

請參閱

概念

同時建置多個專案