【问题标题】:Compile for intel x86 from an ARM从 ARM 编译英特尔 x86
【发布时间】:2021-12-28 23:17:22
【问题描述】:

我有一台配备 M1 芯片的 MacBook Pro。我已经安装了 Parallels Desktop 17,因为我需要在 Windows 和 .NET 平台下开发。我在 ARM 上虚拟化了 Windows 11 并安装了 Visual Studio 2019(以及 2022)。尝试同时安装 Visual Studio 时,会出现一条警告消息,指出 M1 芯片不支持它,并且可能不稳定且速度慢。无论如何,我已经安装了它们,我看到性能很好(不慢),而且它看起来很稳定,并且通过从下拉列表中选择 x86 架构作为目标,我已经能够毫无问题地构建 .NET 解决方案。所以我想知道生成的二进制文件是否真的是 x86。那么它们是作为 x86 还是 ARM 生成的?如果它们是作为 x86 生成的,那怎么可能呢?是否有任何 x86 仿真层可以这样做?

【问题讨论】:

  • .NET 编译为独立于平台的 IL。当您运行应用程序时,它是即时 (JIT) 编译到目标体系结构的。所以“二进制文件真的是 x86 吗?”:不,它们是 IL。
  • @DanielMann 据我所知,根据您的评论,中间语言 IL(与平台无关)一旦应用程序正在运行。此机器代码特定于运行 JIT 编译器的计算机环境,因此当我在 x86 英特尔平台(假设是英特尔 PC,而不是 Mac)上执行此应用程序时,代码将毫无问题地执行。我说的对吗?

标签: .net visual-studio-2019 apple-m1 parallels visual-studio-2022


【解决方案1】:

如果您知道 .NET 编译是如何在后台进行的,那么答案就很明显了。

首先,您的源文件(C# 或 F# 或任何其他语言)被编译为 MSIL 并以 PE 格式存储,

https://en.wikipedia.org/wiki/Portable_Executable

其次,在大多数情况下,即使您将编译选项从 Any CPU 更改为 x86/x64/ARM64,MSIL 代码也保持不变,唯一可见的变化是 CORFLAGS,

https://docs.microsoft.com/en-us/dotnet/framework/tools/corflags-exe-corflags-conversion-tool

请注意,您可以使用 corflags.exe 等工具在编译后轻松翻转标志。

现在回到你的问题。如果您想知道某个程序集是否针对 x86,请分析其 CORFLAGS。在 ARM64 机器上生成 x86 程序集不需要任何魔法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2015-09-29
    • 2014-04-02
    • 2021-08-08
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多