我有一个 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。如果您故意删除了该行,那么您想要恢复它。或者如果它不存在的话添加它。这可以解决您的问题:
当我在命令行中不通过平台时,平台会是什么?
它将由该行设置,在本例中为 AnyCPU。
当我通过 x86 而不是 AnyCPU 时会发生什么?
然后您将获得所需的平台选择,x86。
请注意,
<Platform>
在纯 C# 项目中毫无用处。这对于 C++ 项目非常重要,因为构建 C++ 项目时必须使用不同的工具集,它需要使用 32 位或 64 位编译器和链接器。 ARM 内核的编译器/链接器与 Intel 内核有很大不同。 C# 的情况并非如此,您使用完全相同的编译器并且获得完全相同的程序集。抖动是在运行时处理处理器架构的抖动。
唯一有影响的属性是
<PlatformTarget>
。你总是喜欢AnyCPU
,尤其是在类库项目上。如果您知道自己依赖于 32 位非托管代码,您可能会想要在 EXE 项目上使用 x86
(首选 VS2012 及更高版本中的 32 位)。但这是您预先知道的一个硬事实,当您构建 EXE 时,选择在 AnyCPU 和 x86 之间切换是没有意义的。因此拥有多个平台是没有意义的,只有一个就足够了。这最终解决了你的问题,只是消除了选择。