Поделиться через


Эффективное использование памяти при построении больших проектов

Обновлен: Ноябрь 2007

Большие проекты часто содержат множество подпроектов и других зависимостей, которые могут занимать большой объем системной памяти во время построения. При сокращении объема доступной системной памяти может понизиться производительность системы. 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>

При построении проекта MyProj2.proj с помощью команды msbuild.exe MyProj2.proj /tv:3.5 в командной строке вы должны увидеть результат целевого объекта Normal из MyProj1, печатающийся из проекта MyProj2.

См. также

Основные понятия

Параллельное построение нескольких проектов