我们能否创建一个可在32位和64位Windows上本地运行的VC++可执行文件?

7

有没有办法构建一个VC++项目,使其创建的dll/exe在32位Windows操作系统上作为32位应用程序工作,在64位Windows操作系统上作为64位应用程序工作(不是在WOW64中)。

我知道对于使用/ANYCPU选项的C#应用程序来说,这是可能的。

2个回答

10

对于 /ANYCPU 选项,CLR 有特殊的加载器支持。

如果你真的想在本地环境下运行此选项,最好的方式是:

  1. 为32位和64位分别构建二进制文件
  2. 在构建32位二进制文件时,将64位二进制文件作为资源包含
  3. 在32位机器上,只需运行32位二进制文件
  4. 在64位机器上,当运行32位二进制文件时,解压缩64位二进制资源,将其写入磁盘并从该位置运行

这就是Sysinternals工具的工作原理(在64位机器上下载Process Explorer并运行它:您会看到它将procexp64.exe写入磁盘,然后从那里运行)。这是一个技巧,但它有效。


5
我不认为可以这样做-问题在于:
  1. 你需要写不同的代码,因为C#生成的是.NET IL,会在目标系统上转换为本机代码。
  2. Windows PE格式只有一个映像头,并且没有办法链接到后面的另一个头文件,以将两组代码放入同一个库中。
对于.EXE文件而言,最好的解决方法是提供一个32位的.EXE文件,检查是否正在运行WOW64,然后启动64位版本。但是,我无法想出库的等效技巧-必须与主机进程的位数匹配才能加载。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接