读书频道 > 网站 > 网页设计 > Windows运行时编程权威指南
1.1 Windows应用商店应用的技术栈
15-03-30    下载编辑
收藏    我要投稿   

本文所属图书 > Windows运行时编程权威指南

《Windows 运行时编程权威指南》分为两部分,共11章:第一部分(第1~3章)囊括了所有WinRT和Windows应用商店应用开发人员必须了解的重要概念,包括WinRT 类型系统及其设计原则、异步调用、程序包文件,以及应立即去当当网订购
图1.1展示了可用于创建Windows应用商店应用程序的三种技术栈(technology stack)。该图的底部为一个名为“Windows”的大矩形框。它囊括了Windows开放给开发人员的各种特性。右边名为“Win32和COM”的框代表了目前装运在Windows上的许多版本的API。Win32和COM API古老而复杂,而且是专为本机C/C++开发人员而设计的。左边名为“WinRT”的矩形框代表了新一代的WinRT API。WinRT是一种为许多编程语言而设计的现代、简单易用、面向对象的API。顺便提一句,图中矩形框的尺寸并不反映API的规模,例如Win32和COM API的数量远多于WinRT API。

从技术角度讲,所有的Win32、COM及WinRT API都可同时为桌面应用和Windows应用商店应用所调用。然而,WinRT API更简单,易用性更好,因此你应当尽可能地考虑多使用它。虽然Windows应用商店应用可调用任何Win32或COM API,由于应用容器的安全上下文,许多这样的调用都会导致程序失效。应避免对某些Win32和COM API的调用,因为它们可能会违反之前提到的若干原则。实际上,微软专门创建了一个允许Windows应用商店应用使用的Win32和COM API许可列表(详情请参阅http://msdn.microsoft.com/en-us/library/windows/apps/br205757)。如果你的Windows应用商店应用使用了该许可列表中未列出的Win32或COM API,该应用将无法得到Windows应用商店的认证。

笔者发现,在应用开发过程中,有时调用一些未被许可的Win32和COM API十分有用。例如,笔者有时在开发中会调用Win32 API MessageBeep,这样当笔者的某个特定位置的代码段执行时,便会听到蜂鸣提示音。然后,将自己的应用提交至Windows商店进行认证之前,笔者会将代码中对这些API的调用移除。

操作系统的主要目标是对硬件设备进行抽象,以简化应用开发者的工作。例如,PC可在硬盘、固态硬盘(SSD)、USB、DVD、网络中共享存储文件。操作系统将数据存储抽象为文件,应用开发人员只需编写代码打开文件并读取其内容便可而无需了解何种硬件设备包含了该文件,以及如何与该设备进行通信。如果你仔细查看WinRT API,将看到许多API都与对硬件设备进行抽象有关,只有少量API(如应用程序模型API)与在系统中管理你的应用有关。

微软支持三种不同的可为开发人员构建Windows应用商店应用的技术栈:本机C/C++、.NET(C#与Visual Basic)以及JavaScript。每个技术栈都拥有自己的编程语言、支持类库、表示层(presentation layer)以及可选的执行引擎或虚拟机。接下来,笔者将详细介绍每个技术栈(如图1.1所示):

本机C/C++ 开发人员既可使用本机C/C++调用WinRT API来利用操作系统的功能,也可在代码中使用各种C和C++的运行时库。

然而,并非所有的C运行时(CRT)函数都可为Windows应用商店应用所使用。详情请参阅http://msdn.microsoft.com/en-us/library/windows/apps/jj606124.aspx。对于应用的表示层,C/C++开发人员可使用DirectX API(用于高性能图形应用)或WinRT的XAML API(用于基于窗体的应用)。实际上,单个应用可同时使用DirectX和XAML;详情请参阅http://msdn.microsoft.com/en-us/library/windows/apps/hh825871.aspx。DirectX提供了Direct2D和Direct3D两个库,而XAML提供了对2D基本图元和特效的支持。

当开发人员比较关注节约内存和提升应用性能时,通常会使用该技术栈。使用本机C/C++的最常见的应用场景可能是构建实时游戏。由于C/C++被编译为本机代码,开发人员必须针对他们所希望支持的每种架构的CPU重新编译代码,为每种CPU架构创建一个程序包,并将所有程序包提交至Windows应用商店进行认证。

C#与Visual Basic 开发人员可使用C#或Visual Basic调用WinRT API以利用操作系统的功能,也可在代码中利用.NET框架类库的一个较小子集。开发人员通常会通过这种方式来提高生产率,因为.NET提供了大量特性,如垃圾回收、运行时强制类型安全、反射、语言集成查询(LINQ)、正则表达式解析等。至于应用的用户界面,.NET开发人员可利用WinRT的XAML API来创建基于窗体的应用。如果希望对用户界面获得更多高性能的控制,.NET开发人员还可利用P/Invoke来调用DirectX API。

如果你将项目的构建目标平台(Build Platform Target)值设为AnyCPU(创建新项目时的默认值),所得到的可执行(EXE)程序或动态链接(DLL)文件便不会与某种特定的CPU架构建立关联(假设你在程序中没有使用任何依赖于特定CPU的库或SDK)。这就使得你可创建能够在任何CPU架构上运行的单个程序包,并提交到Windows应用商店。

JavaScript 开发人员还可通过JavaScript和一个由微软提供的名称为WinJS的JavaScript库调用WinRT API以利用操作系统的功能。该库封装了大量基础功能,如应用程序模型、promises(用于异步函数调用)、数据绑定以及一些UI控件。开发人员也可在代码中利用许多已有的JavaScript库(如jQuery)。对于应用的表示层,JavaScript开发人员可利用HTML和CSS来创建基于窗体的应用。当开发人员已经对JavaScript、HTML、CSS比较熟悉时,通常会采取这种路线。这样,要构建Windows应用商店应用,这类开发人员只需了解WinRT API便可。

在将程序提交至Windows应用商店进行认证时,JavaScript开发人员需要将源代码嵌入在程序包文件中。由于源代码只是文本,不依赖于任何CPU架构,因此只需要提交一个程序包即可。在运行时,微软的IE浏览器虚拟机将对其中的源代码进行解析,使其可运行在任意CPU架构上。HTML和CSS最终被翻译为DirectX,这正是应用的基于窗体的用户界面向用户呈现的基本原理。

开发人员经常会询问在构建Windows应用商店应用时,哪种语言或框架是最佳选择。在绝大多数场合,微软都会鼓励开发人员使用他们自己了解的方式。WinRT API对上述三种技术栈一视同仁,但出于以下一些考虑,你可能会更倾向于选择其中的一种:

性能 虽然.NET和JavaScript的运行环境都拥有如垃圾回收和运行时编译器这样的便利特性,但C++并不具备这些。在大多数情形下,这些运行时的性能损失可忽略不计,尤其是当你理解了运行时及互操作层的工作原理之后。然而,这有时会成为一个决定性的因素。例如,你可用HTML和JavaScript编写简单的画布游戏;但对于实时动作游戏,C++和DirectX通常是一种更优的选择。

遗留代码及第三方代码 你可能会由于手中已有一些使用特定语言编写的代码而选择某种技术栈。这种情况下,你可在Windows应用商店应用的程序包中以私有方式部署某个库或组件,那些代码将在你的应用的应用容器中运行。这意味着它必须遵循同样的原则,且不得执行审核清单上没有列出的任何Win32或.NET调用。

共享 你可能会由于自己希望做到只编写一次代码,便使其可为不同应用所共享而选择某种技术栈。例如,你可能会由于希望在Windows应用商店应用中使用与Windows Phone或ASP.NET应用相同的逻辑而选择C#语言来编写代码,或由于希望在Windows应用商店应用和某个网站共享代码而选择JavaScript。

框架支持 每种技术栈在不同领域都有自己的优势。例如,当你需要处理大量XML文件时,考虑到.NET对LINQ-to-XML的强大支持,它无疑是一个很好的选择。类似地,选择C++,则可使用STL或BOOST库,而选择JavaScript则可使用jQuery库,以简化HTML文档操作。

IP保护 使用JavaScript编写的Windows应用商店应用会将实际源代码(.js文件)装运在程序包内。这意味着源代码最终将位于用户系统中,而专业用户可找到这些源文件,并查看其内容(尽管当程序包中的任何文件被修改时,Windows不会加载该应用)。类似地,.NET应用中装运了程序集,其中间语言(IL)可被轻易地反编译。这对于.NET应用已是老生常谈。由于C++代码可编译为机器语言,要在其基础上进行逆向工程难度颇大。

你完全不必拘泥于某一种编程语言。实际上,你可同时使用C++、C#或Visual Basic语言来编写代码,并将其编译为自己的WinRT组件,从而可为任何编程语言所调用。例如,你可将一些已有的使用C++ STL的代码包装为一个可供C#调用的C++ WinRT组件,然后该C#组件可能会被JavaScript调用,以通过HTML来呈现某些用户界面。顺便提一句,作为Windows的一个组成部分而被装运的WinRT组件是用C/C++编写的,并可为任何编程语言所调用。请注意,你不能使用JavaScript创建WinRT组件,因为没有任何编译器能够生成WinMD文件(本章稍后将进行介绍)。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站