Msbuild CLI platform=x64 和项目文件 属性 <Platform>x64</Platform> 给出不同的结果
Msbuild CLI platform=x64 and project file property <Platform>x64</Platform> give different results
这个问题是关于在 MSBuild 命令行上使用 /p:Platform=x64
与在 csproj 文件中使用 <Platform>x64</Platform>
之间的区别。
我用一个可执行文件 (HsConsole) 和一个 class 库 (HsLogger) 制作了两个简单的 c# NET 5 solutions/projects 来调查何时发生 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 记录器使用 post-build 事件将 class 库复制到存储库的文件夹,以便在项目之间共享。 HsConsole 项目从该文件夹引用 class 库 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) 的。
Q1。为什么仅使用 x64 时错误消息中出现 AMD64?
Q2。当命令行和内部 属性 都指定 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
传递给编译器(注意:传递给编译器的参数是 Platform而不是 PlatformTarget)。
最后,当在 Msbuild 命令行上给出 /p:PlatformTarget=x64
时,它产生的结果与单独在项目文件中的 <PlatformTarget>x64</PlatformTarget>
相同。在这两种情况下,MSB3270 的发生是因为 class 库被编译为 x64,而 hsconsole 程序(使用该库)被编译为 AnyCPU.
外卖
项目文件中的<Platform>
和<PlatformTarget>
是两个不同的东西。 <Platform>
值由 Clean 目标用于删除文件夹,但不会传递给编译器。相反,<PlatformTarget>
的值被翻译成 /p:Platform=value
,传递给编译器,并控制编译器创建的输出二进制文件的类型。
PlatformTarget
甚至没有在 Common MSBuild 项目属性页中列出,即使它是传递给 csc 编译器的最终 XML 元素。
https://docs.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-properties
命令行上的 /p:Platform=value
、命令行上的 /p:PlatformTarget=value
和项目文件中的 <PlatformTarget>value</PlatformTarget>
对于编译目的都是一样的。它们都会导致将值传递给编译器。
我对错误消息的 AMD64 部分的猜测是它来自我的开发计算机,它在主板上包含一个 AMD CPU 处理器。
这个问题是关于在 MSBuild 命令行上使用 /p:Platform=x64
与在 csproj 文件中使用 <Platform>x64</Platform>
之间的区别。
我用一个可执行文件 (HsConsole) 和一个 class 库 (HsLogger) 制作了两个简单的 c# NET 5 solutions/projects 来调查何时发生 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 记录器使用 post-build 事件将 class 库复制到存储库的文件夹,以便在项目之间共享。 HsConsole 项目从该文件夹引用 class 库 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) 的。
Q1。为什么仅使用 x64 时错误消息中出现 AMD64?
Q2。当命令行和内部 属性 都指定 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
传递给编译器(注意:传递给编译器的参数是 Platform而不是 PlatformTarget)。
最后,当在 Msbuild 命令行上给出 /p:PlatformTarget=x64
时,它产生的结果与单独在项目文件中的 <PlatformTarget>x64</PlatformTarget>
相同。在这两种情况下,MSB3270 的发生是因为 class 库被编译为 x64,而 hsconsole 程序(使用该库)被编译为 AnyCPU.
外卖
项目文件中的<Platform>
和<PlatformTarget>
是两个不同的东西。 <Platform>
值由 Clean 目标用于删除文件夹,但不会传递给编译器。相反,<PlatformTarget>
的值被翻译成 /p:Platform=value
,传递给编译器,并控制编译器创建的输出二进制文件的类型。
PlatformTarget
甚至没有在 Common MSBuild 项目属性页中列出,即使它是传递给 csc 编译器的最终 XML 元素。
https://docs.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-properties
/p:Platform=value
、命令行上的 /p:PlatformTarget=value
和项目文件中的 <PlatformTarget>value</PlatformTarget>
对于编译目的都是一样的。它们都会导致将值传递给编译器。
我对错误消息的 AMD64 部分的猜测是它来自我的开发计算机,它在主板上包含一个 AMD CPU 处理器。