使用.NET编译器针对ARM架构进行编译

3
当你在.NET中编译Windows应用程序时,可以将“平台目标”设置为x86或x64。这将针对特定处理器架构优化你的代码,并允许逃避IL。
有人知道是否有类似的工具可用于Windows Mobile应用程序吗?我只关心在ARM架构上运行我的应用程序。
4个回答

5
我不认为指定平台目标会优化生成的IL代码,适用于给定架构。相反,它表示:“我只在指定的架构上运行,因为我包含特定于该架构的P/Invoke调用。”至少,这是我的理解。这意味着在x64机器上运行时,可执行文件可以在32位CLR版本下运行以实现兼容性。
至于紧凑框架(我假设这是您实际使用的平台),我不确定它如何适用。

我不认为这是真的。我已经将Windows/Web应用程序编译为x64应用程序,即使您有符号可用,并且附加了调试器,很多时候你会得到一个信息,即调试器无法获取变量的值,因为代码被优化了。 - Ilya Volodin
http://social.microsoft.com/Forums/en-US/netfxbcl/thread/0705a4a3-49bf-4295-8932-ac6466172f8b - Ilya Volodin
1
嗯...我不完全相信那个。优化当前架构(只要它知道)是JIT的工作,而不是C#编译器的工作。如果您可以展示它改变生成的IL代码,您的论点将非常有说服力。 - Jon Skeet

3
使用MonoAhead-of-Time(AOT)编译。这就是他们将UNITY脚本编译到iPhone上的方法,因为iPhone是一个ARM平台。在Windows Mobile上启动可能需要一些工作,因为据我所知,还没有人完成该平台的移植,但编译器等应该已经存在。
您可以在MS PDC 此处查看Miguel de Icaza的演示。

2
x86或x64不会优化中间语言(IL) - 这是在部署的机器上运行的JIT编译器的工作。 x86或x64仅标记位数标志
当然,在桌面框架中,您可以将您的MSIL NGEN到特定的CPU上 - 但是我IRC,缺少本地映像只会恢复为JIT编译。除此之外,我不认为NGEN对.NET CF可用。
我不确定为什么需要限制为ARM处理器,但对GetSystemInfo进行P / Invoke将返回一个包含处理器类型的SYSTEM_INFO结构体。这可以防止您的应用程序在非ARM上继续,但不能真正阻止其运行。
编辑:重新阅读这个问题,我注意到除了C#和.NET标签之外,实际上没有任何迹象表明您只想要一个托管方案。如果你愿意使用非托管的解决方案,你显然可以编译成ARM代码。

2
如果你想在基于Windows Mobile的设备上创建基于ARM的应用,请安装.NET Compact Framework。在Visual Studio中,你将会有一个新的“智能设备”项目类型供使用。
我不知道是否还有其他ARM平台的WM支持JIT,也有.NET Micro Framework但我对此一无所知,或许这可以解决你的疑问?

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