2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

评论

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

数智先锋 | 告别运维黑盒!豪鹏科技×Bonree ONE构建全栈智能可观测体系

博睿数据

PromptPilot 实操教程:这套 Prompt 手法包教包会

火山引擎开发者社区

火山引擎

这个Web新API让任何内容都能画中画!

Immerse

百度智能云x中科大脑:「城市智能体」如何让城市更会思考

百度Geek说

公链开发竞争白热化:如何设计下一代高性能、可扩展的区块链基础设施?

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 公链开发代币开发

在AI技术快速落地的时代,挖掘数据库连接工具的真实需求——某知名MySQL协议框架需求洞察

qife122

需求分析 AI辅助开发

Dify入门篇(4)| 初识 Dify 控制台:工作区与应用管理逻辑

测吧(北京)科技有限公司

人工智能

解析 vLLM 架构及源码系列:KVCache初始化之V1版本分析

Jason黄

vLLM源码

5个技巧让文心快码成为你的后端开发搭子

Comate编码助手

AI辅助编程 AI 编程 文心快码 文心快码Zulu

Pro Coder说:那些让文心快码“听话”的方法

Comate编码助手

代码自动生成 AI辅助编程 AI 编程 文心快码 文心快码Zulu

直播预告 | 破解能源转型痛点!全链路可观测如何助力能源业高质量发展?

博睿数据

加密货币交易所开发:如何打造安全、高并发的数字资产交易平台?

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

全球客服行业集体紧张,GPT-5带来的3个颠覆你不可不知

天润融通

Dify入门篇(4)| 初识 Dify 控制台:工作区与应用管理逻辑

测吧(北京)科技有限公司

基于日志的 JuiceFS 可观测最佳实践

火山引擎开发者社区

字节跳动 火山引擎

MySQL内幕揭秘:探索MySQL调优指南,解锁MySQL的强大功能

互联网工科生

深度学习教材自动化翻译系统架构解析

qife122

机器翻译 自动化系统

链游(GameFi)开发破局:如何平衡可玩性与经济模型可持续性?

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

证件照制作冲印小程序系统:多平台解决方案

微擎应用市场

字节跳动 VeOmni 框架开源:统一多模态训练效率飞跃!

火山引擎开发者社区

字节跳动

打工人必看!ToDesk/网易UU/向日葵:远程办公文件协作效率与安全实测

小喵子

网易 文件传输 向日葵 ToDesk ToDesk云电脑

我们如何识别软件缺陷并优化代码性能

qife122

软件工程 Bugzilla

Databend 向量索引:加速 AI 应用的数据引擎

Databend

手边酒店 V2 系统:助力酒店民宿轻松搭建专属订房小程序

微擎应用市场

低空经济增长周期,如何让无人机飞得更稳更远?

DevOps和数字孪生

低空经济 飞行棋

用友BIP人力五大智能体发布,洞见人才价值 驱动组织进化

用友BIP

从0到1:构建下一代去中心化应用(DApp)的全栈开发指南

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 代币开发 交易所开发公链开发

法国农业部如何利用Elastic技术监控商业捕鱼业

qife122

数据分析 Elastic技术

VIP 菜谱小程序系统:美食应用解决方案

微擎应用市场

API接口赋能1688采购全流程:从商品获取到下单支付一键贯通

Noah

基于OpenHarmony的Nexus_Geometry_Nano_Board亮灯实验

华为云开发者联盟

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