我有一个 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/