.vcxproj ファイルとワイルドカード

Visual Studio IDE では、.vcxproj ファイル内のプロジェクト項目内の特定のコンストラクトはサポートされていません。 これらのサポートされていないコンストラクトには、ワイルドカード、セミコロンで区切られたリスト、または複数のファイルにまたがる MSBuild マクロが含まれます。 C++ のビルドのための .vcxproj プロジェクト システムは、MSBuild よりも制限があります。 各プロジェクト項目には、独自の MSBuild 項目がある必要があります。 .vcxproj ファイル形式の詳細については、「.vcxproj および .props ファイル構造」を参照してください。

次のコンストラクトの例は、IDE ではサポートされません。

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

これらのコンストラクトを含む .vcxproj プロジェクト ファイルが IDE に読み込まれた場合、プロジェクトは最初は動作しているように見えることがあります。 ただし、プロジェクトを Visual Studio で変更して、ディスクに保存するとすぐに問題が発生する可能性があります。 ランダムなクラッシュや未定義の動作が発生することがあります。

Visual Studio 2019 バージョン 16.7 では、Visual Studio で .vcxproj プロジェクト ファイルを読み込むときに、プロジェクト項目のサポートされていないエントリが自動的に検出されます。 ソリューションの読み込み中に、[出力] ウィンドウに警告が表示されます。

Visual Studio 2019 バージョン 16.7 には、読み取り専用プロジェクトのサポートも追加されています。 読み取り専用のサポートにより、IDE で編集可能なプロジェクトの追加の制限がない、手動で作成されたプロジェクトを IDE で使用できます。

1 つ以上のサポートされていないコンストラクトを使用する .vcxproj ファイルがある場合は、次のいずれかのオプションを使用すると、IDE で警告なしで読み込むことができます。

  • すべての項目を明示的に一覧表示する
  • プロジェクトを読み取り専用としてマークする
  • ワイルドカード項目をターゲット本体に移動する

すべての項目を明示的に一覧表示する

現時点では、ソリューション エクスプローラー ウィンドウに読み取り専用ではないプロジェクトのワイルドカードの展開項目を表示する方法はありません。 ソリューション エクスプローラーでは、プロジェクトのすべての項目が明示的に一覧表示されることが予期されています。

Visual Studio 2019 バージョン 16.7 以降では、.vcxproj プロジェクトでワイルドカードが自動的に展開されるようにするには、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 ファイルまたはインポートされたものの中のプロジェクト項目にワイルドカードが検出された場合、プロジェクト キャッシュは使用できないことに注意してください。 ワイルドカードを使用するプロジェクトが多数存在する場合は、IDE でのソリューションの読み込み時間がかなり長くなります。

ワイルドカード項目をターゲット本体に移動する

ワイルドカードを使用して、リソースを収集したり、生成されたソースを追加したりすることができます。 ソリューション エクスプローラー ウィンドウに一覧表示する必要がない場合は、代わりに次の手順を使用できます。

  1. 項目グループの名前を変更して、ワイルドカードを追加します。 たとえば、次のコードは使用せずに

    <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 ファイルで定義されている項目をビルドで認識できるようになります。 ただし、ソリューション エクスプローラー ウィンドウに表示されなくなりますが、IDE で問題は発生しません。

  3. エディターでこれらのファイルを開いたときに、_WildCardClCompile 項目の正しい IntelliSense が表示されるようにするには、次の内容を追加します。

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

事実上、ターゲット本体内の任意の項目にワイルドカードを使用できます。 ProjectSchemaDefinition でプロジェクト項目として定義されていない ItemGroup でワイルドカードを使用することもできます。

Note

ワイルドカードの include を .vcxproj ファイルからインポートされるファイルに移動した場合、そのファイルはソリューション エクスプローラー ウィンドウに表示されなくなります。 この変更により、プロジェクトを変更せずに IDE に読み込むこともできます。 ただし、プロジェクト キャッシュが無効になるので、この方法はお勧めしません。

関連項目

Visual Studio で C++ コンパイラとビルド プロパティを設定する
プロパティ ページの XML ファイル