【问题标题】:Any CPU - Prefer 32 bit任何 CPU - 首选 32 位
【发布时间】:2012-10-20 10:28:43
【问题描述】:

Any CPU - Prefer 32 位选项有什么作用?

虽然我知道 WinRT 无法处理 exe 并且只能运行 Windows 应用商店应用程序,但 StackOverflow 上的几个问题 exist 提出了相同的问题,并且都引用了这个 blog 说:

在 .NET 4.5 和 Visual Studio 11 中,奶酪已被移动。默认 对于大多数 .NET 项目来说,又是 AnyCPU,但不止一个 现在对 AnyCPU 的意义。 AnyCPU 有一个额外的子类型,“Any CPU 32 位首选”,这是新的默认值(总体而言,有 现在 /platform C# 编译器开关有五个选项:x86、Itanium、 x64、anycpu 和 anycpu32bitpreferred)。当使用那种味道的 AnyCPU,语义如下:

  • 如果进程在 32 位 Windows 系统上运行,它以 32 位系统运行 过程。 IL 被编译成 x86 机器码。
  • 如果进程在 64 位 Windows 系统上运行,它以 32 位系统运行 过程。 IL 被编译成 x86 机器码。
  • 如果进程在 ARM Windows 系统上运行,它将作为 32 位进程运行。 IL 被编译成 ARM 机器码。

但是,在购买我的 Surface RT 后,我创建了一个 Hello World 程序,将其设置为 Any CPU,选中 Prefer 32 Bit 标志,编译并将其复制到我的 Surface。当我运行该程序时,操作系统告诉我它无法运行该程序,我应该像对待任何 x86/x64 exe 一样关注市场。显示的确切消息是:“此应用无法在您的 PC 上运行。要查找此 PC 的应用,请打开 Windows 应用商店。”

那么这实际上是做什么的,是否可以在 ARM 上为 Window RT 编译 Any CPU 应用程序?

【问题讨论】:

  • 操作系统告诉您它无法运行程序的原因是什么?是因为 CPU 不兼容,还是其他原因?
  • 更新问题。显示的确切消息是:“此应用程序无法在您的 PC 上运行。要查找此 PC 的应用程序,请打开 Windows 应用商店。”尝试运行其他 exe(例如 Chrome 安装程序)时出现相同的消息。
  • Windows RT 无法运行桌面应用程序(普通 .exe 文件)。您必须创建一个市场应用程序才能在表面上运行它。
  • @m0sa:正确,这也是我的理解。但是,当我提出博客文章和 StackOverflow 问题时,我决定研究 Any CPU - 32 bit Preferred 的实际作用。该博客文章在互联网上以及 StackOverflow 上的多个地方都被引用,因此我正在尝试确定它是否有一些优点。
  • 只需获得开发者许可证:msdn.microsoft.com/en-us/library/windows/apps/hh974578.aspx 这样您就可以将应用部署到您的机器上

标签: c# visual-studio-2012


【解决方案1】:

仅根据您指定的报价,它表明它的含义如下:

  • 如果 CPU 支持 32 位处理,那么最终的机器码将是 32 位(ARM 或 x86,无所谓)。

  • 如果不是,则机器码为 64 位。

在过去,AnyCPU 的意思是“我与平台无关”。这通常意味着您将在 64 位平台上获得 64 位,否则将获得 32 位。

但是,即使在 64 位 CPU 上,您也可能需要 32 位是有原因的:指针大小只有一半,因此您使用的内存更少;代码更小,因此更适合缓存等。但是,没有办法强制 CLR 使用 32 位,并且在必要的情况下仍保留 64 位。

现在,使用 AnyCPU - 首选 32 位,您可以拥有自己的蛋糕(必要时支持 64 位)并吃掉它(可能时支持 32 位)

注意:如果我没记错的话,Itanium 将是一个只支持 64 位而不是 32 位代码的平台。可能有也可能没有。

免责声明:我不是专家,这只是来自我在过去 6 个月左右阅读的各种博客文章

【讨论】:

  • WoW64 是服务器上的可选安装
  • 如果用户可以选择有一天他内存不足并且只想让应用程序针对小数据运行,那么 32 位就足够了,而另一天他可以运行具有完整 64 位支持的 AnyCPU 应用程序。或者使用 DirectShow(或其他类似框架)的应用程序可以(将!)在使用 x86 或 x64 时表现完全不同。
  • 我的理解是 Ia64 与常规 x64 不兼容——您必须专门针对 Ia64,对吗?
  • 是否在 64 位之前使用 32 位或反之亦然的争论还没有真正好的答案。双方各有利弊,因为 64 位处理器处理 64 位变量比 32 位变量更快,但它们占用更多内存等。
【解决方案2】:

Windows RT 需要对 exe 文件进行签名才能运行。但是,如果您jailbreak 您的 RT,那么它可以运行 任何 exe 文件,只要它在 ARM(.NET 或原生 ARM)应用程序上的 Windows 上受支持

What AnyCPU Really Means As Of .NET 4.5 and Visual Studio 11 上有关此选项的更多信息

【讨论】:

  • "the cheese has beenmoved" -- 链接到提出这个问题的博文可能会造成堆栈溢出 ;-)
猜你喜欢
  • 1970-01-01
  • 2016-05-06
  • 2011-07-10
  • 2011-11-11
  • 1970-01-01
  • 2013-02-08
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多