MSBuild 指定/未指定平台参数时的差异

问题描述 投票:0回答:1

我有一个 VS10 项目文件(.csproj)。我正在从命令行使用 MSBuild 构建这个项目。我有一个简单的问题,我长期以来一直试图弄清楚。这些命令行参数有什么区别:-

1. >MSBuild MyProg.csproj /p:Configuration="Release"
2. >MSBuild MyProg.csproj /p:Platform="AnyCPU" /p:Configuration="Release"   
3. >MSBuild MyProg.csproj /p:Platform="x86" /p:Configuration="Release"

在 csproj 文件中,我有这个 PropertyGroup 标签

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  <DebugSymbols>true</DebugSymbols>
  <DebugType>full</DebugType>
  <Optimize>false</Optimize>
  <OutputPath>..\..\bin\Debug\</OutputPath>
  <DefineConstants>DEBUG;TRACE</DefineConstants>
  <ErrorReport>prompt</ErrorReport>
  <WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
  <DebugType>pdbonly</DebugType>
  <Optimize>true</Optimize>
  <OutputPath>..\..\bin\Release\</OutputPath>
  <DefineConstants>TRACE</DefineConstants>
  <ErrorReport>prompt</ErrorReport>
  <WarningLevel>4</WarningLevel>
</PropertyGroup>

我想知道在命令行参数中指定平台和不指定平台有什么区别。我一直在尝试在命令行中使用详细参数 /v:d 来调查这一点,但除了每个版本的平台不同之外,我找不到任何区别。

当我在命令行中不通过平台时,平台会是什么?当我通过 x86 而不是 AnyCPU 时会发生什么?

谢谢

c# visual-studio-2010 command-line msbuild
1个回答
11
投票

.csproj 文件始终确保使用此行选择默认平台:

<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>

换句话说,如果未设置 $(Platform),那么它会选择一个固定的默认值,在本例中为 AnyCPU。如果您故意删除了该行,那么您想要恢复它。或者如果它不存在的话添加它。这可以解决您的问题:

当我在命令行中不通过平台时,平台会是什么?

它将由该行设置,在本例中为 AnyCPU。

当我通过 x86 而不是 AnyCPU 时会发生什么?

然后您将获得所需的平台选择,x86。


请注意,

<Platform>
在纯 C# 项目中毫无用处。这对于 C++ 项目非常重要,因为构建 C++ 项目时必须使用不同的工具集,它需要使用 32 位或 64 位编译器和链接器。 ARM 内核的编译器/链接器与 Intel 内核有很大不同。 C# 的情况并非如此,您使用完全相同的编译器并且获得完全相同的程序集。抖动是在运行时处理处理器架构的抖动。

唯一有影响的属性是

<PlatformTarget>
。你总是喜欢
AnyCPU
,尤其是在类库项目上。如果您知道自己依赖于 32 位非托管代码,您可能会想要在 EXE 项目上使用 x86(首选 VS2012 及更高版本中的 32 位)。但这是您预先知道的一个硬事实,当您构建 EXE 时,选择在 AnyCPU 和 x86 之间切换是没有意义的。

因此拥有多个平台是没有意义的,只有一个就足够了。这最终解决了你的问题,只是消除了选择。

© www.soinside.com 2019 - 2024. All rights reserved.