Msbuild CLI platform=x64 和项目文件属性 x64 给出不同的结果

2024-07-03

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

我制作了两个简单的 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。

问题是,每当我使用时,我都会收到 MSB3270 错误消息(编译 HsConsole 时)/p:"Platform=x64"在 MSbuild 命令行上,但当我在命令行上不使用参数时则不会。<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> to <PlatformTarget>x64</PlatformTarget>x64 参数被传递给编译器/p:Platform=x64(注意:传递给编译器的参数是 Platform 而不是 PlatformTarget)。

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

要点

<Platform> and <PlatformTarget>项目文件中有两个不同的东西。这<Platform>Clean 目标使用该值来删除文件夹,但不会传递给编译器。相比之下,值<PlatformTarget>被翻译成/p:Platform=value,传递给编译器,并控制编译器创建的输出二进制文件的类型。

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

/p:Platform=value在命令行上,/p:PlatformTarget=value在命令行上,以及<PlatformTarget>value</PlatformTarget>出于编译目的,项目文件中的内容都是相同的。它们都会导致值被传递给编译器。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Msbuild CLI platform=x64 和项目文件属性 x64 给出不同的结果 的相关文章

  • 如何使用异步来提高 WinForms 性能?

    我正在执行一些处理器繁重的任务 每次我开始执行该命令时 我的 winform 都会冻结 直到任务完成之前我什至无法移动它 我使用了微软的相同程序 但似乎没有任何改变 我的工作环境是 Visual Studio 2012 和 net 4 5
  • WPF DataGrid 行标题可见性错误

    我正在使用 DataGrid 来显示多个字段 其中之一是多行描述 网格显示数据很好 直到我尝试通过设置隐藏标题行HeadersVisibility Column 标题行消失 但当我滚动时 某些随机行的行标题会重新出现 我已将其范围缩小到显示
  • 在派生虚函数中强制执行正确的参数类型

    我发现很难非常简洁地描述这个问题 所以我附上了演示程序的代码 总的想法是 我们需要一组派生类 它们被迫从基类实现一些抽象 Foo 函数 每个派生的 Foo 调用都必须接受不同的参数作为输入 但所有参数也应该从 BaseInput 类派生 到
  • 如何在 Blazor Web 程序集中检查客户端连接状态

    我有一个 Blazor webasemmbly 应用程序 它使用 asp net core 作为后端 使用 Blazor wasm 作为前端 我有一个类可以检查 HTTP 问题 例如 notfound BadReqest 和 public
  • 函数 try 块什么时候有用?

    我想知道程序员何时使用函数 try 块 什么时候有用 void f int i try if i lt 0 throw less than zero std cout lt lt greater than zero lt lt std en
  • TortoiseGit / Winforms:合并时解析 Resource.resx

    我对 TortoiseGit 还很陌生 想知道如果 resx 文件发生冲突 如何在合并过程中解决它 例如 我可以从菜单中选择 使用他们的 尝试进行拉动和推动 但这是正确的方法吗 我可以以某种方式使用他们的并通过我的项目更改重建它吗 差异 以
  • 如何在C#中隐藏文件?

    我想在c 中隐藏一个文件 我知道文件路径并且可以创建 FileInfo 对象 我怎样才能隐藏它 之前接受的答案 File SetAttributes path FileAttributes Hidden 将导致它可能丢失某些其他属性 因此您
  • 如何使用 MVVM light 处理 WP 8.1 上的后退按钮?

    我正在寻找适当的方法来处理 Windows Phone 8 1 WinRT 上的后退按钮按下事件NavigationService在 MVVM light 5 上可用 到目前为止 我认为最好的地方是在ViewModelLocator通过注册
  • 基本镜面着色

    我正在使用一个生成阴影球体的简单代码 我还没有完全理解数学 但我在玩代码时正在弄清楚它 我想知道如何根据这段代码实现镜面反射着色 有什么建议么 for y 0 y
  • pthread 线程状态

    是否有一种机制可以用来判断 pthread 线程当前是否正在运行或已退出 如果线程尚未退出 pthread join 是否有一种方法能够在特定时间段后超时 如果您仅针对 Linux 请使用http www kernel org doc ma
  • 如何获得 firebird 数据库上的独占锁以执行架构更改?

    更具体地说 我正在使用 firebird 2 1 和 Visual Studio 的 DDEX Provider 并且我正在使用 c 工作 我遇到一种情况 我试图将模式更改从 C 应用到数据库 以 更新 我的数据库 在此过程中 我从 fir
  • LINQ to SQL 未映射的属性

    是否可以在设计器中添加自定义属性并且不将其绑定到列 我摆弄了一些设置 决定用该属性创建一个部分类 有没有办法在 ORM 设计器中显示这个字段 LINQ to SQL 设计器正在维护映射 未映射的属性需要放入单独的分部类中
  • 创建新选项卡并管理它们 - Selenium

    这是我的代码 var chromeOptions new ChromeOptions chromeOptions AddArguments headless driver new OpenQA Selenium Chrome ChromeD
  • 使用Swashbuckle ISchemaFilter设置输入参数的默认描述

    我想在文档架构中为所有具有 DateTime 类型的输入参数添加默认描述 这样客户就会了解我们正在使用哪些格式等 我可以为此目的创建 ISchemaFilter 的自定义实现吗 我知道我可以使用 xml 注释添加描述 但在这种情况下 我应该
  • 在 ASP.NET MVC 2.0 中编辑实体框架中的对象并将其保存到数据库中

    所以我知道 EF 实体会跟踪它们自己的更改 并在调用 savechanges 时将它们保存到数据库中 但是这种情况怎么样 我有一个旨在编辑博客文章的页面 它有两种操作方法 HttpGet public ViewResult EditBlog
  • Blazor - 重定向到一个解决方案中另一个项目中的页面

    我遇到了这样的情况 在一个解决方案中 想要将用户从一个项目的页面重定向到另一个项目的页面 这很重要 我在 blazor 服务器上做 任何人都可以教我一些东西吗 您始终可以注入 NavigationManager 通过此您可以将用户重定向到另
  • 如何在 JObject 中添加或更新 JProperty 值

    我目前正在使用以下扩展方法来执行此任务 但似乎应该有一些现有的包含方法或扩展来执行此任务 或至少是其中的一个子集 如果里面没有任何东西Json NET那么推荐的流程是什么 或者我如何更改下面的代码以更接近推荐的流程 public stati
  • 将字符串中的每个字符转换为 ASCII

    谁能告诉我如何轻松地将字符串中的每个字符转换为 ASCII 值 以便我可以对这些值求和 我需要对哈希函数的值求和 字符串中的每个字符都已经是 ascii include
  • 在头文件 (.h) 中声明构造函数然后在类文件 (.cpp) 中定义 C++ 的语法 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果有人可以解决这个问题 我将不胜感
  • 谷歌模拟 - 我可以在同一个模拟对象上多次调用 EXPECT_CALL 吗?

    如果我打电话EXPECT CALL在同一个模拟对象上两次TEST F 会发生什么 期望是否附加到模拟对象中 或者第二次调用是否消除了第一次调用的效果 I found 后子句 https github com google googletes

随机推荐