WinRT簡介


 

   什么是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視頻和內部資料,無法提供鏈接。   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM