Msbuild CLI 平台 = x64 和项目文件属性 <Platform>x64</Platform> 给出不同的结果



这个问题是关于在 MSBuild 命令行上使用/p:Platform=x64与在 csproj 文件中使用<Platform>x64</Platform>之间的区别。

我制作了两个简单的 c# NET 5 解决方案/项目,其中一个可执行文件 (HsConsole) 和一个类库 (HsLogger) 来调查何时发生MSB3270体系结构不匹配。下面是一个示例错误消息。

warning MSB3270: There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "HsLogger", "AMD64". 

** 请注意,错误消息涉及 MSIL (hsconsole) 和 AMD64 (hslogger),即使命令行和项目文件都指定了 x64 而不是 AMD64。

HsLogger 记录器使用后期生成事件将类库复制到存储库的文件夹中,以便在项目之间共享。HsConsole 项目引用该文件夹中的类库 HsLogger。

问题是每当我在 MSbuild 命令行上使用/p:"Platform=x64"时,我都会收到MSB3270错误消息(编译 HsConsole 时),但当我在命令行上不使用任何参数时则不会。 在这两种情况下,<Platform>x64</Platform>已在 HsLogger 项目文件中声明。

下面是两个项目文件:

HsLogger
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Platform>x64</Platform>
<TargetFramework>net5.0-windows7.0</TargetFramework>
</PropertyGroup>
</Project>
HsConsole
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Platform>AnyCPU</Platform>
<TargetFramework>net5.0-windows7.0</TargetFramework>
</PropertyGroup>
</Project>

以下是实验结果的摘要:

MSBuild hslogger.csproj /t:clean;restore;build -> compiles okay
MsBuild hsconsole.csproy /t:clean;restore;build -> no MSB3270 error
MSBuild hslogger.csproj /t:clean;restore;build /p:Platform=x64 -> compiles okay
MsBuild hsconsole.csproj /t:clean;restore;build -> gives MSB3270 error as shown above

** 请注意,错误消息涉及 MSIL (hsconsole) 与 AMD64 (hslogger)。

问题 1.为什么当仅使用 x64 时,错误消息中会出现 AMD64?

问题 2.当命令行和内部属性都指定 x64 时,为什么会产生错误消息?

我仔细检查了用于执行上述命令的 MSBuild 命令的批处理文件输出。特别是,MSBuild 发出的巨大 csc 编译器命令仅当在命令行上提供参数/p:Platform=x64时才包含参数/p:Platform=x64

如果命令行上未给出参数,则 csc 编译器命令不包含 csproj 文件中指定的 x64 参数。换句话说,项目文件中的<Platform>x64</Platform>属性不会导致 MSBuild 将 x64 传递给编译器命令。这对我来说是不直观的。我的期望是项目文件中<Platform>x64</Platform>会将 x64 传递给编译器是不正确的。

然后在项目文件中,我将<Platform>x64</Platform>更改为<PlatformTarget>x64</PlatformTarget>,x64 参数作为/p:Platform=x64传递给编译器(注意:传递给编译器的参数是平台而不是平台目标)。

最后,当在 Msbuild 命令行上给出/p:PlatformTarget=x64时,它产生的结果与仅在项目文件中<PlatformTarget>x64</PlatformTarget>的结果相同。在这两种情况下,发生MSB3270是因为类库被编译为 x64,而 hsconsole 程序(使用库)被编译为 AnyCPU。

外卖

项目文件中的<Platform><PlatformTarget>是两个不同的东西。<Platform>值由 Clean 目标用于删除文件夹,但不会传递给编译器。相反,<PlatformTarget>的值被转换为/p:Platform=value,被传递给编译器,并控制编译器创建的输出二进制文件的类型。

PlatformTarget甚至没有列在通用 MSBuild 项目属性页中,即使它是传递给 csc 编译器的最终 XML 元素。 https://learn.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-properties

/p:Platform=value在命令行上、/p:PlatformTarget=value在命令行上以及项目文件中的<PlatformTarget>value</PlatformTarget>在编译中都是一回事。它们都会导致将值传递给编译器。

我对错误消息的AMD64部分的猜测是它来自我的开发计算机,该计算机在主板上包含一个AMD CPU处理器。

最新更新