【问题标题】:Can we create a VC++ executable which will work natively on both 32 bit and 64 bit Windows?我们可以创建一个 VC++ 可执行文件,它可以在 32 位和 64 位 Windows 上本地运行吗?
【发布时间】:2011-04-05 04:31:36
【问题描述】:
有什么方法可以构建一个 VC++ 项目,以便它创建的 dll/exe 在 32 位 Windows 操作系统上作为 32 位应用程序工作,在 64 位 Windows 操作系统上作为 64 位应用程序工作(不是在 WOW64 中) )。
我知道 C# 应用程序可以使用 /ANYCPU 选项。
【问题讨论】:
标签:
c++
visual-c++
visual-studio-2010
compatibility
32bit-64bit
【解决方案1】:
CLR 对 /ANYCPU 选项有特殊的加载器支持。
如果您真的想为本地人这样做,最好的方法是:
- 为 32 位和 64 位构建二进制文件
- 作为构建 32 位二进制文件的一部分,将 64 位二进制文件包含为资源
- 在 32 位机器上,只需运行 32 位二进制文件
- 在 64 位机器上,当 32 位二进制文件运行时,解压 64 位二进制资源,将其写入磁盘,然后从那里运行
这就是Sysinternals 工具的工作方式(将 Process Explorer 下载到 64 位机器上并运行它:您会看到它将 procexp64.exe 写入磁盘,然后从那里运行)。这是一个 hack,但它有效。
【解决方案2】:
不是 AFAIK - 问题在于
- 您需要单独的代码;这适用于 C#,因为您正在生成 .NET IL,它会在目标系统上转换为本机代码
- windows PE 格式只有一个图像头,以后无法链接到另一个头以将两组代码放在同一个库中。
您可以为 .EXE 做的最好的事情是发布一个 32 位 .exe,检查它是否在运行 WOW64,然后生成 64 位版本。不过,我想不出库的等效技巧 - 它必须首先匹配主机进程的位才能加载。