Partager via


Utilisation efficace de la mémoire lors de la génération de projets volumineux

Mise à jour : novembre 2007

Les grands projets contiennent souvent de nombreux sous-projets et d'autres dépendances, ceux-ci peuvent consommer beaucoup de mémoire système au moment de la génération. Lorsque la mémoire système disponible est réduite, les performances du système peuvent également être réduites. MSBuild 3.5 allège la charge sur la machine en déchargeant les projets de la mémoire à mesure qu'ils sont générés mais en conservant le produit de ces générations en cache pour les récupérer ultérieurement.

Déchargement de projets, mise en cache et récupération de résultats

Dans les versions antérieures de MSBuild, les projets restaient en mémoire après leur génération. MSBuild 3.5 introduit une propriété de tâche nommée UnloadProjectsOnCompletion qui vous permet de supprimer un projet de la mémoire à la fin de sa génération.

Toutefois, lorsqu'un projet a été déchargé de la mémoire, il ne peut être rechargé dans la même instance de génération. Parce qu'une génération possède souvent des cibles qui doivent être appelées pour rassembler des informations dans un projet, décharger un projet de la mémoire pendant une génération peut causer des problèmes. Pour résoudre ce problème, MSBuild 3.5 introduit une autre propriété nommée UseResultsCache, qui peut être utilisée pour mettre en cache les résultats cibles (par exemple des résultats de génération, des éléments et des propriétés) de tous les projets générés.

Parce qu'un projet occupe plus de mémoire que ses résultats de génération, on optimise l'utilisation de la mémoire en déchargeant le projet mais en conservant ses résultats. UnloadProjectsOnCompletion et UseResultsCache fonctionnent ensemble pour améliorer non seulement les performances de génération en libérant de la mémoire, mais également en permettant à MSBuild de récupérer directement les résultats de génération en mémoire au lieu de les récupérer en tant que fichiers sur disque.

Exemple

L'exemple suivant montre comment utiliser UnloadProjectsOnCompletion et UseResultsCache. Dans cet exemple, il y a deux projets, MyProj1.proj et 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>

Lorsque vous générez MyProj2.proj en ligne de commande en utilisant msbuild.exe MyProj2.proj /tv:3.5, vous devriez voir la sortie de la cible Normal de MyProj1 s'afficher dans MyProj2.

Voir aussi

Concepts

Génération parallèle de plusieurs projets