6

我有一个 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 时会发生什么?

谢谢

4

1 回答 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 项目中使用(在 VS2012 及更高版本中首选 32 位)。x86但这是一个你事先知道的硬事实,在构建 EXE 时选择在 AnyCPU 和 x86 之间切换是没有意义的。

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

于 2013-10-16T10:39:16.847 回答