Windows 运行时(WinRT)的设计细节
创建Windows运行时(WinRT)是为了在Windows上给用户提供一种流畅且安全的应用体验。WinRT会受到.NET、C++、以及JavaScript三者的影响。WinRT不会取代CLR或Win32,而是为那些使用不同语言编写的应用程序提供统一支持,以便它们可使用新的Metro风格用户界面运行于Windows之上。
两年前,微软从一个愿望开始了Windows运行时(WinRT)的研发工作,此愿望是,建立一个更好的开发平台,让开发者在此平台上使用具有丰富智能感知功能和优秀调试功能的工具来创造快速、流畅、可靠的应用程序,而且开发者可自由选择所使用的语言和库。最终结果是产生了一种架构以及一组可以从.NET语言(C#、VB.NET、F#)、C++、以及HTML/JavaScript调用的API。所有这些语言都会对WinRT的设计产生影响。
WinRT不是为了取代.NET或Win32提供的所有功能,但是它是一个公共平台,以便那些使用不同语言编写的应用程序可使用新的Metro风格界面来运行。当混合C#应用程序基于WinRT创建Metro风格用户界面时,程序中将仍能执行LINQ查询,对于存储、网络、新式应用程序的安全性等方面同样能执行LINQ查询。完整的运行时架构如下图所示:
语言投射(Language Projection)表示对于每种已支持语言的WinRT API视图。通过Visual Studio 11的智能感知,在“Windows”命名空间下可找到那些推荐的用于创建Metro风格应用程序的API。
在BUILD开发者大会上,Windows运行时开发经理Martyn Lovell通过题为 “包围Windows运行时”的演讲介绍了WinRT背后的设计原则:
- 任何耗时超过50毫秒的事情都应该通过使用了Async关键字的异步调用来完成,以确保流畅、快速的应用体验。由于即便当异步调用的情况存在时,许多开发者仍倾向于使用同步API调用,因此在WinRT深处建立了使用Async关键字的异步方法从而迫使开发者进行异步调用。
- 应用程序彼此之间被更好地隔离开,从而使得一个应用程序的性能不会影响到另一应用程序,同时也是为了获得更好的安全性。隶属于某个应用程序的运行时对象不能被暴露给另一应用程序,除非通过借助标准的操作系统级的通讯信道Windows契约(Windows Contracts)来完成。
- 基于平台的版本控制(Platform-based versioning)确保应用程序在不同版本的Windows上运行良好。版本控制信息包含在WinRT元数据中,而且智能感知会根据应用程序的目标版本来公开功能,因此开发者无需查阅其他文档就能知道,对于某个特定版本的Windows而言,到底有哪些类和方法是可用的。
关于类型,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界面运行在一个不可重入的单线程之上,然而应用程序的其余部分可以从线程池中使用由运行时环境所自动提供的多线程。
Windows运行时体验团队的Harry Pierson和公共语言运行时团队的Jesse Kaplan在BUILD开发者大会的另一题为“在C#和Visual Basic中使用Windows运行时”的演讲中,介绍了一些使用.NET语言对WinRT进行编程的细节。
据Pierson透露,.NET对于WinRT的重大影响在于,许多设计准则被从.NET中借用过来。例如,通过使用基于.NET元数据格式更新版本的元数据增强了WinRT库。就像Silverlight一样,为了创建Metro风格应用程序,WinRT会使用XAML框架。由于在运行时与.NET之间存在直接映射:基本类型(primitives)、类(classes)、接口(interfaces)、属性(properties)、方法(methods)等等,并且开发者无法看到那些存在的差异,因此使用WinRT的.NET应用程序将会有宾至如归的感觉。
Pierson还表示,开发者可以用C#语言创建可供C++或JavaScript的WinRT应用程序使用的Windows运行时组件,然而须要遵守一系列规则:“结构体只能拥有公共数据字段;只允许对XAML控件使用继承,其它类型都必须使用sealed关键字;只支持系统提供的泛型。”
在Windows 8、或是后续版本的Windows中将提供一种经典应用程序与新的触摸友好的Metro风格应用程序共存的混合环境。基于Metro风格的未来的Windows应用程序将受益于Windows运行时所提供的公共基础设施,开发者必须针对一套唯一的API进行编程,而对于不同语言会略有差异。在与过去保持兼容性的同时,又为未来提供新功能方面,这是微软所做的最好尝试。