为什么我能够将 x64 程序集加载到 AnyCPU Prefer 32 位可执行文件中?

Why am I Able to load x64 assembly into AnyCPU Prefer 32 bit executable?

我正在开发一种工具,它使用 System.Reflection 的方法 Assembly.Load 加载不同的程序集 这是我得到的 在 64 位 OS 上,如果应用程序配置为:

现在,当它在 64 位上配置 AnyCPU Prefer 32 位时 OS,它将在 32 位进程上 运行 如此处所述

In .NET 4.5 and Visual Studio 11 the cheese has been moved. The default for most .NET projects is again AnyCPU, but there is more than one meaning to AnyCPU now. There is an additional sub-type of AnyCPU, “Any CPU 32-bit preferred”, which is the new default (overall, there are now five options for the /platform C# compiler switch: x86, Itanium, x64, anycpu, and anycpu32bitpreferred). When using the "Prefer 32-Bit" flavor of AnyCPU, the semantics are as follows:

  • If the process runs on a 32-bit Windows system, it runs as a 32-bit process. IL is compiled to x86 machine code.
  • If the process runs on a 64-bit Windows system, it runs as a 32-bit process. IL is compiled to x86 machine code.
  • If the process runs on an ARM Windows system, it runs as a 32-bit process. IL is compiled to ARM machine code.

The difference, then, between “Any CPU 32-bit preferred” and “x86” is only this: a .NET application compiled to x86 will fail to run on an ARM Windows system, but an “Any CPU 32-bit preferred” application will run successfully.

我的问题是:为什么加载 x64 程序集没有任何问题?这不是一种奇怪的行为吗?

我看过这个问题ODP.NET x64 ANYCPU and Prefer 32-bit setting支持这个命题

.NET 程序集(exe 和 dll)不包含 x86/x64 程序集。它们包含IL(中间语言),即architecture-independent。在 运行 时间,JIT 将 IL 适当地转换为 x86/x64 机器代码。

“任何 CPU”和“首选 32 位”设置等仅更改程序集 header 中的某些位,告诉 JIT 在 运行时间。只有 .exe 的 header 中的位很重要:exe 指示 JIT 将发出什么,以及 JIT 是否发出,例如x86 对于 exe,它将对加载到该进程中的所有其他程序集执行相同的操作。

现在,将设置了“x86”标志的 dll 加载到 JIT 为其发出 x64 的进程中可能不是一个好主意:大概 dll 有指定 x86 的原因,这可能是因为它正在调用一些为 x86 编译的本机代码。如果您在 x64 进程中强制它 运行,那么它将无法再调用该 x86 本机代码。

(请注意,自从您发现该引用以来,情况发生了变化:.NET Core 现在忽略“首选 32 位”,并且 AnyCPU 默认为 x64)。

AnyCPU 选项允许可执行二进制文件中的 .NET 虚拟 IL 代码在 32 位和 64 位计算机上 运行。

AnyCPU 更喜欢 32 位指示 运行 x64 机器上 32 位兼容模式下的进程,当然除非某些原因阻止了它。

它是 运行 时的参数,而不是编译时的参数,如 所述。

What is the purpose of the "Prefer 32-bit" setting in Visual Studio and how does it actually work?

如果应用程序加载了64位DLL,则意味着代码被执行了(translated) in 64-bits native machine code,否则我们会得到一个系统错误框。

拥有virtual assembly for a virtual OOP (single inheritance yet) computer是DotNet的目的。

如果我们使用任何任务管理器查看,我们会发现该进程确实是 x64 而不是 x32。

以下链接中有关 x32-x64 的内容适用于 x64-x32:

Is it possible to load a 64-bit dll into a 32-bit process?

Calling 32bit Code from 64bit Process

Load 32bit DLL library in 64bit application

Process Interoperability

为了能够加载与最高架构不同的 DLL,我们需要某些东西,例如创建沙箱。例如,Renoise 可以 运行 32 位 VST,而 DAW 是 64 位。