.vcxproj fichiers et caractères génériques

L’IDE Visual Studio ne prend pas en charge certaines constructions dans les éléments de projet dans les .vcxproj fichiers. Ces constructions non prises en charge incluent des caractères génériques, des listes délimitées par des points-virgules ou des macros MSBuild qui s’étendent vers plusieurs fichiers. Le .vcxproj système de projet pour les builds C++ est plus restrictif que MSBuild. Chaque élément de projet doit avoir son propre élément MSBuild. Pour plus d’informations sur le format de .vcxproj fichier, consultez .vcxproj et .props structure de fichiers.

Ces exemples de construction ne sont pas pris en charge par l’IDE :

<ItemGroup>
  <None Include="*.txt">
  <ClCompile Include="a.cpp;b.cpp"/>
  <ClCompile Include="@(SomeItems)" />
</ItemGroup>

Si un .vcxproj fichier projet qui inclut ces constructions est chargé dans l’IDE, le projet peut sembler fonctionner au début. Toutefois, les problèmes sont probablement dès que le projet est modifié par Visual Studio, puis enregistré sur le disque. Vous pouvez rencontrer des blocages aléatoires et un comportement non défini.

Dans Visual Studio 2019 version 16.7, lorsque Visual Studio charge un .vcxproj fichier projet, il détecte automatiquement les entrées non prises en charge dans les éléments du projet. Vous verrez des avertissements dans la fenêtre Sortie pendant le chargement de la solution.

Visual Studio 2019 version 16.7 ajoute également la prise en charge du projet en lecture seule. La prise en charge en lecture seule permet à l’IDE d’utiliser des projets créés manuellement qui n’ont pas les limitations supplémentaires des projets modifiables par l’IDE.

Si vous avez un .vcxproj fichier qui utilise une ou plusieurs constructions non prises en charge, vous pouvez le charger sans avertissements dans l’IDE à l’aide de l’une des options suivantes :

  • Répertorier explicitement tous les éléments
  • Marquer votre projet en lecture seule
  • Déplacer des éléments génériques vers un corps cible

Répertorier explicitement tous les éléments

Actuellement, il n’existe aucun moyen de rendre les éléments d’extension génériques visibles dans la fenêtre Explorateur de solutions dans un projet non en lecture seule. Explorateur de solutions s’attend à ce que les projets répertorient explicitement tous les éléments.

Pour que .vcxproj les projets développent automatiquement les caractères génériques dans Visual Studio 2019 version 16.7 ou ultérieure, définissez la ReplaceWildcardsInProjectItems propriété truesur . Nous vous recommandons de créer un Directory.Build.props fichier dans un répertoire racine et d’utiliser ce contenu :

<Project>
  <PropertyGroup>
    <ReplaceWildcardsInProjectItems>true</ReplaceWildcardsInProjectItems>
  </PropertyGroup>
</Project>

Marquer votre projet en lecture seule

Dans Visual Studio 2019 version 16.7 et ultérieure, vous pouvez marquer les projets en lecture seule. Pour marquer votre projet en lecture seule, ajoutez la propriété suivante à votre .vcxproj fichier ou à l’un des fichiers qu’il importe :

<PropertyGroup>
    <ReadOnlyProject>true</ReadOnlyProject>
</PropertyGroup>

Le <ReadOnlyProject> paramètre empêche Visual Studio de modifier et d’enregistrer le projet. Vous pouvez donc utiliser n’importe quelle construction MSBuild, y compris les caractères génériques.

Il est important de savoir que le cache du projet n’est pas disponible si Visual Studio détecte des caractères génériques dans les éléments de projet dans le .vcxproj fichier ou l’une de ses importations. Les temps de chargement de solution dans l’IDE sont beaucoup plus longs si vous avez beaucoup de projets qui utilisent des caractères génériques.

Déplacer des éléments génériques vers un corps cible

Vous pouvez utiliser des caractères génériques pour collecter des ressources, ajouter des sources générées, et ainsi de suite. Si vous n’en avez pas besoin dans la fenêtre Explorateur de solutions, vous pouvez utiliser cette procédure à la place :

  1. Modifiez le nom du groupe d’éléments pour ajouter des caractères génériques. Par exemple, au lieu de :

    <Image Include="*.bmp" />
    <ClCompile Include="*.cpp" />
    

    remplacez-le par :

    <_WildCardImage Include="*.bmp" />
    <_WildCardClCompile Include="*.cpp" />
    
  2. Ajoutez ce contenu à votre .vcxproj fichier. Sinon, ajoutez-le à un Directory.Build.targets fichier dans un répertoire racine pour affecter tous les projets sous cette racine :

    <Target Name="AddWildCardItems"
        AfterTargets="BuildGenerateSources">
      <ItemGroup>
        <Image Include="@(_WildCardImage)" />
        <ClCompile Include="@(_WildCardClCompile)" />
      </ItemGroup>
    </Target>
    

    Cette modification permet de voir les éléments tels qu’ils sont définis dans le .vcxproj fichier. Toutefois, ils ne sont pas visibles dans la fenêtre Explorateur de solutions, et ils ne provoquent pas de problèmes dans l’IDE.

  3. Pour afficher IntelliSense correct pour _WildCardClCompile les éléments lorsque vous ouvrez ces fichiers dans l’éditeur, ajoutez le contenu suivant :

    <PropertyGroup>
      <ComputeCompileInputsTargets>
        AddWildCardItems
        $(ComputeCompileInputsTargets)
      </ComputeCompileInputsTargets>
    </PropertyGroup>
    

En effet, vous pouvez utiliser des caractères génériques pour tous les éléments à l’intérieur d’un corps cible. Vous pouvez également utiliser des caractères génériques dans un ItemGroup élément de projet qui n’est pas défini en tant qu’élément de projet par un ProjectSchemaDefinition.

Remarque

Si vous déplacez des caractères génériques d’un .vcxproj fichier vers un fichier importé, ils ne seront pas visibles dans la fenêtre Explorateur de solutions. Cette modification permet également à votre projet de se charger dans l’IDE sans modification. Toutefois, nous vous déconseillons cette approche, car elle désactive le cache du projet.

Voir aussi

Définir le compilateur C++ et les propriétés de build dans Visual Studio
Fichiers XML de la page de propriétés