AICon 深圳站 Keynote 嘉宾官宣!共探AI价值转化的实践路径 了解详情
写点什么

深入了解通用应用程序(Universal Application)

  • 2015-06-05
  • 本文字数:1670 字

    阅读完需:约 5 分钟

通用应用程序(Universal Application)的基石之一是.NET Native。这是微软的“云端编译器”,它能够把 Windows 应用商店中的程序编译成所支持的每种设备的机器代码。

.NET Native 不使用 JIT 编译器,其结果是,用户可以在冷启动中节约最多达 60% 的时间,而在热启动中则最多达 40%。编译器将查看整个应用程序,从而可以去掉用不到的功能,这在一些应用程序中可以节约最多达 30% 的空间。

第二块基石是叫做“自适应应用程序(adaptive app)”的概念。这个概念是指当应用程序所运行的设备上的一些功能和 API 并不存在时,仍然能够正常运行。只要遵循正确的模式,原生编译器就会去掉对那些在用户设备上不存在的 API 的引用。

.NET Native 的另一个好处是,它允许微软以更快的节奏运转。应用程序静态链接到大部分框架库,这意味着你不太可能看到已发布应用程序的破坏性改动。开发人员必须明确选择可能破坏应用程序的新版本,这意味着微软不必过于担忧破坏性改动的问题。

最后,.NET Native 使得微软在框架库中发现安全漏洞或者需要支持新的 CPU 架构时,可以自动重新编译应用程序。后者不仅仅停留在理论上,微软透露他们计划在今年秋天支持第四代 CPU 架构。

调试的工作流程

默认情况下,Windows 10 应用程序在调试模式会编译成 IL,而在发布模式会编译成原生代码。这可以通过项目属性窗口中的编译器标志来改变。开发人员大部分时间应该使用调试模式,因为.NET Native 的构建时间明显要更长。

在设备上调试时,Visual Studio 需要推送一个额外的库 CoreCLR。这包括许多应用程序通常不需要的功能,所以当应用程序从 Windows 应用商店安装时不包括这个库。

版本 **** 号设置

在通用应用程序中,将不允许开发人员使用四位数字的版本号码。虽然开发人员还可以使用前三位数字,但是第四位数字保留由.NET Native 编译器使用。

任何 CPU

对通用应用程序,开发人员不能够指定任何 CPU(Any CPU)为目标架构。微软要求应用程序的开发人员确实已针对目标硬件测试了他们的应用程序。

AppX 打包选项

调试版本的程序包包含基于 MSIL 的库。调试模式的构建不适合设备上的旁加载(side-loading),因为设备上可能没有安装框架库的正确版本。

发布版本的程序包包含原生编译的库,带有发布所需的元数据。

运行时指令(rd.xml)

运行时指令(Runtime Directives)用于告诉编译器你要通过反射访问什么类型。如果你没有正确地列出类型,优化器可能会删除类型的元数据、甚至类型本身。

在运行时指令文件中指定过多信息的坏处是,你会无谓地增加应用程序的大小。如果这一点不成问题,那么你可以保留所有的默认设置。

.NET Native 的最佳实践

在调试模式开发你的应用程序,可以获得更快的构建和测试周期。

定期在发布模式进行测试,以确保不会引入涉及.NET Native 的错误。不要等到项目临结束时,才来解决原生的问题。

.NET Native 的工作计划

对于将来的计划,微软打算减少原生编译应用程序的构建时间。他们也想要找到分享框架程序包的办法,从而减小应用程序在硬盘上的大小。

事后调试

如果你的应用程序在你无法访问的设备上崩溃,你就要从开发者门户获取调试符号(debug symbols)。使用这些符号需要匹配的源代码,因此请确保你有一个匹配的分支。

Windows 10 通用应用程序与 Windows 8.1 将具有相同的外围应用(surface area)。“是的,WCF 将可以在 Windows Phone 上运行。”未来版本的通用应用程序将通过 NuGet 随时发布。

便携式类库如果以.NET 核心 4.5.1 为目标,则将照常工作。

行动呼吁

微软希望尽快知道在普通编译和.NET Native 编译的行为之间是否有任何不同。请把问题报告到 dotnetnative@microsoft.com。

欲知更多关于通用应用程序的信息,请观看 Channel 9 的视频,深入了解XAML 和.NET 通用Windows 应用程序的开发

查看英文原文: Deep Dive into Universal Applications


感谢邵思华对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-06-05 10:383813

评论

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

【21-15】PowerShell条件判断

耳东@Erdong

PowerShell 6月日更

GO database/sql 连接池源码分析

非晓为骁

源码分析 Go 语言 连接池 database

“AI赋能”大学计划落地,英特尔联合生态伙伴推进产教融合

E科讯

在云原生场景下构建企业级存储方案

青云技术社区

云原生

有状态应用如何在Kubernetes平台上快速迁移和重建

焱融科技

云计算 Kubernetes 容器 云原生 高性能

在线HTML标签清除工具

入门小站

工具

react源码解析18事件系统

全栈潇晨

React

软件复杂度

海拉鲁

读书笔记 软件工程 软件设计

简单好用一键恢复丢失办公文档

淋雨

EasyRecovery 文件恢复 免费恢复软件 硬盘数据恢复

容器化 | MySQL on K8s 开源开放的高可用容器编排方案

RadonDB

MySQL 容器 RadonDB KubeSphere

Python——默认字典 (defaultdict)

在即

6月日更

在线PS(PhotoShop),打开PSD文件,图像处理

入门小站

PhotoShop ps

JAVA 面向对象 (十)--接口和抽象类

加百利

Java 后端 笔记 6月日更

极狐GitLab致力打造DevSecOps 行业标准

极狐GitLab

ci 修复措施 安全扫描器 安全测试

不管卷不卷,面试还是得问问你G1原理!

艾小仙

Java 编程 程序员

详解Java中static关键字和final关键字的功能

华为云开发者联盟

Java static关键字 final关键字 静态变量

分布式数据库在抖音春晚活动中的应用

火山引擎开发者社区

数据库 后端

技术干货 | macOS桌面端录屏采集实现教程

ZEGO即构

大前端 音视频 WebRTC 屏幕录制

Linux之rmdir命令

入门小站

Linux

软件开发项目中,产品经理和程序员谁更累?

万事ONES

产品经理 研发管理 ONES 项目经理

迷惘的六月份

卢卡多多

生活状态 6月日更

Java进阶 | 泛型机制与反射原理

晨雨听风

Java

云小课|RDS实例连接又失败?看我祭出杀手锏!

华为云开发者联盟

数据库 关系型数据库 云数据库 RDS GaussDB(for MySQL)

使用 VideoToolbox 探索低延迟视频编码 | WWDC 演讲实录

网易云信

低延时

Elastic Job简单使用

赵镇

Elastic-job

Redis:我是如何与客户端进行通信的

码农参上

redis Redis 协议

文件保险箱——用区块链保护文件

趣链科技

区块链 区块链应用

一次性搞清Java中的类加载问题

华为云开发者联盟

Java

OpenCV-Python+Moviepy结合进行视频特效处理

老猿Python

Python 音视频 Video PPT 引航计划

网络抓包实战01——互联⽹:客户端请求是如何到达服务器的

青春不可负,生活不可欺

Wireshark TCP/IP tcpdump 网络抓包 tcpcopy

做好项目管理,项目经理需要具备哪些优秀品质?

万事ONES

项目管理 研发管理 研发管理工具 ONES

深入了解通用应用程序(Universal Application)_.NET_Jonathan Allen_InfoQ精选文章