在生成大型项目时有效使用内存

更新: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 时,应该可以看到 MyProj1 的目标 Normal 的输出,而该输出由 MyProj2 在屏幕上显示。

请参见

概念

并行生成多个项目