写点什么

深入了解通用应用程序(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:383771

评论

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

哪些vue面试题是经常会被问到的

bb_xiaxia1998

Vue 前端

顺序、时钟与分布式系统

分布式 时钟

各编程语言 + aardio 相互调用示例

Java-fenn

Java

JVM 6:类加载与类加载器

Java-fenn

Java

从使用者,DBA,内核开发三个不同角度来分析SQL的性能问题

数据库 postgresql sql database

跟着卷卷龙一起学Camera--内存池浅析02

卷卷龙

ISP 9月月更

后端打工人必知必会21个MySQL表设计的经验准则

程序员小毕

MySQL 数据库 程序员 程序人生 Java 面试

数据库路径选择理论与postgreSQL实现

数据库 postgresql 遗传算法

OpenJDK 的原生 Wayland 支持正在取得进展

Java-fenn

Java

Java服务异常排查定位大图

慕枫技术笔记

后端 9月月更

面试官:这些js手写题你会吗

helloworld1024fd

JavaScript 前端

Dubbo 泛化调用引发的“血案”

Java-fenn

Java

MyBatis 查询数据库入门

Java-fenn

Java

Spring MVC 开发入门

Java-fenn

Java

亿级异构任务调度框架设计与实践

Java-fenn

Java

最近几周react面试遇到的题总结

beifeng1996

前端 React

工作笔记之 SELECT 语句在 SAP ABAP 中的用法总结(下)

宇宙之一粟

数据库 abap 查询语句 select 9月月更

如何将 SAP 电商云 Spartacus UI 部署到 tomcat 上运行

汪子熙

angular SAP commerce Spartacus 9月月更

RocketMQ&kafka消息队列性能优劣对比

程序员小毕

程序员 面试 RocketMQ 后端 消息队列

Rust学习入门

Java-fenn

Java

这些js手写题对我这个菜鸟来说写不出来

helloworld1024fd

JavaScript 前端

浮点, 让多少老司机折戟?

浮点数 计算机原理 计算机科学与技术

Java服务异常排查定位大图

Java-fenn

Java

2022react高频面试题有哪些

beifeng1996

前端 React

percolator的理解与开源实现分析

数据库 分布式 事务

数据库并发控制理论

数据库 postgresql 并发控制 database

用了这个IntellijIDEA插件以后,我写代码快了10倍!

Java-fenn

Java

kubernetes“雪崩了”

Linux 云原生 #Kubernetes#

对领域驱动设计的理解与社交领域的实践

微服务 微服务架构 DDD

JDK19新特性使用详解

Java-fenn

Java

Java 学习 --SpringBoot 常用注解详解(二)

Java-fenn

Java

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