Visual studio 在自定义生成工具VS2012 MSBuild中使用筛选器元数据

Visual studio 在自定义生成工具VS2012 MSBuild中使用筛选器元数据,visual-studio,visual-studio-2012,msbuild,msbuild-task,custom-build,Visual Studio,Visual Studio 2012,Msbuild,Msbuild Task,Custom Build,我有一个问题我想很好地解决,但现在我不知道怎么做 在我的C++解决方案(VS2012)中,我有一个项目,其中包含所有的DLL文件,这些文件必须复制到输出目录中才能完成部署。我还编写了一个小型定制工具来进行复制 实际问题是,我们必须为不同的配置(Win32/x64/Debug/Release)部署不同的.dll,并且必须手动为每个文件和每个配置设置ExcludedFromBuild属性。我想根据文件所在的过滤器自动设置此属性。为了更好地查看为哪个配置复制了哪个.dll,我将它们组织在具有以下结构的

我有一个问题我想很好地解决,但现在我不知道怎么做

在我的C++解决方案(VS2012)中,我有一个项目,其中包含所有的DLL文件,这些文件必须复制到输出目录中才能完成部署。我还编写了一个小型定制工具来进行复制

实际问题是,我们必须为不同的配置(Win32/x64/Debug/Release)部署不同的.dll,并且必须手动为每个文件和每个配置设置
ExcludedFromBuild
属性。我想根据文件所在的过滤器自动设置此属性。为了更好地查看为哪个配置复制了哪个.dll,我将它们组织在具有以下结构的过滤器中

  • Win32
    • 调试
    • 释放
  • x64
    • 调试
    • 释放
当我查看
vcxproj.filters
文件时,条目如下所示

<CopyFiles Include="..\bin.x64\icudt54d.dll">
  <Filter>x64\Debug</Filter>
</CopyFiles>
但这从来都不起作用,在试图解决问题时,我发现
%(CopyFiles.Filter)
总是空的,因为
.vcxproj.filters
没有导入
.vcxproj
文件中。我试图手动将导入添加到
.vcxproj.filters
文件中,但随后VisualStudio中的过滤器完全搞乱了


是否有人知道一种方法可以在不破坏Visual Studio项目的情况下自动化此过程?

.filters文件不参与构建过程,但可以通过XmlPeek任务将其作为任何xml文件查询。请尝试以下操作:

<Target Name="AddInputsAccordingToFilter">
  <XmlPeek Namespaces="&lt;Namespace Prefix='n' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;"
             XmlInputPath="$(MSBuildProjectFile).filters"
             Query="/n:Project/n:ItemGroup/n:CopyFiles[starts-with(n:Filter, '$(Platform)')]/@Include">
    <Output TaskParameter="Result" ItemName="FilesToCopy" />
  </XmlPeek>
  <ItemGroup>
    <CopyFiles Include="@(FilesToCopy)"/>
  </ItemGroup>    
</Target>

考虑到此解决方案依赖于未记录的.filter文件格式

<Target Name="AddInputsAccordingToFilter">
  <XmlPeek Namespaces="&lt;Namespace Prefix='n' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;"
             XmlInputPath="$(MSBuildProjectFile).filters"
             Query="/n:Project/n:ItemGroup/n:CopyFiles[starts-with(n:Filter, '$(Platform)')]/@Include">
    <Output TaskParameter="Result" ItemName="FilesToCopy" />
  </XmlPeek>
  <ItemGroup>
    <CopyFiles Include="@(FilesToCopy)"/>
  </ItemGroup>    
</Target>