序章
私たちのプロジェクトでは、Visual Studio C++ がコード エディターとして使用され、ビルドは複数のターゲット プラットフォームをサポートする GNU make ベースのビルド システムに委任されます。Visual Studio からビルド システムへのビルド委任は、すべての VS プロジェクト ファイルに含まれる汎用 MSBuild プロパティ シートによって実装されます。(統合は基本的に、NMake 固有のプロパティなどを設定することで機能しますNMakeBuildCommandLine
)。汎用統合プロパティ シートの追加の役割は、プロジェクト固有のリソース ファイルをソリューション エクスプローラーのプロジェクト サブツリーに動的に追加することです。
プロジェクト固有のリソース ファイルの動的な追加は、Visual Studio 2010 と Visual Studio 2012 の両方で何年もの間完全に機能していました。残念ながら、この機能は Visual Studio 2013 では機能しなくなりました。
初期設定
次の簡略化された例は、問題を示しています。最小限のセットアップは、次の 5 つのファイルで構成されます。
minimal_sample.sln
: VS 2010 によって作成されたソリューション ファイルで、プロジェクトのRelease|Win32
構成への参照が削除されています (コード リストについては、ここをクリックしてください) 。minimal_sample.vcxproj
: プロジェクト ファイル。以下の詳細な説明を参照してください (コード リストについては、ここをクリックしてください) 。statically_included_header.h
: 最小限の C++ ヘッダー ファイルの例 (内容は関係ありません)statically_included_impl.cpp
: 最小限のサンプル C++ impl ファイル (内容は関係ありません)text_file.txt
: 最小限のサンプル リソース ファイル (内容は関係ありません)
プロジェクト ファイルは空のminimal_sample.vcxproj
VS C++ 2010 プロジェクトとして作成され、その後、次の変更が適用されました。
Release|Win32
構成が削除されましたStart of static file inclusion code
静的に含まれるファイルは VS 2010 を使用して追加されました (およびEnd of static file inclusion code
XML コメントで区切られたセクション )- 動的リソース ファイルの追加を担当する MSBuild コード セクションが追加されました (
Start of dynamic file inclusion code
とEnd of dynamic file inclusion code
XML コメントで区切られたセクション) 。
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
は再び表示されます。
質問
- VS 2010/2012 と VS 2013 の動作で観察された違いは、バグまたは「機能」ですか? それとも、不十分に実装されたバグ修正ですか?
- 動的に含まれるファイルに関して、VS 2013 を VS 2010/2012 として動作させるための回避策はありますか?