Windows Runtime(WinRT) 揭秘

看了个BUILD的PPT,Windows Runtime (RT)并不是一些新闻网站说的那样微软自废.NET武功,而是恰恰相反,WinRT是Win32API的现代版,其中有很深的.NET的基因,是Metro UI的.NET基础,如果考察Metadata的变化,WinRT的API定义的元数据是基于标准ECMA 335,也就是.NET的标准 ,WinRT也是一个沙箱的环境,针对AppStore环境设计的。

基础知识

微软以推出Windows 8为契机,以解决Windows长期存在的问题,并带来了新的用户界面,使得Windows更加安全和AppStore的商业模式。微软在Windows 8 里打造了第三个 XAML-based UI 系统, WPF只是一个供 .NET 这个圈子使用的XAML UI系统 Silverlight只是给浏览器使用的XAML UI系统,Windows Phone7将Silverlight到了手机,现在将XAML带到了涵盖PC、Pad、Phone的所有系统(虽然微软认为平板也是PC,我还是想叫他Pad,用过iPad的都知道苹果所定义的Pad和PC有很大区别)。

.NET开发人员都对.NET 的P / Invoke和COM Interop 很熟悉了,这两种技术使得.NET人员可以使用Win32 API和COM组件,Mono也是使用P/Invoke技术创建原生的库,例如Gtk# 绑定到 Gtk+ API, MonoMac 绑定到Cocoa API, Qyoto 绑定到Qt API,Mono出现了MonoTouch,MonoDroid和MonoMac等等很有创新性的产品。 COM Interop 还可以使得C/C++ 从 C#导入Com类型库。

创建原生库的方法很多,但是这些工作都得是手工去做,很乏味而且容易出错,从这点来说WinRT也是一个很有创新的,可以让所有的开发者用同一个模型创建Metro UI的应用。

WinRT

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的上层。

WinRT Projections

我们所说的“Binding”,微软现在叫做“Projections”,又是一个新名词。Projections就是向三个环境 Native (C and C++), HTML/Javascript 和.NET 暴露接口的过程。所以在Win8上各类开发者依然可以用着不同的工具,但是却是使用着统一的模型。

如果开发者使用.NET或者C++ 写的组件,它的API被存储在一个WinMD文件里,你可以在三种环境(原生、javascript和.NET)。即使你的组件是用C++ 写的,也不需要通过COM向外暴露,使用起来更像是一个面向对象的C++ API。

WinRT的底层定义了一套基本的类型和各种环境的映射,这是不是很像.NET环境里面对不同语言的支持哈。

异步API

微软认为,当给开发者一个使用同步和异步的API的选择的时候,开发者会选择简单的同步API,这在我们的.NET 编程实践中得到证明,.NET有很成熟的异步编程模型,还有特意为并行和异步处理而设计的F#,结果是什么呢,各位同学心里有数。

在WinRT中,微软一直遵循一个简单的规则:如果一个API预计耗时超过50毫秒,那么API就是异步的,也就是说API是异步的哦,这样就能确保Metro UI上的操作体验是最好的。

异步编程历来是一个繁琐的过程,回调和状态,还有异常处理等。为了简化这个过程,C#和VB也扩展了支持 F#-inspired await/async 模型,异步编程变成了欢乐之旅。

.NET的首要地位不见了吗?

之前的新闻中一直在质疑.NET 被微软抛弃了,当然不是了。也不是所有的.NET API 都集成到了WinRT中,只是一个子集。

当你使用C#和VB,你使用的是完整的.NET框架。但是他们只暴露了一个较小的子集API给Windows 8的开发者。你可能会想,我可以通过一些技巧使用到整个.NET,如果你的程序不需要提交AppStore上接受微软的审核,这是可以的。这种策略明显是跟苹果学的。

借此机会.NET团队也对.NET做了一次清理,mscorlib.dll和System.dll中已被分割在不同的库里头了,随着Win8发布的.NET版本是4.5了,也就是说.NET 4.5不是.NET 4的简单补丁包,里头加了不少东西,ASP.NET的版本号也是4.5,不像.NET 2.0 ~3.5 SP1,ASP.net的版本还是2。0。为了在Win8里开发,开始学习.NET 4.5又是必须的了,这里关注的集中在客户端开发,同样的在服务器端开发方面.NET 4.5也加入大量的干货。

创建WinRT 组件

虽然WinRT支持很多的语言,但是微软只是用C++和.NET演示了如何开发一个WinRT组件,使用.NET来开发WinRT组件会比C++简单得多。也不是所有的.NET特性都能用上哦,比如组件类就不能使用private 字段,在异步的API里不能使用Task<T> ,要用IAsyncOperation 代替。

public sealed class AddTwo
{
public int Add (int a, int b)
{
return a + b;
}

public async IAsyncOperation SubAsync (int a, int b)
{
return a - await (CountEveryBitByHand (b));
}
}

你会发现上述代码没有任何形式的COM声明,唯一限制的是,类必须是个密封的(除非你是在创建一个XAML UI组件,这种情形下这种限制是接触的)

UI编程

当涉及到用户界面的开发的时候,你你可以使用HTML与CSS样式或使用XAML的你的应用程序的用户界面。当你回到界面层,就可以用HTML & CSS或者是XAML UI,用HTML& Css做出来的界面就是Web了,而是一个Windows应用,早在Vista开始就有了类似的应用,Windows7上做了改进,叫做Gadgets ,Windows 8就进化到了Metero UI,和C++、.NET并驾齐驱了。

Windows8的开发框架并没有基于HTML5和JavaScript,开发者完全可以用原生C++、C#和Silverlight去开发对平板和触控友好的应用,HTML5和JavaScript只是提供了一种选择。

作者: 自由、创新、研究、探索……
出处:http://shanyou.cnblogs.com/
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
posted @ 2011-09-17 16:21 张善友 阅读(15132) 评论(45) 编辑 收藏

 回复 引用 查看   
#1楼 2011-09-17 16:54 诺贝尔      
html 比 xaml 好多了。xaml 看了那么多次,还是看不进去。
html + c# 才是王道,可惜html 只能+javascript.

 回复 引用 查看   
#2楼 2011-09-17 16:56 诺贝尔      
你这个页面的视频我用metro ie能看哦,是什么格式的?
 回复 引用 查看   
#3楼 2011-09-17 17:09 _Mgen      
WPF/SL程序员不用太担心,
1. WinRT目前更像是Win32/.NET的子集 + 一些其他东西,为Metrol而生,无法和Win32/.NET比强大也没必要比(比如WinRT System.IO下都没FileStream类)。如果你需要Metrol,那么用WinRT,如果不需要,那么WPF/MFC/Win32依然是你的选择。

2. 即使你用了WinRT写Metrol,你会发现Metrol XAML的UI基本上就是WPF/SL,太像了,某些WPF/SL程序可能改一改命名空间就可能成功编译成WinRT应用。当然WinRT也有自己独有的东西。总之WPF/SL程序员学习起来会很大优势。

 回复 引用 查看   
#4楼 2011-09-17 17:14 feilng      
WinRT本身是native的,是一个native的.net
com—〉.net—〉高级com,WinRT就是com的成熟与回归
吸收了.net思想,只是去掉了虚拟机

这才是WIN32 API的现代版

 回复 引用 查看   
#5楼 2011-09-17 17:17 _Mgen      
@feilng
但是注意,使用C#编写的Metrol程序还是会加载CLR的,C++不需要。

 回复 引用 查看   
#6楼 2011-09-17 17:33 feilng      
因为目前MS没提供C#直接编译到native的方式,不像mono
所以编写C#程序的时候生成的代码就是MSIL,这样的APP不加载CLR能用吗

WinRT关键是提供了一套组件机制,这样的库比C风格的Win32API现代
也比以前的com形式的库完善,
这样未来Windows API可以分为两层,
1、核心C API面向系统级,2、WinRT面向应用层
现有的.net可以看作第3层,傻瓜层

 回复 引用 查看   
#7楼 2011-09-17 17:36 feilng      
强烈期待C#直接编译到native,享受C#语言,同时享受性能
这个时候C#程序才可以谈用户体验

 回复 引用 查看   
#8楼 2011-09-17 17:59 小烟      
老师,有人说WinRT会取代WPF 和 WCF,你认为呢?
 回复 引用 查看   
#9楼 2011-09-17 18:26 0x0qwe      
.net4.5有神吗新的东东啊
 回复 引用 查看   
#10楼 2011-09-17 19:23 瑞雪年      
楼主分析的真好!
“•API的元数据格式是ECMA335,和.NET一样的标准。这是不是意味着以后Mono也可以在xUnit上去实现这样的API呢?”
当我第一眼看到Metro UI时,我就感觉这个东西早晚会被移植到Linux上,因为我看它本质上就是一个重构了的Silverlight,就开源界现有的代码来看,实现它可以说不费力气,就像当年Miguel de lcaza领导团队21天就实现Silverlight的基本功能。
MonoGame, Moonlight都有这方面的潜质,或许就是它们的合集。
这个“早晚”取决于微软的态度,不在于技术上,象微软对Mono是支持的,至少是不反对的,如果对Metro UI保持这种态度,那就会“很早”出现!

 回复 引用 查看   
#11楼 2011-09-17 19:36 天行健 自强不息      
分析的不错
 回复 引用 查看   
#12楼 2011-09-17 20:34 toEverybody      
很不喜欢微软让大家不断地投资学新东西,.NET发展了10多年了,感觉还是一个不成熟的小孩..
还是让微软消失吧,免得大家累死累活的,,,

 回复 引用 查看   
#13楼 2011-09-17 23:12 周行天下      
@toEverybody
傻逼,又是你

 回复 引用 查看   
#14楼 2011-09-17 23:37 slice      
我不认为是微软在让大家学习这些东西,而是需求的存在创造了这些东西。
例如WinRT,照顾了所有开发者,C++的,HTML+Javascript的,C#的,都可以利用自己已有的经验,而且解决了跨X86和ARM的问题,而且也让他们开发和运行都更有效率。
如果Win8没有这个东西,那才是灾难,而你拥抱这些东西,好处是多多的。
很多东西我会了解,根据自己的需求看是否需要深入,往往深入后带来的都是收获和更高的效率,但使用什么技术主要以需求为主导,我从来不认为自己的任何学习是没有价值的,这也是我认为活着的技术都有存在的价值的原因,没价值的自然死掉。

 回复 引用 查看   
#15楼 2011-09-18 05:59 dotNetDR_      
@诺贝尔
能具体说说呢?都是XML(HTML部分近似XML)啊~
我自己掌握起来很容易啊!

 回复 引用 查看   
#16楼[楼主] 2011-09-18 08:21 shanyou      
引用小烟:老师,有人说WinRT会取代WPF 和 WCF,你认为呢?

WinRT只是现代版的Win32API,.NET和WinRT不同,那里有取代的可能呢。Win8的.net 版本号4.5,更好地支持WinRT,同时在ASP.NET,WCF,BCL等方面加强很多

 回复 引用 查看   
#17楼 2011-09-18 13:00 DiggingDeeply      
越新越傻
 回复 引用 查看   
#18楼 2011-09-18 16:10 YaoTong      
@周行天下
他老婆一定是跟一个搞.net的跑了.

 回复 引用 查看   
#19楼 2011-09-19 09:36 Jeffrey Zhao      
引用toEverybody:
很不喜欢微软让大家不断地投资学新东西,.NET发展了10多年了,感觉还是一个不成熟的小孩..
还是让微软消失吧,免得大家累死累活的,,,

how old are you,怎么老是你?
.NET如果还是个小孩,那么你就是个精子了。话说你爸当年怎么没把你射墙上啊。

 回复 引用 查看   
#20楼 2011-09-19 09:47 土豆烤肉      
引用Jeffrey Zhao:
引用toEverybody:
很不喜欢微软让大家不断地投资学新东西,.NET发展了10多年了,感觉还是一个不成熟的小孩..
还是让微软消失吧,免得大家累死累活的,,,

how old are you,怎么老是你?
.NET如果还是个小孩,那么你就是个精子了。话说你爸当年怎么没把你射墙上啊。


赵哥,淡定!

 回复 引用 查看   
#21楼 2011-09-19 09:53 Zachary.XiaoZhen      
引用土豆烤肉:
引用Jeffrey Zhao:
引用toEverybody:
很不喜欢微软让大家不断地投资学新东西,.NET发展了10多年了,感觉还是一个不成熟的小孩..
还是让微软消失吧,免得大家累死累活的,,,

how old are you,怎么老是你?
.NET如果还是个小孩,那么你就是个精子了。话说你爸当年怎么没把你射墙上啊。


赵哥,淡定!

赵哥,淡定!

 回复 引用 查看   
#22楼 2011-09-19 11:37 zzfff      
引用Zachary.XiaoZhen:
引用土豆烤肉:
引用Jeffrey Zhao:
引用toEverybody:
很不喜欢微软让大家不断地投资学新东西,.NET发展了10多年了,感觉还是一个不成熟的小孩..
还是让微软消失吧,免得大家累死累活的,,,

how old are you,怎么老是你?
.NET如果还是个小孩,那么你就是个精子了。话说你爸当年怎么没把你射墙上啊。


赵哥,淡定!

赵哥,淡定!

赵哥,小宇宙爆发吧!

 回复 引用 查看   
#23楼 2011-09-19 11:59 feilng      
DOS,WIN32,WINRT MS的三个里程碑
本质是MS终于开始Win32以来第一次大的平台变更
com以及.net是一种探索,其最终成果就是winRT

一直以来开发者需要的是一个API体系
以前它是Win32,这意味着开发什么都是C API函数
后来的com以及.net在组件系统方面有了较大发展,才有了OLE,ActiveX等等,这样Window平台的开发才步入组件时代,有点象样的零件了
最后.net的发展有了大一统的面向对象的现代API集,但是由于其非native无法支撑各种重量级应用例如ps,cad等,例如这些年微软推出了direct2D而不是用wpf统一UI开发,最后再加上移动平板设备等的发展,需要最大限度榨取硬件效能,所以结果就是:

我们需要现代API,我们需要组件,我们需要同时支持x86,ARM
没有问题,windows为你提供统一的现代API,一整套native组件库,没有com那些破事(主要是利用了.net成果),只要你基于这套库写的代码,那么各自编译一下就可以支持x86或ARM了,的,性能用户体验可以保证,上层我可以支持各种语言。
当然win8里的winrt还不完善,但是迟早要全的。

.net是提供了更高级特性的一个东西,并且也能直接使用WinRT的库,本质上多一个虚拟机,多一个gc,这2个东西并不是重点,快速开发企业应用之类的还是可以用的,但是开发一些重量级应用可以考虑winRT了,这样Win32开发会逐步向WinRT迁移,以前.net下开发的不太爽的一些应用向WinRT迁移,.net本身的重要性会下降

 回复 引用 查看   
#24楼 2011-09-19 12:00 feilng      
重点是现代的库,现代的语言,而不是虚拟机、gc
 回复 引用 查看   
#25楼 2011-09-19 12:01 feilng      
千万不要说没有虚拟机、gc就没有现代语言
 回复 引用 查看   
#26楼 2011-09-19 12:32 菩提树下的杨过      
当年盖子要用.net重写windows核心的思想,总算在windows8上得到体现了,.net与windows合体了!
 回复 引用 查看   
#27楼 2011-09-19 12:38 feilng      
是在去掉clr之后实现的,托管实在难堪大用
 回复 引用 查看   
#28楼 2011-09-19 14:31 iTech      
以后的mfc和wpf还可以用吗?

还是在mfc和wpf的底层被换成了winrt?

 回复 引用 查看   
#29楼 2011-09-19 14:35 技术,趋势      
引用菩提树下的杨过:当年盖子要用.net重写windows核心的思想,总算在windows8上得到体现了,.net与windows合体了!


精辟!这个WinRT给人感觉上还是真不错,如果C#能作为一级语言,那简直就是天下太平了。

 回复 引用 查看   
#30楼 2011-09-19 14:50 布丁儿      
.NET雄起 了

这是一个神奇的Q Q群:7 3 5 7 9 0 4
这里有腾讯、新浪、雨林木风等等的大牛们
这里有专业的技术团队,有前沿的技术思想......
亲,俺们等你(.NET)
-----------------------------

 回复 引用 查看   
#31楼 2011-09-19 18:14 周行天下      
坐等everybody,和猫之两瓶等傻逼
猫之两瓶你这个二货怎么还不来

 回复 引用 查看   
#32楼 2011-09-19 20:29 瑞雪年      
Metro UI原来早有人在搞了,WinRT API我相信一定也会有人搞的。
http://mosaicproject.codeplex.com/
http://newgen.codeplex.com/

 回复 引用 查看   
#33楼 2011-09-19 22:01 Joe Wulf      
WinFS的出现才是王道啊

微软的大统一快要实现了。

 回复 引用 查看   
#34楼 2011-09-19 22:01 testzhangsan      
mark
 回复 引用 查看   
#35楼 2011-09-19 23:26 超我专注      
@feilng
学习了!

 回复 引用 查看   
#36楼 2011-09-20 12:18 toEverybody      
@YaoTong
引用YaoTong:
@周行天下
他老婆一定是跟一个搞.net的跑了.

周行天下 他老婆或以后的老婆是C#之父Anders的情人,外国人的那个就是猛..

 回复 引用 查看   
#37楼 2011-09-20 12:21 toEverybody      
引用Jeffrey Zhao:
引用toEverybody:
很不喜欢微软让大家不断地投资学新东西,.NET发展了10多年了,感觉还是一个不成熟的小孩..
还是让微软消失吧,免得大家累死累活的,,,

how old are you,怎么老是你?
.NET如果还是个小孩,那么你就是个精子了。话说你爸当年怎么没把你射墙上啊。

NET太让人纠心了,你爸对你妈说...唉..都怪我插的太深了,喷出个NET来

 回复 引用 查看   
#38楼 2011-09-20 13:49 月黑杀人夜      
翻译得不错
可是为何不在标题注明?不附上原文链接呢?
这样似乎是对原作者的不尊重吧
http://tirania.org/blog/archive/2011/Sep-15.html

 回复 引用 查看   
#40楼 2011-09-20 18:09 我想我是青蛙      
@toEverybody
傻逼玩意,天天泡到这里被人打脸。。。你是受虐狂啊。。
哥有皮鞭。。。

 回复 引用 查看   
#41楼 2011-09-20 22:00 YaoTong      
引用toEverybody:
@YaoTong
引用YaoTong:
@周行天下
他老婆一定是跟一个搞.net的跑了.

周行天下 他老婆或以后的老婆是C#之父Anders的情人,外国人的那个就是猛..

我说的"他"不是指周行天下.

 回复 引用 查看   
#42楼 2011-09-22 13:27 cnlcg      
哎,话说着说着就开始ko了
 回复 引用 查看   
#43楼 2011-10-10 00:17 xidao      
winRT我觉得这个东西很有问题,按说他主要是用来做Metro UI界面编程的,说穿了就像IOS或android应用程序商店上的前端小程序的,而不是做后端服务编程的,也不是做系统软件之类的东东,但是按照ms在Win8上的思路,Win8的前端Metro UI的程序,主要是用来跑平板的,主要是为了跨平台的,理想情况下应该是写完后可以直接在Arm上和X64两个系统上跑的。
按说.net的程序就像JAVA一般(或Android),应该是最好的跨平台开发语言的,哪怕是为了兼容Javascripts,也完全可以在.net上进行扩展的,现在ms搞一个核心级别的WinRT,这个有什么意义呢?为了照顾C++?哪怕是C++可以直接使用或操作WinRT,但c++最终还是要编译为机器码才执行的,编译后根本不能垮x64和arm两个平台的,而且就算退一步说,c++在源代码级上兼容X64和arm两个系统,但是x64是64位的系统,arm是32位的系统,对于c++这种系统级别的语言来讲要同一套代码实现64位和32位也没有很好的效率啊。

 回复 引用 查看   
#44楼[楼主] 2011-10-10 07:25 shanyou      
@xidao
WinRT就是去掉.NET虚拟机的win32 API,也许是为了性能考虑,ios不允许开发者使用解释语言和第三方运行环境一样,服务器的开发上不是WinRT的市场,主要还是.NET,win8服务器软件的界面也是Metro

 回复 引用 查看   
#45楼 2011-10-11 16:28 崔鹏飞      
引用月黑杀人夜:
翻译得不错
可是为何不在标题注明?不附上原文链接呢?
这样似乎是对原作者的不尊重吧
http://tirania.org/blog/archive/2011/Sep-15.html

我还没看出来,楼主翻译的很自然,不像是经过语言转换的。