c# - 为 MSBuild 指定/未指定平台参数时的区别

标签 c# visual-studio-2010 command-line msbuild

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

谢谢

最佳答案

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

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

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

What would be the platform when I don't pass the platform in command line?

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

What happens when I pass x86 instead of AnyCPU?

然后您会得到您要求的平台选择,x86。


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

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

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

关于c# - 为 MSBuild 指定/未指定平台参数时的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19398596/

相关文章:

c++ - PNACL——使用 winscard 库

linux - 为什么 linux 重定向会截断文件?

python - 只有 py 文件时隐藏控制台(没有 pyw)[ANKI 附加组件]

c# - 如何创建尚未显示的对象的图像

c# - 阶乘函数 - 设计和测试

c# - WPF 全局类 MVVM

c# - 动态生成的 GUI

visual-studio - VS2010 Clean Web.configs - 不更新

c++ - 为什么链接库的顺序会导致运行时错误?

Linux "join"命令无法正常工作?