Windows8的开发平台总体上分为两部分:一是全新的WinRT,界面搭配Metro style,二是传统的Win32、.NET(SL)、IE三大平台,界面为传统窗体风格。其中全新的WinRT被微软视为开发者的未来。
WinRT平台开发又细分为两大方式:一是C、C++搭配XAML或C#、VB搭配XAML,二是JavaScript搭配HTML/CSS。C、C++、C#、VB、Javascript全部可以直接调用WinRT APIs,这样微软将Native(本地)、Managed(托管)、Dynamic(动态)三大语言运行机制统一了起来。可见,WinRT是微软将Win32、.NET(SL)、IE三大平台进行整合的产物。
回顾历史,Win32是微软最早推出、发展时间最久的一个开发平台。C++搭配Windows SDK或C++搭配MFC等类库或VB均是Win32平台的开发方式。而COM技术,也作为那个时代的组件模型,为微软的发展建立了不可磨灭的功勋。2000年,微软推出.NET战略,.NET平台开始走入主流。WinForm、WPF以及之后的Silverlight均是.NET时代的产物。而Assembly组件模型,也逐步地在很多领域替代COM技术。
Win32时代,我称之为“PC时代”。那时的硬件性能普遍较低,所以Win32平台具有非常高效的性能。但是开发效率低下,内存管理复杂,COM技术晦涩难懂、没有统一的数据传递模型等这些问题,使Win32难以适应网络发展的需要。于是微软推出.NET战略,“网络时代”来临。.NET平台从2000年开始,到现在,已经发展了10年左右,微软依次给我们带来了.NET1.1、.NET2.0、.NET3.0、.NET3.5、
.NET4.0。.NET平台解决了Win32平台的问题,设计了非常优雅的开发接口和庞大类库,开发效率提升了,内存管理引入了GC,Assembly组件模型非常简单,而且还解决了COM技术造成的DLL Hell问题,也带来了统一的数据传递模型XML。但是.NET平台从一开始,就暴露了缺点,由于.NET是建立在Win32基础上的托管API接口,性能下降,系统资源消耗严重,而且和Win32平台交互困难。随着硬件的提升、.NET平台的不断发展优化,性能得到部分提升,跨平台调用方案也一定程度解决了Win32平台的交互问题。但是这些改变,没有根本解决问题,即便微软后来又推出了“改良的.NET平台”-Silverlight,但.NET平台的缺点还是随着“移动时代”的来临,再次暴露无疑。此时WinRT上场了!
那么,WinRT给我们带来了什么呢?WinRT是“移动时代”需求的产物,那肯定会充满“移动时代”的色彩。第一,WinRT给我们带来了界面上的革命:Metro。新的Metro风格界面更加适合触摸屏操作,更加适合多尺寸的显示屏,全屏的显示方式突出了以内容为中心的理念。第二,WinRT给我们带来了全新的系统级Native API,WinRT APIs是Native的,而且直接建立在系统内核之上,并且还自动获得硬件加速,包装非常类似.NET,既高效又易用。第三,WinRT采用了MVC模式,做到了界面和逻辑的很好分离。XAML和HTML5作为两大界面标记语言同时被采用。第三,WinRT给我们带来了新的组件模型:C++组件扩展。该组件模型是COM和Assembly技术的结合体,可同时被Native、Managed和Dynamic三种类型的语言直接调用。WinRT APIs本身就是使用的C++组件扩展技术实现的,所以做到了C、C++、C#、VB、Javascript的直接调用。WPF、SL、网页应用均可以较小代码调整,即可在WinRT平台运行。第四,WinRT同时支持X86/64、ARM架构,即可在PC上运行,又可在Pad上运行。第五,WinRT全面采用了异步技术。在WinRT中,微软一直遵循一个简单的规则:如果一个API预计耗时超过50毫秒,那么API就是异步的,这样就能确保Metro UI上的操作体验是最好的。第六,WinRT程序在不显示的时候,自动转换为挂起状态,不占用CPU,节省了电能消耗。
对于传统平台开发,也稍微做下介绍。IE平台更新到了IE10版本,.NET平台更新到了.NET4.5版本。另外,专门提下,传统的网页插件技术已经不能在Metro风格的IE中获得支持。而新的插件技术或者是否还提供插件技术尚不得而知。
开发工具对应的是Visual Studio 11 和 Expression Blend 5。
WinRT是一个新的API 集合,具有以下特性:
- 它实现了Metro UI规范的UI库
- 为Windows开发人员提供一个简单的UI编程模型,你不需要学习Win32API的那些复杂的API了
- 它使用XAML-base的UI系统
- API都设计成了异步的
- 它和.NET一样是个沙箱的API,自成体系,用于创建AppStore上的应用程序。
- API的元数据格式是ECMA335,和.NET一样的标准。这是不是意味着以后Mono也可以在xUnit上去实现这样的API呢?
WinRT包装的新的用户界面系统,和Win32API一样是Com的上层。
Windows运行时(WinRT)是为了在Windows上给用户提供一种流畅且安全的应用体验。WinRT会受到.NET、C++、以及JavaScript三者的影响。WinRT不会取代CLR或Win32,而是为那些使用不同语言编写的应用程序提供统一支持,以便它们可使用新的Metro风格用户界面运行于Windows之上。
WinRT不是为了取代.NET或Win32提供的所有功能,但是它是一个公共平台,以便那些使用不同语言编写的应用程序可使用新的Metro风格界面来运行。当混合C#应用程序基于WinRT创建Metro风格用户界面时,程序中将仍能执行LINQ查询,对于存储、网络、新式应用程序的安全性等方面同样能执行LINQ查询。完整的运行时架构如下图所示:
在类型上,WinRT必须提供语言无关的类型——integer(整数)、enumerations(枚举)、structures(结构)、arrays(数组)、interfaces(接口)、generic interfaces(泛型接口)、以及runtime classes(运行时类)。引入了被称之为HSTRING的新字符串类型,该类型允许在不进行任何数据复制的情况下,在应用程序与运行时环境之间传输字符串。
每个WinRT对象都会对应一些接口,其中有两个接口属于每个对象:IUnknown接口,熟悉的COM接口;以及IInspectable接口,用于根据对象所包含的元数据来发现有关该对象的信息。一个对象可能通过接口提供其他功能,然而运行时类会把这些接口集中公开出来。例如,一个FileInformation对象拥有由FileInformation类公开的IStorageItemInformation、IStorageItem、IStorageFile三个接口。
WinRT对象在编译时被公开给C++应用程序,而对于C#或VB.NET应用程序而言,对WinRT对象的绑定一部分是在编译时完成的,另一部分则是在运行时完成的。HTML或JavaScript应用程序只有在运行时可以看到WinRT对象,而且元数据是动态生成的。
Metro界面运行在一个不可重入的单线程之上,然而应用程序的其余部分可以从线程池中使用由运行时环境所自动提供的多线程。
开发者可以用C#语言创建可供C++或JavaScript的WinRT应用程序使用的Windows运行时组件,然而须要遵守一系列规则:“结构体只能拥有公共数据字段;只允许对XAML控件使用继承,其它类型都必须使用sealed关键字;只支持系统提供的泛型。”