Windows 8应用开发实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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。