.vcxprojфайлы и дикие карта

Интегрированная среда разработки Visual Studio не поддерживает определенные конструкции в элементах проекта в .vcxproj файлах. Эти неподдерживаемые конструкции включают в себя дикие карта, списки с разделителями с запятой или макросы MSBuild, которые расширяются до нескольких файлов. Система .vcxproj проектов для сборок C++ является более строгой, чем MSBuild. Для каждого элемента проекта требуется собственный элемент MSBuild. Дополнительные сведения о .vcxproj формате файла см. в разделе .vcxproj и .props структуре файлов.

Эти примеры конструкций не поддерживаются интегрированной интегрированной среды разработки.

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

.vcxproj Если файл проекта, включающий эти конструкции, загружается в интегрированную среду разработки, проект может сначала работать. Однако проблемы могут возникать сразу после изменения проекта Visual Studio и последующего сохранения на диске. Вы можете столкнуться с случайными сбоями и неопределенным поведением.

В Visual Studio 2019 версии 16.7 при загрузке .vcxproj файла проекта Visual Studio автоматически обнаруживает неподдерживаемые записи в элементах проекта. Во время загрузки решения вы увидите предупреждения в окне вывода.

Visual Studio 2019 версии 16.7 также добавляет поддержку проектов только для чтения. Поддержка только для чтения позволяет интегрированной среде разработки использовать созданные вручную проекты, которые не имеют дополнительных ограничений для редактируемых проектов интегрированной среды разработки.

Если у вас есть .vcxproj файл, использующий одну или несколько неподдерживаемых конструкций, его можно загрузить без предупреждений в интегрированной среде разработки с помощью одного из следующих вариантов:

  • Вывод списка всех элементов явным образом
  • Пометить проект как доступный только для чтения
  • Перемещение элементов wild карта в целевой текст

Вывод списка всех элементов явным образом

В настоящее время нет способа сделать элементы расширения дикими карта видимыми в окне Обозреватель решений в проекте, не доступном только для чтения. Обозреватель решений ожидает явного перечисления всех элементов проектами.

Чтобы проекты .vcxproj автоматически расширяли дикие карта в Visual Studio 2019 версии 16.7 или более поздней, задайте ReplaceWildcardsInProjectItems для свойства значение true. Мы рекомендуем создать Directory.Build.props файл в корневом каталоге и использовать это содержимое:

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

Пометить проект как доступный только для чтения

В Visual Studio 2019 версии 16.7 и более поздних версий можно пометить проекты как доступные только для чтения. Чтобы пометить проект только для чтения, добавьте в файл следующее свойство .vcxproj или в любой из импортируемых файлов:

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

Этот <ReadOnlyProject> параметр предотвращает редактирование и сохранение проекта Visual Studio, поэтому в нем можно использовать любые конструкции MSBuild, включая дикие карта.

Важно знать, что кэш проекта недоступен, если Visual Studio обнаруживает дикие карта в элементах проекта в .vcxproj файле или любом из его импортов. Время загрузки решения в интегрированной среде разработки гораздо дольше, если у вас много проектов, использующих дикие карта.

Перемещение элементов wild карта в целевой текст

Вы можете использовать дикие карта для сбора ресурсов, добавления созданных источников и т. д. Если они не нужны в окне Обозреватель решений, можно использовать следующую процедуру:

  1. Измените имя группы элементов, чтобы добавить wild карта s. Например, вместо:

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

    измените его на:

    <_WildCardImage Include="*.bmp" />
    <_WildCardClCompile Include="*.cpp" />
    
  2. Добавьте это содержимое в .vcxproj файл. Или добавьте его в Directory.Build.targets файл в корневом каталоге, чтобы повлиять на все проекты под этим корнем:

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

    Это изменение делает сборку видимыми элементами по мере их определения в .vcxproj файле. Однако теперь они не отображаются в окне Обозреватель решений, и они не вызывают проблем в интегрированной среде разработки.

  3. Чтобы отобразить правильность IntelliSense для _WildCardClCompile элементов при открытии этих файлов в редакторе, добавьте следующее содержимое:

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

Эффективно можно использовать дикие карта для любых элементов внутри целевого тела. Вы также можете использовать дикие карта в объектеItemGroup, который не определен как элемент ProjectSchemaDefinitionпроекта.

Примечание.

Если вы перемещаете wild карта включает из .vcxproj файла в импортированный файл, они не будут отображаться в окне Обозреватель решений. Это изменение также позволяет проекту загружаться в интегрированной среде разработки без изменений. Однако этот подход не рекомендуется, так как он отключает кэш проекта.

См. также

Настройка компилятора C++ и свойства сборки в Visual Studio
XML-файлы страницы свойств