`$(Platform)`宏总是在文件引用中评估为`AnyCPU`

时间:2016-03-22 17:14:02

标签: visual-studio msbuild

我正在尝试使Visual Studio构建系统将文件复制到C#项目的输出目录。此文件依赖于平台(x86 / x64)和配置(调试/发布/ ...)。例如,我有Debug|x64Release|x64版本的不同文件。我想要处理的方法是在解决方案资源管理器中向项目添加一个文件并手动编辑项目文件。 例如,如果我想将名为myfile.dat的文件复制到输出目录,我会在C#项目文件中编写以下一组宏:

<ItemGroup>
    <Content Include="$(SolutionDir)\data\$(Configuration)\$(Platform)\myfile.dat">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
</ItemGroup>

我的想法是,文件myfile.dat将从data文件夹中的一个子文件夹中复制,具体取决于所选的构建类型。

Solution folder
|
+--data
   |
   +--Release
   |  |
   |  +--x86
   |  |
   |  +--x64
   |
   +--Debug
      |
      +--x86
      |
      +--x64

但由于某种原因,$(Platform)宏始终评估为AnyCPU,当它是文件引用路径的一部分时。实际上有两个宏$(Platform)$(PlatformName),它们都评估为AnyCPU。我找不到任何描述这些宏之间差异的文档。 我还尝试在Pre-build event中评估这些宏,然后它给出了正确的结果。 我知道我可以使用Pre-build event来复制文件,我只是好奇为什么它不能作为文件引用路径的一部分工作。是否需要更改项目文件的另一部分才能使其正常工作?

更新

PS。项目平台的值设置为x86x64。事实上,AnyCPU平台已从配置管理器中删除。

2 个答案:

答案 0 :(得分:0)

$(Platform)正在评估AnyCPU,因为您的项目属性&gt;&gt; Build&gt;&gt;平台设置为AnyCPU。请注意,这与Platform target不同。您可以使用正确的平台名称和设置从Build&gt;&gt; Configuration Manager&gt;&gt; New创建新的平台配置。

以下是关于同样事情的类似问题。

How can you access the Visual Studio solution level platform from a C# project's build event?

Visual Studio macro/anything else to iterate through all projects and set project properties

答案 1 :(得分:0)

$(PlatformTarget) 正是您所需要的。它返回正确的 AnyCPUx86x64。确保测试 AnyCPU 条件,因为它与 x86 相同。例如:

Condition=" '$(PlatformTarget)' == 'x86' Or '$(PlatformTarget)' == 'AnyCPU' "