看了个BUILD的PPT,Windows Runtime (RT)并不是一些新闻网站说的那样微软自废.NET武功,而是恰恰相反,WinRT是Win32 API的现代版,其中有很深的.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 集合,具有以下特性:
WinRT包装的新的用户界面系统,和Win32 API一样是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
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只是提供了一种选择。