【问题标题】:"win-x86" or "win-x64" target runtime for Any CPU?任何 CPU 的“win-x86”或“win-x64”目标运行时?
【发布时间】:2021-10-22 17:51:48
【问题描述】:

多年来,我一直在“任何 CPU”配置下构建我的应用程序。但是我已经更新到 .Net 5,决定使用发布功能,它要求在目标运行时隐式选择“win-x86”和“win-x64”选项。

我认为“任何 CPU”的全部内容是构建的应用程序不在 x86 和 x64 之间进行选择? ???我现在该怎么办?

【问题讨论】:

  • 这可能是因为self-contained表示运行时是嵌入的,所以你必须选择应该嵌入哪个运行时。
  • @riQQ 但是“framework-dependent”版本也会询问目标运行时:) 唯一的区别是“portable”选项出现在该列表中。
  • SO 用于编程问题
  • @Vega 那么,例如this question,也应该出局吗?
  • @Vega 编程工具(如 Visual Studio)是这里的主题。见stackoverflow.com/help/on-topic:《程序员常用的软件工具》。

标签: .net visual-studio .net-5


【解决方案1】:

发布应用时,需要指定目标架构,因为编译器将为项目创建一个特定于架构的存根加载器(在 Windows 中,“exe”文件)。

在 .NET Core 中,所有 C# 项目(无论是应用程序还是库)都编译为 .dll 文件。这些 .dll 文件与平台无关,或 AnyCPU(当然,除非它们包含只能在某些操作系统上运行的代码,例如 P/Invoke 调用)。以这种方式编译的应用程序可以通过dotnet <DllName>命令运行。

现在这并不方便,因为人们期望一个“exe”文件来启动程序。这个 exe 文件(或 unix 的等效“无扩展名”文件)是由发布命令创建的,除了将所有内容复制在一起。与主.dll同名的exe文件是stub-loader,基本调用dotnet <myapp.dll>,即使发布依赖框架的应用程序。这就是为什么即使是针对 AnyCpu 的程序也需要依赖于平台的发布步骤。

[注意:在 Windows 上,exe 文件可能已经在构建步骤中创建,因为 VS 使用它。但您会注意到,对于您的所有应用,它始终具有大致相同的大小。]

【讨论】:

  • 抱歉,还是没搞定,为什么我必须指定目标运行时 :) 存根加载器不能是任何 CPU 吗?但是还有一件事——我已经尝试过dotnet publish,它允许在不指定运行时的情况下发布依赖于框架的版本——如果我尝试对自包含标志执行相同操作,则会引发错误。所以这可能只是 GUI 问题?..
  • 存根加载器是一个依赖于操作系统的原生应用程序。它是为特定操作系统和 CPU 编写的(小型)应用程序,因为 .NET 二进制文件不能直接在 CPU 上运行。他们需要一个“解释器”,而那个解释器就是 .NET 运行时。但它必须首先以依赖于操作系统的方式加载。
  • dotnet publish without target 可能只是为当前平台发布,隐含地假设这就是你想要的。 GUI 更加明确,因为它没有“默认”选项。
  • 但是为什么当我在 .Net Framework 4.8 上的任何 CPU 应用程序上按“发布”时 - 它没有询问目标运行时? :)
  • 为确保,您可以使用 x86 VM 进行检查,但不太可能出现任何问题。如果X86版本可以在X64电脑上运行,那么肯定也可以在纯X86上运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多