“Mono是个跨平台的.NET”是否是个正确的说法
Mono创建者Miguel de Icaza给出了最为详细的回应:
“.NET是否跨平台”是一个模糊的说法,无论是框架本身还是整体环境都在不断改变。
简单地说,作为.NET的基础架构,CLI标准是跨平台的,但如果要在不同平台上得到最好的体验,则势必要使用各自平台上有针对性的API。CLI技术家族从来没有试着要“一次编写,到处执行”,好比电话和大型机的区别实在是太大了。与其为不同平台提供统一的API和运行时,不如各自平台上的最佳体验提供最正确的工具。试想那些非Windows PC或Unix服务器的程序员,要知道如今已经出现了游戏设备,移动电话,机顶盒,分布式集群等太多激动人心的平台。
微软的.NET框架不是跨平台的产品,它只能运行在Windows上。其他系统上还有一些.NET框架的变体,例如Windows Phone 7,XBox 360和浏览器中的Silverlight,它们都有些许不同的配置(Profile)。
如今你已经可以在各个主流的操作系统,电话,移动设备,嵌入式系统或是服务器上使用基于.NET的技术,以下是各种CLI实现的列表,虽不完整,但应该可以覆盖99%的情况:
- 基于x86和x86-64的计算机:
- Windows:一般来说你会使用.NET或Silverlight,不过你也可以使用完整的Mono。
- Linux, BSD或Solaris:完整的Mono或Silverlight。
- MacOS X:完整的Mono或Silverlight。
- Android:Mono及Android的子集。
- ARM计算机:
- Windows Phone 7:Compact Framework 2010。
- Windows 6.5及更早:早期的Compact Framework。
- Android设备:Mono/Android。
- PowerPC计算机:
- 在Linux,BSD或Unix操作系统上使用完整的Mono功能。
- 在嵌入式系统中使用Mono,如PS3,Wii。
- 在XBox36上运行Compact Framework。
- S390, S390x, Itanium, SPARC计算机:
- 完整的Mono支持
- 其他嵌入式操作系统:
- .NET MicroFramework或Mono的移动配置。
有时候相同的代码很难四处运行。例如XNA代码不会在每个桌面上运行,反之亦然。为了.NET不同的配置里运行,你需要修改些许代码。以下是我所了解的一些配置:
- .NET 4.0配置
- Silverlight配置
- Windows Phone 7配置
- XBox360配置
- Mono核心配置:与.NET配置相同,可以在Linux,MacOS X,Solaris,Windows和BSD里使用。
- .NET Micro Framework
- Mono的iPhone配置
- Mono的Android配置
- Mono的PS3配置
- Mono的Wii配置
- Moonlight配置(与Silverlight兼容)
- Moonlight扩展配置(Silverlight和完整的.NET 4 API)
以上配置都有多多少少的不同,这不是坏事。每个配置的设计都适应其平台,去除任何一个都是不明智的。例如,Silverlight API可以控制浏览器,这不关电话什么事;由于缺少合适的支持,XNA的着色功能对PC硬件也没有多少意义。你越早认识到.NET不是个将开发人员绑定在特定硬件或平台上的解决方案,就能越早成为更好的开发人员。
这意味着,有些API或解决方案可以在多个平台中使用,例如ASP.NET可以用在Windows,Linux,Solaris,MacOS X上,因为.NET和Mono都提供了这些API。同时,ASP.NET则无法在某些微软支持的平台上使用,例如XBox或Windows 7,也不支持Mono的Wii和iPhone配置。
其他解决方案的本质也是一样的。要完整列出这些技术需要一张复杂的表格,我不知道如何在这里表现出来,不过这里有个特定技术与特定平台的列表:
核心运行时引擎(所有平台):
- Reflection.Emit支持:除WP7、CF、XBox、MonoTouch和PS3外的所有平台 。
- CPU SIMD支持:Linux,、BSD、Solaris及MacOS X。即将支持PS 3、MonoTouch和MonoDroid。
- Continuations - Mono.Tasklets:Linux、BSD、Solaris、MacOS、PS3及Wii。
- 程序集卸载:只有Windows。
- VM注入:Linux、BSD、MacOS X及Solaris。
- DLR:Windows、Linux、MacOS X、Solaris及MonoDroid。
- 泛型:在iPhone和PS3上存在一些限制。
语言:
- C# 4:所有平台。
- C# 编译器即服务:Linux、MacOS、Solaris、BSD及Android。
- F#、IronRuby及IronPython:除WP7、CF、Xbox、MonoTouch及PS3外的所有平台。
服务器技术:
- ASP.NET:Windows、Linux、MacOS、BSD及Solaris。
- ADO.NET:所有平台
- LINQ to SQL:所有平台
- Entity Framework:仅Windows
- XML核心技术:所有平台
- XML序列化:除WP7,CF和XBox外的所有平台。
- LINQ to XML:所有平台
- System.Json:Silverlight,Linux,MacOS,MonoTouch,MonoDroid(译注:可移植到其他平台)
- System.Messaging:Windows、Linux、MacOS和Solaris的支持则需要RabbitMQ。
- .NET 1 Enterprise Services:仅Windows。
- WCF:完整版仅支持Windows。Silverlight、Solaris、MacOS、Linux、MonoTouch、MonoDroid支持其自己。
- Windows Workflow:仅Windows。
- Cardspace identity:仅Windows。
GUI技术:
- Silverlight:Windows、Mac和Linux(Moonlight)
- WPF:仅Windows
- Gtk#:Windows、Mac、Linux及BSD
- Windows.Forms:Windows、Mac、Linux和BSD
- MonoMac - 原生Mac集成:仅Mac
- MonoTouch - 原生iPhone集成:仅iPhone/iPad
- MonoDroid - 原生Android集成:仅Android
- Media Center API:仅Windows
- Clutter:Windows和Linux
图像类库:
- GDI+:Windows、Linux、BSD及MacOS
- Quartz:MacOS X、iPhone及iPad
- Cairo:Windows、Linux、BSD、MacOS、iPhone、iPad、MacOS X、PS3及Wii
Mono类库 - 跨平台,可以在.NET里使用,不过需要手动编译:
- C# 4编辑器及服务
- Cecil - CIL操作,工作流,CIL探测,链接器
- RelaxNG类库
- Mono.Data.* 数据提供者
- 完整的System.Xaml(用于安装程序,.NET没有提供这个技术)
MonoTouch为iPhone上运行的Mono,MonoDroid为Andriod上运行的Mono。PS3和Wii的移植只供索尼和任天堂认证的开发人员使用。