【问题标题】:How is 'Any CPU' implemented?“任何 CPU”是如何实现的?
【发布时间】:2012-02-14 09:53:01
【问题描述】:

“Any CPU”是如何在底层实现的?

不是有两种格式:PE32 和 PE64 吗? Windows x86 和 x64 都可以运行 32 位。但是,它不是通过在 32 位内部有一个 64 位可执行文件并在内存中运行它来实现的,因为这样该进程将具有与启动器不同的 ID。那么他们是怎么做到的呢?

【问题讨论】:

    标签: .net winapi assemblies reverse-engineering


    【解决方案1】:

    在他的argument against Any CPU 中,Rick Byers 还包含了一些与此问题相关的背景信息:

    由于我们希望人们能够编写可以在 32 位和 64 位进程中重复使用的 .NET 库,我们与 Windows 合作扩展了对操作系统加载程序的支持,以实现架构中立("AnyCPU") PE 文件。

    查看上面的链接了解更多详细信息。

    【讨论】:

    • 感谢您的链接。但这是否意味着 AnyCpu 仅适用于 .NET 应用程序?可以从非托管语言中使用吗?
    • @blez:您可能知道,托管代码是在运行时 JIT 编译的。对于“任何 CPU”目标,.NET JIT 编译器可以选择生成 32 位或 64 位特定字节码。另一方面,非托管代码在编译时直接编译为特定于平台的字节码。因此,非托管二进制文件直接与平台相关联,无法针对通用“任何 CPU”平台进行编译。
    • 我已经知道了。但是我可以创建一个空的 AnyCPU 可执行文件,在没有安装 .NET 的情况下运行吗?
    • 我不想运行任何 .NET 代码,这是为了我的 JIT。我只想在两个平台上运行可执行文件。
    • @blez:托管二进制文件需要 .NET 可以在任何平台(无论是 x86、x64 还是任何 CPU)下运行。您不能生成非托管的“任何 CPU”类型的二进制文件。
    【解决方案2】:

    PE32 针对 .NET 进行了扩展。平台标志只指定了可执行文件的运行位置,并且可以使用CorFlags.exe 进行更改。这篇文章对the .NET File Format有很好的描述。

    【讨论】:

    • 所以我不能创建一个空的 AnyCPU 可执行文件,在没有安装 .NET 的情况下运行?
    • 您需要安装 .NET 可再发行包,其中包括运行 .NET 应用程序所需的 .NET 加载程序和 .NET 框架。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2011-01-15
    相关资源
    最近更新 更多