1

序章

私たちのプロジェクトでは、Visual Studio C++ がコード エディターとして使用され、ビルドは複数のターゲット プラットフォームをサポートする GNU make ベースのビルド システムに委任されます。Visual Studio からビルド システムへのビルド委任は、すべての VS プロジェクト ファイルに含まれる汎用 MSBuild プロパティ シートによって実装されます。(統合は基本的に、NMake 固有のプロパティなどを設定することで機能しますNMakeBuildCommandLine)。汎用統合プロパティ シートの追加の役割は、プロジェクト固有のリソース ファイルをソリューション エクスプローラーのプロジェクト サブツリーに動的に追加することです。

プロジェクト固有のリソース ファイルの動的な追加は、Visual Studio 2010 と Visual Studio 2012 の両方で何年もの間完全に機能していました。残念ながら、この機能は Visual Studio 2013 では機能しなくなりました。

初期設定

次の簡略化された例は、問題を示しています。最小限のセットアップは、次の 5 つのファイルで構成されます。

  1. minimal_sample.sln: VS 2010 によって作成されたソリューション ファイルで、プロジェクトのRelease|Win32構成への参照が削除されています (コード リストについては、ここをクリックしてください)
  2. minimal_sample.vcxproj: プロジェクト ファイル。以下の詳細な説明を参照してください (コード リストについては、ここをクリックしてください)
  3. statically_included_header.h: 最小限の C++ ヘッダー ファイルの例 (内容は関係ありません)
  4. statically_included_impl.cpp: 最小限のサンプル C++ impl ファイル (内容は関係ありません)
  5. text_file.txt: 最小限のサンプル リソース ファイル (内容は関係ありません)

プロジェクト ファイルは空のminimal_sample.vcxprojVS C++ 2010 プロジェクトとして作成され、その後、次の変更が適用されました。

  • Release|Win32構成が削除されました
  • Start of static file inclusion code静的に含まれるファイルは VS 2010 を使用して追加されました (およびEnd of static file inclusion codeXML コメントで区切られたセクション )
  • 動的リソース ファイルの追加を担当する MSBuild コード セクションが追加されました (Start of dynamic file inclusion codeEnd of dynamic file inclusion codeXML コメントで区切られたセクション) 。

minimal_sample.vcxproj次のコード リストは、ファイルの関連部分を示しています。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!-- Project file parts left out for brevity -->

  <ImportGroup Label="PropertySheets">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>

  <!-- Start of dynamic file inclusion code -->
  <PropertyGroup>
    <TxtFile Condition="'$(TxtFile)'==''">text_file.txt</TxtFile>
  </PropertyGroup>

  <ItemGroup Condition="'$(TxtFile)'!='' and exists('$(TxtFile)')">
    <None Include="$(TxtFile)"/>
  </ItemGroup>
  <!-- End of dynamic file inclusion code -->

  <PropertyGroup Label="UserMacros" />

  <!-- Project file parts left out for brevity -->

  <!-- Start of static file inclusion code -->
  <ItemGroup>
    <ClCompile Include="statically_included_header.h" />
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="statically_included_impl.cpp" />
  </ItemGroup>
  <!-- End of static file inclusion code -->

  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ImportGroup Label="ExtensionTargets">
  </ImportGroup>
</Project>

再現するための手動手順

フィルターを使用しない限り、上記の最小限の例は、この投稿で言及されている Visual Studio のどのバージョン (VS 2010、VS 2012、および VS 2013) でも問題なく動作します。

フィルターが追加されるとすぐに、minimal_sample.vcxprojそれが空のフィルター、静的に含まれるファイルのフィルター、または動的に含まれるリソース ファイルのいずれであるかに関係なく、text_file.txt動的に含まれるリソース ファイルは、再起動後 (またはプロジェクトのアンロード/プロジェクトのリロードシーケンス)。ただし、ファイルは Visual Studio 2010 と Visual Studio 2012 の両方で表示されたままになります。

minimal_sample.vcxproj.filtersファイルが削除されるとすぐにフィルターは削除されますが、動的に含まれるリソース ファイルtext_file.txtは再び表示されます。

質問

  1. VS 2010/2012 と VS 2013 の動作で観察された違いは、バグまたは「機能」ですか? それとも、不十分に実装されたバグ修正ですか?
  2. 動的に含まれるファイルに関して、VS 2013 を VS 2010/2012 として動作させるための回避策はありますか?
4

0 に答える 0