NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

Windows 运行时的设计细节

  • 2011-09-28
  • 本文字数:2177 字

    阅读完需:约 7 分钟

创建 Windows 运行时(WinRT)是为了在 Windows 上给用户提供一种流畅且安全的应用体验。WinRT 会受到.NET、C++、以及 JavaScript 三者的影响。WinRT 不会取代 CLR 或 Win32,而是为那些使用不同语言编写的应用程序提供统一支持,以便它们可使用新的 Metro 风格用户界面运行于 Windows 之上。

两年前,微软从一个愿望开始了 Windows 运行时(WinRT)的研发工作,此愿望是,建立一个更好的开发平台,让开发者在此平台上使用具有丰富智能感知功能和优秀调试功能的工具来创造快速、流畅、可靠的应用程序,而且开发者可自由选择所使用的语言和库。最终结果是产生了一种架构以及一组可以从.NET 语言(C#、VB.NET、F#)、C++、以及 HTML/JavaScript 调用的 API。所有这些语言都会对 WinRT 的设计产生影响。

WinRT 不是为了取代.NET 或 Win32 提供的所有功能,但是它是一个公共平台,以便那些使用不同语言编写的应用程序可使用新的 Metro 风格界面来运行。当混合 C#应用程序基于 WinRT 创建 Metro 风格用户界面时,程序中将仍能执行 LINQ 查询,对于存储、网络、新式应用程序的安全性等方面同样能执行 LINQ 查询。完整的运行时架构如下图所示:

语言投射(Language Projection)表示对于每种已支持语言的 WinRT API 视图。通过 Visual Studio 11 的智能感知,在“Windows”命名空间下可找到那些推荐的用于创建 Metro 风格应用程序的 API。

在 BUILD 开发者大会上,Windows 运行时开发经理 Martyn Lovell 通过题为 “包围 Windows 运行时”的演讲介绍了 WinRT 背后的设计原则:

  • 任何耗时超过 50 毫秒的事情都应该通过使用了 Async 关键字的异步调用来完成,以确保流畅、快速的应用体验。由于即便当异步调用的情况存在时,许多开发者仍倾向于使用同步 API 调用,因此在 WinRT 深处建立了使用 Async 关键字的异步方法从而迫使开发者进行异步调用。
  • 应用程序彼此之间被更好地隔离开,从而使得一个应用程序的性能不会影响到另一应用程序,同时也是为了获得更好的安全性。隶属于某个应用程序的运行时对象不能被暴露给另一应用程序,除非通过借助标准的操作系统级的通讯信道 Windows 契约(Windows Contracts)来完成。
  • 基于平台的版本控制(Platform-based versioning)确保应用程序在不同版本的 Windows 上运行良好。版本控制信息包含在 WinRT 元数据中,而且智能感知会根据应用程序的目标版本来公开功能,因此开发者无需查阅其他文档就能知道,对于某个特定版本的 Windows 而言,到底有哪些类和方法是可用的。

关于类型,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 界面运行在一个不可重入的单线程之上,然而应用程序的其余部分可以从线程池中使用由运行时环境所自动提供的多线程。

Windows 运行时体验团队的 Harry Pierson 和公共语言运行时团队的 Jesse Kaplan 在 BUILD 开发者大会的另一题为“在C#和Visual Basic 中使用Windows 运行时”的演讲中,介绍了一些使用.NET 语言对WinRT 进行编程的细节。

据Pierson 透露,.NET 对于WinRT 的重大影响在于,许多设计准则被从.NET 中借用过来。例如,通过使用基于.NET 元数据格式更新版本的元数据增强了WinRT 库。就像Silverlight 一样,为了创建Metro 风格应用程序,WinRT 会使用XAML 框架。由于在运行时与.NET 之间存在直接映射:基本类型(primitives)、类(classes)、接口(interfaces)、属性(properties)、方法(methods)等等,并且开发者无法看到那些存在的差异,因此使用WinRT 的.NET 应用程序将会有宾至如归的感觉。

Pierson 还表示,开发者可以用 C#语言创建可供 C++ 或 JavaScript 的 WinRT 应用程序使用的 Windows 运行时组件,然而须要遵守一系列规则:“结构体只能拥有公共数据字段;只允许对XAML 控件使用继承,其它类型都必须使用sealed 关键字;只支持系统提供的泛型。”

在Windows 8、或是后续版本的Windows 中将提供一种经典应用程序与新的触摸友好的Metro 风格应用程序共存的混合环境。基于Metro 风格的未来的Windows 应用程序将受益于Windows 运行时所提供的公共基础设施,开发者必须针对一套唯一的API 进行编程,而对于不同语言会略有差异。在与过去保持兼容性的同时,又为未来提供新功能方面,这是微软所做的最好尝试。

查看英文原文: Design Details of the Windows Runtime

2011-09-28 10:452506
用户头像

发布了 55 篇内容, 共 18.1 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

剑指Offer——你真的看懂无领导小组面试了吗?

No Silver Bullet

面试 offer 2月月更 无领导面试

《MySQL入门很轻松》第3章:数据库的创建与操作

乌龟哥哥

:MySQL 数据库 2月月更

作业2朋友圈高性能复杂度

Geek_28cf33

微信朋友圈的高性能复杂度分析

Leo

架构实战营

几种数据库存储引擎比较

乌龟哥哥

:MySQL 数据库 2月月更

使用 Cilium 增强 Kubernetes 网络安全

张晓辉

Kubernetes 云原生 ebpf cilium

Linux系统编程-进程创建(fork)、外部程序调用(exec)

DS小龙哥

进程 fork 2月月更

Linux系统编程-Shell脚本基本使用(数组、函数、字符串处理)

DS小龙哥

Shell 2月月更

微信朋友圈的高性能复杂度分析

凌波微步

「架构实战营」

架构实战营模块九作业

spark99

架构实战营

国内外最顶级的十大敏捷项目开发管理工具盘点

PingCode

「架构实战营」模块二作业 朋友圈复杂度

hxb

「架构实战营」

WebRTC 如何在安卓系统上采集音频数据 | 社区征文

liuzhen007

音视频 WebRTC 新春征文 2月月更

微信朋友圈高性能架构设计

五月雨

架构实战营 「架构实战营」

从冬奥看中国科技(二):造雪突围进行时

脑极体

微信朋友圈高性能复杂度分析

浪飞

微信朋友圈复杂度分析与设计

刘帅

架构学习【02】——朋友圈高性能复杂度分析

tiger

架构实战营

微信朋友圈复杂度分析&架构设计

AragornYang

架构训练营 架构实战营

微信朋友圈高性能复杂度分析

Bear

「架构实战营」

微信朋友圈架构设计

卡西毛豆静爸

架构实战营

最全总结 | Android 系统抓包喂饭教程!

星安果

android 抓包

微信朋友圈的高性能复杂度分析

石小天

架构实战营

如何用 Python 实现一个单链表

宇宙之一粟

Python 数据结构 单向链表 2月月更

计算机毕业设计安卓疫苗预约APP源码,后台java springboot

清风

安卓 计算机毕业设计

六年安卓开发的技术回顾和展望 | 社区征文

拭心

android 程序员人生 shixinzhang 新春征文 2月月更

微信朋友圈架构设计

随欣所遇

#架构训练营 架构训练营5期

人工智能在客户关系管理软件销售和服务模块中的应用 | 社区征文

Jerry Wang

人工智能 机器学习 SaaS 新春征文 2月月更

微信朋友圈的高性能复杂度

Geek_16d2b8

#架构训练营

[架构实战营]-朋友圈的高性能架构设计

邹玉麒

「架构实战营」

Web Components系列(七) ——自定义组件的生命周期

编程三昧

前端 组件化 2月月更 WebComponent

Windows运行时的设计细节_.NET_Abel Avram_InfoQ精选文章