- Windows 8應用開發實戰
- 童明編著
- 985字
- 2019-01-09 13:37:27
1.5.1 Windows平臺的運行時
很早之前的最基礎的Win32平臺,在此平臺上,不同編程語言間編譯的可執行程序是不可以互操作的。
Win32平臺的架構圖如圖1-7所示。

圖1-7
直到后來COM(Component Object Model)的出現,帶來了諸多福利:標準的內存模型和內存管理,多語言可互操作,松耦合,等等。但同時也帶來了新的問題:程序很脆弱,且不容易調試;技術復雜,難以理解;DLL災難。
NET的出現,使用CLR作為執行環境,讓多語言間能夠更容易地互操作:
· 支持數十種編程語言;
· 只有很少的運行時版本(CLR);
· FCL集成了很多高級功能,比如WCF、WPF、TPL,等等。
.NET的也有新的問題:
· 與非CLR組件互操作很痛苦,比如標準C++;
· 對CLR的依賴本身也是一個問題;
· 托管代碼存在性能問題;
· 不支持HTML和JavaScript。
Windows Runtime是Windows平臺新一代可互操作的API。WinRT與COM很像,與COM的共同點是:
· 都是基于接口的;
· 都使用GUID來標識組件;
· 都通過引用計數來管理生命周期;
· 線程模型是由Apartment Style決定的。
但是要強調的是,WinRT:不是COM,不是基于Win32的,不是跨平臺的,不是托管環境。
WinRT還擴展了COM沒有的幾個方面:靜態方法,屬性,代理和事件,元數據和RTTI。
Windows Runtime的架構圖如圖1-8所示。

圖1-8
可以看到,Windows Runtime直接運行在Windows 8的內核上,既不是CLR,也不是Win32和COM上,所以它是一個本地(Native)運行時。它與.NET的運行時CLR是平行關系,而不是依賴關系。
Windows Runtime支持JS、C++、C#等語言開發,可以用HTML+CSS、DirectX或XAML作為表現層。當用這三種語言開發時,它們的執行層次關系如圖1-9所示。

圖1-9
· 當用JavaScript開發Windows商店應用時,WWAHost作為解釋JavaScript的容器。
· 當用C++/CX開發Windows商店應用時,直接運行在Windows Runtime上。
· 當用C#/VB.NET開發Windows商店應用時,C#/VB.NET仍然運行在CLR上。Windows商店應用會加載整個.NET 4.5的CLR,JIT、GC、IL等特性仍然可用。
使用C#/VB.NET開發的Windows商店應用時運行模型如圖1-10所示。

圖1-10
CLR與Windows Runtime通過一些進制進行交互,因為它們的元數據很像,所以交互的開銷很小。但如果交互的量很大,還是需要注意。
CLR通過RCW(Runtime Callable Wrapper)的方法將Windows Runtime的對象封裝成CLR可識別的托管代碼。
Windows Runtime通過CCW(COM Callable Wrapper)的方法將CLR的對象封裝成Windows Runtime可識別的本地代碼。叫COM的原因是Windows Runtime的結構與COM很像。
Windows Runtime與.NET互操作的方式如圖1-11所示。

圖1-11
一些使用擴展方法,比如:
· CLR的Stream和Windows Runtime中的Stream之間進行轉換——使用System.IO.Windows RuntimeStreamExtensions擴展類。
· CLR的文件操作和Windows Runtime中的文件操作之間進行轉換——使用System.IO. WindowsRuntimeStorageExtensions擴展類。
由于Windows Phone 8的核心系統與Windows 8相同,所以在Windows Phone 8上也有一個Windows Runtime的版本,叫做Windows Phone Runtime,簡稱WinPRT,但只能使用C#、VB.NET和C++/CX開發,不支持JavaScript。