我不清楚编译器在需要时如何自动知道编译为64位.它如何知道什么时候可以自信地针对32位?
我很好奇编译器在编译时如何知道要定位的架构.它是否分析代码并根据它发现的内容做出决定?
刚刚安装了Visual Studio 11开发人员预览版.在编译指定了AnyCPU目标的托管(C#,VB)应用程序时,我在项目属性中看到一个名为"Prefer 32-bit"的新选项.这似乎不是类库的选项,只是顶级应用程序.
这个标志表示什么?
Any CPU - 首选32位选项有什么作用?
虽然我知道WinRT无法处理exe并且只能运行Windows应用商店应用,但StackOverflow上存在几个问题,它们提出同样的问题并且都引用了这个博客:
在.NET 4.5和Visual Studio 11中,奶酪已被移动.大多数.NET项目的默认设置是AnyCPU,但现在AnyCPU有多个含义.还有一个额外的子类型AnyCPU,"任何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应用程序?
如果我有一个用C#编写的32位应用程序,我需要做什么才能将其转换为64位?我假设它更复杂,然后在Visual Studio中将目标机器更改为64位并重新编译.