AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

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:452916
用户头像

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

关注

评论

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

人工智能打造充满创造力的新世界,华为云开发者日无锡站成功举办

华为云开发者联盟

人工智能 华为云 元宇宙 华为云开发者联盟 企业号 3 月 PK 榜

JVM级别的本地缓存框架Guava Cache:探寻实现细节与核心机制

Java你猿哥

Java JVM ssm Guava Cache

医疗卫生机构等保测评法律依据有哪些?多久要测评一次?

行云管家

医疗 等保

视频动态壁纸:Dynamic Wallpaper 激活版

真大的脸盆

Mac Mac 软件 动态壁纸 高清动态壁纸

熬了一个月肝完这份阿里P8的Java面试手册,我从20K变成了30K

Java你猿哥

Java 面经 校招 春招 八股文

独家Java架构师题,面试再不过找我来要赔偿,谢谢

Java你猿哥

架构 面试 ssm 面经 java实战

狂刷《Java权威面试指南(阿里版)》,冲击“金三银四”有望了

Java java面试 Java八股文 Java面试题 Java面试八股文

C#/VB.NET:如何将PDF转为PDF/A

在下毛毛雨

C# .net PDF 文档转换 PDF/A

视频编辑场景下的文字模版技术方案

百度Geek说

企业号 3 月 PK 榜 视频编辑 端渲染 富文本素材

美团二面:细数 Redis 阻塞的9种情况

Java redis 面试

这一次,NineData新功能上线,真的是拼了

NineData

人工智能 sql 开发规范 数据复制服务 企业开发系统

Qualcomm QCN9074 4x4 MIMO 802.11ax MX6974 F5 WIFI6 Module

MAXON

QCN9074

五分钟带你学会微服务熔断原理分析与源码解读

Java你猿哥

微服务 ssm 微服务实战 微服务熔断

人工智能打造充满创造力的新世界,华为云开发者日无锡站成功举办

极客天地

源码中常见的 where 1=1 是一种高级优化技巧?

Java你猿哥

Java 源码 ssm

使用 Metabase 连接 Databend Cloud 实现大屏展示

Databend

卷起来了!阿里最新出品“微服务全阶笔记”,涵盖微服务全部操作

程序员小毕

Java 程序员 微服务 SpringCloud springcloudAlibaba

我有一篇Java Stream使用手册,学了就是你的了!

精品!阿里P7爆款《K8s+Jenkins》技术笔记,高质量干货必收藏

Java Kubernetes k8s jenkins

太全了!马士兵内部共享—1658页《Java面试突击核心讲》

Java java面试 Java八股文 Java面试题 Java面试八股文

RabbitMQ 延迟消息实战

Java 消息队列 消息中间件 Rabbit MQ

机器学习算法(二): 基于鸢尾花数据集的朴素贝叶斯(Naive Bayes)预测分类

汀丶人工智能

数据挖掘 机器学习

流批一体在 AI 核心电商领域的探索与实践

Apache Flink

大数据 flink 实时计算

Github点击破百万!这部《从零开始学架构》神书就此霸榜

Java你猿哥

Java 架构 ssm 面经 架构实战

阿里是如何使用分布式架构的?阿里内部学习手册分享

Java你猿哥

分布式 ssm 分布式架构 分布式实战

即时通讯技术文集(第10期):IM通信协议该选TCP还是UDP [共12篇]

JackJiang

软件测试/测试开发丨app自动化测试之Appium WebView 技术原理

测试人

软件测试 自动化测试 测试开发 appium

大顶堆的实现(基于数组存储的完全二叉树)

Java你猿哥

Java 二叉树 ssm 实战

春招升级打怪拿offer,10w+字总结的Java面试题(附答案)够你刷

Java java面试 Java八股文 Java面试题 Java面试八股文

机器学习算法(三):基于horse-colic数据的KNN近邻(k-nearest neighbors)预测分类

汀丶人工智能

数据挖掘 机器学习

喜讯:祝贺行云绽放荣获深圳市专精特新企业称号

行云管家

云计算 深圳 专精特新

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