Visual studio 2013 Visual Studio C+;中未显示动态包含的文件+;至少创建一个筛选器后的2013解决方案资源管理器 介绍 在我们的项目中,VisualStudioC++被用作代码编辑器,而构建被委托给支持多个目标平台的基于GNU的构建系统。从VisualStudio到生成系统的生成委派由通用MSBuild属性表实现,该属性表包含在每个VS项目文件中。(集成基本上通过设置大量特定于NMake的属性来工作,例如NMakeBuildCommandLine等)。通用集成属性表的附加工作是将特定于项目的资源文件动态添加到解决方案资源管理器中的项目子树中

Visual studio 2013 Visual Studio C+;中未显示动态包含的文件+;至少创建一个筛选器后的2013解决方案资源管理器 介绍 在我们的项目中,VisualStudioC++被用作代码编辑器,而构建被委托给支持多个目标平台的基于GNU的构建系统。从VisualStudio到生成系统的生成委派由通用MSBuild属性表实现,该属性表包含在每个VS项目文件中。(集成基本上通过设置大量特定于NMake的属性来工作,例如NMakeBuildCommandLine等)。通用集成属性表的附加工作是将特定于项目的资源文件动态添加到解决方案资源管理器中的项目子树中,visual-studio-2013,filter,msbuild,visual-studio-project,Visual Studio 2013,Filter,Msbuild,Visual Studio Project,在VisualStudio2010和VisualStudio2012中,动态添加特定于项目的资源文件多年来一直运行良好。不幸的是,该功能在Visual Studio 2013中已停止工作 初始设置 下面的简化示例演示了该问题。我们的最小设置由以下5个文件组成: minimal_sample.sln:解决方案文件,由VS 2010创建,参考项目的版本| Win32配置已删除(单击查看代码列表) minimal_sample.vcxproj:项目文件,请参阅下面的详细说明(单击以查看代码列表) 代码

在VisualStudio2010和VisualStudio2012中,动态添加特定于项目的资源文件多年来一直运行良好。不幸的是,该功能在Visual Studio 2013中已停止工作

初始设置 下面的简化示例演示了该问题。我们的最小设置由以下5个文件组成:

  • minimal_sample.sln
    :解决方案文件,由VS 2010创建,参考项目的
    版本| Win32
    配置已删除(单击查看代码列表)
  • minimal_sample.vcxproj
    :项目文件,请参阅下面的详细说明(单击以查看代码列表)
  • <>代码>静态包含标题.h < /C>:最小实例C++头文件(内容无关) >代码>包含IMPL.CPP:最小实例C++ IMPL文件(内容无关)
  • text\u file.txt
    :最小示例资源文件(内容无关)
  • < > >代码> MimaLasySimult.VCXPROJ项目文件创建为一个空VS C++ 2010项目,之后对其进行以下修改:

    • 已删除
      Release | Win32
      配置
    • 使用VS 2010添加静态包含的文件(该部分由
      静态文件包含代码开始
      静态文件包含代码结束
      XML注释分隔)
    • 添加了负责添加动态资源文件的MSBuild代码部分(该部分由
      动态文件包含代码的开头
      动态文件包含代码的结尾
      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>
    
    
    text_file.txt
    
    复制的手动步骤 只要不使用过滤器,上面描述的最小示例在本文提到的任何Visual Studio版本中都不会出现问题,即:VS 2010、VS 2012和VS 2013

    一旦将筛选器添加到
    minimal_sample.vcxproj
    ——无论它是空筛选器、静态包含文件的筛选器还是动态包含的资源文件
    text_file.txt
    ——重新启动后,动态包含的资源文件都会隐藏在Visual Studio 2013中(或在卸载项目/重新加载项目序列之后)。但是,该文件在Visual Studio 2010和Visual Studio 2012中仍然可见

    一旦删除
    minimal_sample.vcxproj.filters
    文件,过滤器就会被删除,但动态包含的资源文件
    text_file.txt
    将再次可见

    问题
  • 观察到的VS 2010/2012和VS 2013行为上的差异是一个bug还是一个“功能”?或者甚至是一个执行不力的bug修复
  • 对于动态包含的文件,是否有让VS 2013表现为VS 2010/2012的变通方法

  • 我通常使用csproj,所以我不记得文件过滤器,但关于这个文件过滤器或不过滤器的内容…为什么要使用属性动态添加文件?不仅仅是项目?如果“使用文件”,应该使用ItemGroup@Carnifex我同意None项的定义(通过TxtFile属性)看起来有点做作。但是,在这种情况下,这是很重要的,因为这就是在原始属性表中最终设置None项的方式(请记住,我在这里提供了一个非常精简的示例)。必须首先通过一系列条件评估动态计算类似于TxtFile的属性值。