写点什么

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

评论

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

北鲲云计算:为药企研发的飞速发展提供助力

北鲲云

[灵魂拷问]MySQL面试高频100问(工程师方向)

编程菌

Java 编程 程序员 面试 计算机

上游思维:如何定义成功?

石云升

读书笔记 8月日更 上游思维

获取自己的公网 IP 地址

耳东@Erdong

IP地址 8月日更

网络攻防学习笔记 Day110

穿过生命散发芬芳

网络安全 8月日更

【前端 · 面试 】TCP 总结(一)—— 概述

编程三昧

8月日更

云原生 | 混沌工程工具 ChaosBlade Operator Pod 篇

RadonDB

数据库 混沌工程

OceanBase 常见参数和变量究竟有什么本质区别?

OceanBase 数据库

数据库 oceanbase OceanBase 开源 OceanBase 社区版

Springboot通过@WebFilter日志双份打印BUG分享

FunTester

性能测试 springboot bug

hadoop 基本原理与应用

神策技术社区

hadoop 程序员 Hadoop全分布式集群

硬核技术,带你走进3D点云车道线自动识别

澳鹏Appen

自动驾驶 机器学习 训练数据 3D点云 车道线标注

心态炸了!我的join查询多加了个过滤条件性能就崩了

林一

MySQL 查询优化 多表join

fil挖矿的规则是什么?fil挖矿收益如何?

区块链 分布式存储 IPFS fil收益 fil挖矿

分享 6 个JavaScript学习资源

devpoint

JavaScript GitHub 8月日更

神策数据微信小程序 SDK 功能介绍

神策技术社区

小程序 微信 代码 神策数据 维护

三分钟了解大数据技术发展史

张浩_house

人工智能 机器学习 大数据

从 0 到 1 ,不能忽略的「道」

非著名程序员

产品 产品经理 认知提升 8月日更

基金这么赚钱!!编程实现基金从采集到分析通用模板!(白酒为例)

Python研究者

8月日更

Flink 和流式应用运维(十-下)

Databri_AI

flink 监控 Web UI

前端之算法(九)回溯算法

Augus

算法 8月日更

ipfs国家认可吗?ipfs挖矿靠谱吗?

IPFS国家认可吗 ipfs挖矿靠谱吗

ASM 实现 Hook Lambda 和方法引用

神策技术社区

大前端 后端 asm 代码 神策数据

文化与科技的交织,华为P50 Pro与一曲长城谣

脑极体

Python开发篇——RSA加密算法和SHA1计算文件校验码

吴脑的键客

Python

GrowingIO Design 组件库搭建之单元测试

GrowingIO技术专栏

单元测试 Jest Storybook

Windows Server 2019 安装提要 (及 VS 2019 Build Tool) - 续

hedzr

DevOps vscode windows server 2019 server core visual studio 2019

MySQL中FROM_UNIXTIME与UNIX_TIMESTAMP

一个大红包

8月日更

【微积分的力量】芝诺悖论

LeifChen

8月日更 微积分 芝诺悖论

第一次看房

escray

生活记录 8月日更

基于 CODING CD + Nocalhost 在大型应用的 ChatOps 实践

CODING DevOps

DevOps 工具 CI/CD 开发测试 ChatOps

科技的世界里没有“粉红税”

脑极体

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