什么是WinRT?    首先WinRT是微软为了方便开发者编写Metro风格的程序而提供的一个开发平台。对于广大普通开发者而言,WinRT就是一堆Storage, Pickers, Controls,network,Media等组件的可供调用的API函数。开发者可以调用微软通过WinRT暴露出来的这些接口编写Metro风格的程序。那么WinRT这个平台有什么特点呢?

    1. 它可以让开发者使用微软支持的任何语言开发程序(C++/CX,C#/VB,JavaScript)。

    2. 它是一种建立在COM之上的技术,也就是说是基于COM的(所有WinRT的接口都继承自IInspectable,而IInspectable继承自IUnknown)。  

    3. WinRT让开发者通过一种叫做Application Binary Interface(ABI)应用二进制接口的共同机制暴露给不同的编程语言。   

     WinRT总的来说与其说是一种创造而不如说是一种融合,算是微软对其所有技术资源的一种整合。其主要目的是通过扩展COM的功能,达到不同代码之间二机制代码级的共用或复用,从而模糊编程语言之间的界限,给开发者提供一种全新的编程体验。从WinRT中可以看到许多现代编程语言(C#)的影子(或许360测试组那个牛人说的对,C#不是一个好用的语言,但是它提出来的许多新的特性确实编程语言发展的一个方向)。   

      那么什么又是ABI呢?首先ABI是基于COM的,但是这里所说的COM是一种Morden COM,可以说是扩展了的COM,它支持类,继承,构造函数,静态方法,事件等特性。ABI涵盖了各种细节:如数据类型、大小和对齐;调用约定(控制着函数的参数如何传送以及如何接受返回值);系统调用的编码和一个应用如何向操作系统进行系统调用;以及在一个完整的操作系统ABI中,目标文件的二进制格式、程序库等等。可以这么说ABI是一种约定,二进制代码级的约定,它约定了本地代码,.net代码,JS代码编译后产生二进制文件(bianry)的格式,WinRT通过统一的格式,不同代码可以实现二进制代码级的交互。ABI是不同组件或者说跨技术的边界接口,而不是构建一个应用所有部件的内部运行时。  

       WinRT不是由托管代码写出来的而是由Native写出来的,是对原有Win32API的一种扩展,一部分原有的Win32API通过#define剥离出来成一组新的API以兼容Metro风格的程序,另一部分虽然不兼容Metro,但仍然兼容本地桌面程序。另外说WinRT本质上是COM也不太准确,它是一种进化后的COM(Modern COM)。                           1.它的函数都以RoXxxx形式,而老的COM是以CoXxxxx,

        2.从IInspectable,继承(IInspectable继承自Iunknown,

        3.它支持类,继承,结构体,静态方法和事件。

WinRT metadata:

       在传统的COM,有一种type library information用以描述com的接口,事件,属性和方法。但WinRT的metadata不是基于经典com的ITypeInfo,WinRT借用托管代码metadata格式,但是有所改变,不过仍然可以用托管代码工具ILDsam和.net Reflector。托管代码,元数据都存储在编译后的程序集里,WinRT的在.W‌inmd里,注意.Winmd里只包含元数据信息。

Language projections

       Language projections可以看成是介乎WinRT API和编程者的一个接口层,引入这一层有以下几种目的:  1. 屏蔽上层编程语言差异,使得编程者可以使用C#/VB,C++ ,JavaScript等任意语言无差别(或者说差别很小)的调用底层WinRT API  2. 效率问题,使用COM进行交互,调用开销一直是个问题,Language projections通过某些机制有效地降低了交互开销(这个以后写文章再细说)。

Capablitiies Declaration Contracts Extensions

       Metro风格的程序用contracts和extensions去定义相互之间的交互,这些app必须在manifest引入declarations,并且调用相应的WinRT API去与Windows或者其他应用交互。Contracts 是不同Metro style app之间的交互约定,Extensions是Metro 与Windows之间的交互约定。

declaration会告诉windows该应用会参与某些操作,或者Contracts比如,enable search declaration,当用户搜索时,该应用就会显示在搜索列表里。  

详细介绍请参考reference中链接。

runtime broker

       用于在运行时检查Metro 风格的app定义的Capabilities,在工程设置中我们可以设置一个App对本地资源的访问能力,比如访问摄像头,特定的文件夹等,这就是capabilities。

     针对于WinRT还有以下几点要强调的:  

    1.我们仍然在编写C++代码时使用STL或者Boost。  

    2.虽然C++\CX和C++\CLI在语法上相同,但它们之间有最重要一点区别,C++\CX与托管代码无关。  

    3.WinRT对C++代码也会生成元数据,这些元数据的格式和.net很像。

 

Reference:

http://msdn.microsoft.com/en-us/library/windows/apps/

http://www.silverlightshow.net/items/Windows-8-and-the-future-of-XAML-Part-1-An-overview-of-the-Windows-8-platform.aspx

http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-875T(该视频中debuggertool的替代工具可以从codeplex上下载http://winrt.codeplex.com/

http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-874T

http://www.codeproject.com/Articles/262151/Visual-Cplusplus-and-WinRT-Metro-Some-fundamentals

http://code.msdn.microsoft.com/windowsapps

http://zh.wikipedia.org/wiki/%E5%BA%94%E7%94%A8%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%8E%A5%E5%8F%A3

部分参考资料来源于Channel9视频和内部资料,无法提供链接。   

posted on 2012-05-22 11:43  salomon  阅读(17383)  评论(7编辑  收藏  举报