Windows Runtime - 面向对象化的C++(并非意味着托管)
Windows 8的开发平台总体上分为两部分:一是全新的WinRT,界面搭配Metro style,二是传统的Win32、.NET(SL)、IE三大平台,界面为传统窗体风格。其中全新的WinRT被微软视为开发者的未来。
WinRT平台开发又细分为两大方式:一是C/C++搭配XAML,或C#/VB搭配XAML,二是JavaScript搭配HTML/CSS。C、C++、C#、VB、Javascript全部可以直接调用WinRT APIs,这样微软将Native(本地)、Managed(托管)、Dynamic(动态)三大语言运行机制统一了起来。可见,WinRT是微软将Win32、.NET(SL)、IE三大平台进行整合的产物。
回顾历史,Win32是微软最早推出、发展时间最久的一个开发平台。C++搭配Windows SDK或C++搭配MFC等类库或VB均是Win32平台的开发方式。而COM技术,也作为那个时代的组件模型,为微软的发展建立了不可磨灭的功勋。2000年,微软推出.NET战略,.NET平台开始走入主流。WinForm、WPF以及之后的Silverlight均是.NET时代的产物。而Assembly组件模型,也逐步地在很多领域替代COM技术。
Win32时代,我称之为“PC时代”。那时的硬件性能普遍较低,所以Win32平台具有非常高效的性能。但是开发效率低下,内存管理复杂,COM技术晦涩难懂、没有统一的数据传递模型等这些问题,使Win32难以适应网络发展的需要。于是微软推出.NET战略,“网络时代”来临。.NET平台从2000年开始,到现在,已经发展了10年左右,微软依次给我们带来了.NET1.1、.NET2.0、.NET3.0、.NET3.5。
.NET4.0。.NET平台解决了Win32平台的问题,设计了非常优雅的开发接口和庞大类库,开发效率提升了,内存管理引入了GC,Assembly组件模型非常简单,而且还解决了COM技术造成的DLL Hell问题,也带来了统一的数据传递模型XML。但是.NET平台从一开始,就暴露了缺点,由于.NET是建立在Win32基础上的托管API接口,性能下降,系统资源消耗严重,而且和Win32平台交互困难。随着硬件的提升、.NET平台的不断发展优化,性能得到部分提升,跨平台调用方案也一定程度解决了Win32平台的交互问题。但是这些改变,没有根本解决问题,即便微软后来又推出了“改良的.NET平台”——Silverlight,但.NET平台的缺点还是随着“移动时代”的来临,再次暴露无疑。此时WinRT上场了!
那么,WinRT给我们带来了什么呢?WinRT是“移动时代”需求的产物,那肯定会充满“移动时代”的色彩。第一,WinRT给我们带来了界面上的革命:Metro。新的Metro风格界面更加适合触摸屏操作,更加适合多尺寸的显示屏,全屏的显示方式突出了以内容为中心的理念。第二,WinRT给我们带来了全新的系统级Native API,WinRT APIs是Native的,而且直接建立在系统内核之上,并且还自动获得硬件加速,包装非常类似.NET,既高效又易用。第三,WinRT采用了MVC模式,做到了界面和逻辑的很好分离。XAML和HTML5作为两大界面标记语言同时被采用。第三,WinRT给我们带来了新的组件模型:C++组件扩展。该组件模型是COM和Assembly技术的结合体,可同时被Native、Managed和Dynamic三种类型的语言直接调用。WinRT APIs本身就是使用的C++组件扩展技术实现的,所以做到了C、C++、C#、VB、Javascript的直接调用。WPF、SL、网页应用均可以较小代码调整,即可在WinRT平台运行。第四,WinRT同时支持X86/64、ARM架构,即可在PC上运行,又可在Pad上运行。第五,WinRT全面采用了异步技术。在WinRT中,微软一直遵循一个简单的规则:如果一个API预计耗时超过50毫秒,那么API就是异步的,这样就能确保Metro UI上的操作体验是最好的。第六,WinRT程序在不显示的时候,自动转换为挂起状态,不占用CPU,节省了电能消耗。
对于传统平台开发,也稍微做下介绍。IE平台更新到了IE10版本,.NET平台更新到了.NET4.5版本。另外,专门提下,传统的网页插件技术已经不能在Metro风格的IE中获得支持。而新的插件技术或者是否还提供插件技术尚不得而知。
开发工具对应的是Visual Studio 11 和 Expression Blend 5。
WinRT是一个新的API 集合,具有以下特性:
- 它实现了Metro UI规范的UI库
- 为Windows开发人员提供一个简单的UI编程模型,你不需要学习Win32API的那些复杂的API了
- 它使用XAML-base的UI系统
- API都设计成了异步的
- 它和.NET一样是个沙箱的API,自成体系,用于创建AppStore上的应用程序。
- API的元数据格式是ECMA335,和.NET一样的标准。这是不是意味着以后Mono也可以在xUnit上去实现这样的API呢?
WinRT包装的新的用户界面系统,和Win32API一样是Com的上层。
Windows运行时(WinRT)是为了在Windows上给用户提供一种流畅且安全的应用体验。WinRT会受到.NET、C++、以及JavaScript三者的影响。WinRT不会取代CLR或Win32,而是为那些使用不同语言编写的应用程序提供统一支持,以便它们可使用新的Metro风格用户界面运行于Windows之上。
WinRT不是为了取代.NET或Win32提供的所有功能,但是它是一个公共平台,以便那些使用不同语言编写的应用程序可使用新的Metro风格界面来运行。当混合C#应用程序基于WinRT创建Metro风格用户界面时,程序中将仍能执行LINQ查询,对于存储、网络、新式应用程序的安全性等方面同样能执行LINQ查询。完整的运行时架构如下图所示:

在类型上,WinRT必须提供语言无关的类型——integer(整数)、enumerations(枚举)、structures(结构)、arrays(数组)、interfaces(接口)、generic interfaces(泛型接口)、以及runtime classes(运行时类)。引入了被称之为HSTRING的新字符串类型,该类型允许在不进行任何数据复制的情况下,在应用程序与运行时环境之间传输字符串。
每个WinRT对象都会对应一些接口,其中有两个接口属于每个对象:IUnknown接口,熟悉的COM接口;以及IInspectable接口,用于根据对象所包含的元数据来发现有关该对象的信息。一个对象可能通过接口提供其他功能,然而运行时类会把这些接口集中公开出来。例如,一个FileInformation对象拥有由FileInformation类公开的IStorageItemInformation、IStorageItem、IStorageFile三个接口。
WinRT对象在编译时被公开给C++应用程序,而对于C#或VB.NET应用程序而言,对WinRT对象的绑定一部分是在编译时完成的,另一部分则是在运行时完成的。HTML或JavaScript应用程序只有在运行时可以看到WinRT对象,而且元数据是动态生成的。
Metro界面运行在一个不可重入的单线程之上,然而应用程序的其余部分可以从线程池中使用由运行时环境所自动提供的多线程。
开发者可以用C#语言创建可供C++或JavaScript的WinRT应用程序使用的Windows运行时组件,然而须要遵守一系列规则:“结构体只能拥有公共数据字段;只允许对XAML控件使用继承,其它类型都必须使用sealed关键字;只支持系统提供的泛型。”
Windows Runtime - 面向对象化的C++(并非意味着托管)的更多相关文章
- C/C++程序基础-如何理解C++是面向对象化的,而C是面向过程化的
1:答:C是面向过程化的,但是C++不是完全面向对象化的.在C++中也完全可以写出与C一样过程化的程序,所以只能说C++拥有面向对象的特性.Tava是真正面向对象化的.
- Windows Runtime (RT)
学了sl for wp 开发了1年都没入门,只能说自己的学习欲望太低了. 今天偶然才发现wrt 跟 .net 是2个东西... orz. 得抛弃 sl ,wrt才是未来的主流吧... 这篇文章不错 h ...
- .NET 6学习笔记(4)——如何在.NET 6的Desktop App中使用Windows Runtime API
Windows Runtime API是当初某软为了区别Win32 API,力挺UWP而创建的另一套Windows 10专用的API集合.后来因为一些原因,UWP没火.为了不埋没很有价值的Window ...
- win7打开或关闭windows功能 提示“出现错误,并非所有的功能被更改”,管理员权限惹的祸
2013-07-25 18:12:06 最近要用到windows的telnet功能,本来是很简单的事情,因为管理员权限的问题,花了不少时间,才发现是管理员权限惹的祸,更滑稽的是,自己一直以来都不是管理 ...
- QuanbenSoft Windows Runtime (Windows Store)Apps 应用及其框架总览
Parrot Simple audio repeater for language learners http://www.windowsphone.com/en-au/store/app/parro ...
- 将TinyXml快速入门的接口面向对象化(转载)
作者:朱金灿 来源:http://www.cnblogs.com/clever101 在TinyXml快速入门的系列文章中(详情见本博客),我只是将tinyxml类库解析xml文件的类封装为API接口 ...
- 在 Windows 8、Windows 10 桌面模式下的 .NET Framework 程序中,引用 Windows.Runtime 的 API。
参考:1.https://www.cnblogs.com/webtojs/p/9675956.html 2.http://jennal.com/2016/04/28/using-windows-run ...
- 天猫首页迷思之-jquery实现整个div的懒加载(2)-插件面向对象化-闭包和原型的实例
前文有简单的实现了一个制作懒加载的方法,但其实以方法的形式做插件扩展性不强.那么本文就来用面向对象的方法将其制作成一个真正的插件: 我想要的最终的调用效果是: $(".loading&quo ...
- Windows Phone Runtime Component 中的类型转换
Windows Phone Runtime Component 是Windows Phone 平台用来写C++类库的项目类型. 主要目的是让C#和C++进行互操作,引用历史的C++代码,保护知识产权, ...
随机推荐
- css 层叠样式表
css选择器 派生选择器 根据其元素在其上下文关系来定义样式 <style type="text/css">body{ font-size:12px; color:re ...
- KMP算法(转载)
转载http://blog.csdn.net/yutianzuijin/article/details/11954939 kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法.不过由于其难以 ...
- iOS开发之UITextField的使用详解
UITextField的使用详解 UITextField控件是开发中,使用频率比较高的控件了,那么有必要总结一下. 一.UITextField手动编写控件 UITextField *txtAccou ...
- the thread has exited with code -1073741819
内存分配异常.无效或冲突.指针存在但指向无效内存区域.
- C++盲点
const const指针 char greeting[] ="hello"; char* p = greeting; // non-const pointer, non-cons ...
- BibTex插入Reference
1. 在tex文件中加入: \bibliographystyle{plain} %这是格式 \bibliography{reffile} % reffile.bib是reference的文件 2 ...
- Servlet编程-步步为营
[环境]eclipse j2ee;Tomcat 7.0; [模型1] package com.zhiqi; import ...; public class TestServlet extends H ...
- iOS dispatch_source_t的理解
Dispatch Source是GCD中的一个基本类型,从字面意思可称为调度源,它的作用是当有一些特定的较底层的系统事件发生时,调度源会捕捉到这些事件,然后可以做其他的逻辑处理,调度源有多种类型,分别 ...
- IP_TOS选项
voip IP_tos 选项 在IP头中,有一Type-of-Service字段,该字段描述了IP包的优先级和QoS选项,使用IP_TOS可以来设定该字段的值,以区分不同服务的优先级,Linux 中可 ...
- [办公自动化]无法使用江南天安usbkey 无法使用视频网站
同事打来电话说,无法使用江南天安开发的usbkey. 修复基本步骤记录如下: 1.卸载一切设备管理器中与之相关的驱动.拔出key. 2.重启计算机. 3.前往业务公开网站安装驱动. 4.插入key测试 ...