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。