1

谷歌给了我一个线索,可以将代码编译成单个可执行文件,在 32 位操作系统上以 32 位运行,在64 位操作系统上以 64 位运行。可执行文件真的有可能在运行时确定其位数吗?

在我的情况下,目标系统是Windows 7 Professional x64and Windows XP SP3 x86

所以我在各种文章中读到的(我认为在 SO 上什至有类似主题的答案)是必须去Soltuion's Configuration ManagerRMB 到 Solution -> Configuration Manager)并将 's 设置PlatformAny CPU

Configuration Manager现在所有这些文章都描述了旧 MSVS 或 MSVC++ 版本的设置,但我认为2013 RC 版本(我刚刚安装)没有重大变化。

Active Solution下拉列表中我没有选项Any CPU,所以我按照我在 SO 上找到的这个食谱进行操作。在我的情况下,按照这个小指南失败了,在执行第 5 步时,我仍然没有选择的选项Any CPU

  • 5) 确保在 New Platform 下选择了“Any CPU”。如果在第 3 步中没有任何 CPU 解决方案平台,请确保选中“创建新的解决方案平台”复选框。然后单击确定。

我可以使用的下拉项目是x64ARMWin32也是,但默认情况下已经添加),我无法选择Any CPU

添加目标平台x64并编译可执行文件工作正常,程序在 Windows 7 x64 上以 64 位运行,但当然不能在 32 位 Windows XP 机器上运行。

如何Any CPUMicrosoft Visual Studio Professional 2013 RC中设置目标平台?

4

5 回答 5

2

不,绝对不是。您需要定义单独的可执行文件。

“任何 CPU”下拉菜单允许您为多个平台设置编译器设置(例如,用于 x64 和 Win32 的 _DEBUG 处理器)您实际上无法构建到该目标。

于 2013-09-16T15:46:32.970 回答
2

也许不是一个真正的答案,但对于大多数事情来说,在 64 位系统上运行 32 位代码绝对可以正常工作。当然,它的运行速度可能会慢一些,但与必须处理(并彻底测试)两个不同的二进制文件相比,除非它在 ​​64 位模式下具有显着的性能优势(或者您的应用程序使用超过 2GB 的内存空间),我很想使用 32 位模式。

于 2013-09-16T16:08:06.530 回答
2

AnyCPU refers to .Net programs, not C++. C++ must compile down to native, either x86 or x64. You could build 64 bit program and bundle it into your 32 program, extracting it at runtime. This technique is used by ProcessExplorer.

于 2013-09-16T15:49:26.187 回答
1

您可以将 .NET 包装器(任何 CPU)和程序的其余部分编译为 yourprogram86.dll 和 yourprogram64.dll

[DllImport("yourprogram32.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "open")]
public static extern void open32();

[DllImport("yourprogram64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "open")]
public static extern void open64();       

static bool Is64()
{
    //.Net 4.0
    //Environment.Is64BitOperatingSystem

    //.Net 2.0
    return IntPtr.Size == 8;
}

static void open()
{
  if (Is64())
    open64();
  else
    open32();
}
于 2014-03-30T19:51:04.677 回答
1

MacOS 支持称为“胖二进制文件”的东西,其中程序被编译两次,两个版本都打包到一个文件中。操作系统决定实际启动哪个版本。

Windows 没有类似的东西。

于 2013-09-16T15:53:24.273 回答