当没有为MSBuild指定平台参数时的差异

New*_*bee 6 c# msbuild command-line visual-studio-2010

我有一个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"
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

我想知道当您在命令行参数中指定平台时,以及何时不这样做时,它会有什么不同.我一直在尝试使用命令行中的verbosity参数/ v:d来调查这一点,但除了每个构建的平台不同之外我找不到任何区别.

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

谢谢

Han*_*ant 11

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

<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
Run Code Online (Sandbox Code Playgroud)

换句话说,如果没有设置$(平台),那么它会选择一个固定的默认值,在这种情况下为AnyCPU.如果您故意删除此行,则需要将其还原.如果它从未出现过,请添加它.这可以解决您的问题:

当我没有在命令行中传递平台时,平台会是什么?

它将由该行设置,在这种情况下为AnyCPU.

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

然后你得到你要求的平台选择,x86.


请注意,<Platform>在纯C#项目中它是无用的.它对C++项目很重要,因为在构建C++项目时必须使用不同的工具集,它需要使用32位或64位编译器和链接器.ARM内核的编译器/链接器与英特尔内核有很大不同.这不是C#的情况,你使用完全相同的编译器,你得到完全相同的程序集.抖动是在运行时处理处理器体系结构的抖动.

唯一有所作为的财产是<PlatformTarget>.你总是喜欢AnyCPU,尤其是课堂图书馆项目.您可能需要使用x86的EXE项目(身高在VS2012 32位及以上),如果你知道你有32位非托管代码的依赖.但这是你事先知道的一个事实,当你构建EXE时,选择在AnyCPU和x86之间切换是没有意义的.

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

  • 是.只有PlatformTarget设置很重要.平台的名称无关紧要.消除选择的另一个好理由.如果你确实保留它们那么使PlatformTarget与Platform相同是相当重要的,以避免将来某个时候发生严重的头部刮擦:) (3认同)
  • 正如我所指出的,没有用处.这发生在VS2010中,因为C++的构建系统得到了重新设计,现在也使用了MSBuild.平台对C++项目非常重要.或者包含C#和C++项目的解决方案.在VS2010生活很简单之前,C#项目只有一个平台(名为AnyCPU),没有人添加过.对于纯C#项目来说,这仍然是正确的解决方案. (3认同)