首页
社区
课程
招聘
[讨论]WinRT出来了,现在的反编译还能走多长?
发表于: 2011-9-20 15:50 13656

[讨论]WinRT出来了,现在的反编译还能走多长?

2011-9-20 15:50
13656
WinRT:Win32的面向对象替代品
http://www.infoq.com/cn/news/2011/09/WinRT-API
WinRT不是另一个抽象层;它就像Win32 API一样,直接驻留在内核之上。自从1993年Win32伴随Windows NT被引入以来,这标志着对于Windows核心的首次重大突破。WinRT与Win32截然不同,它代表了新的语义学应用程序执行环境。

不像Win32是用C语言思想设计的,而WinRT API是用C++编写的,并且从一开始的设计就是面向对象的。一致性、易用性、以及性能都是新的运行时API的重要方面。WinRT API中的每个对象都支持反射,以便甚至连诸如JavaScript等动态语言都可有效地使用它们。随之而来还有统一对象模型,这对于基于库的C++而言是个稀罕物。

附注:Win32 API并未被移除,而且那些使用传统应用程序执行环境的较早的应用程序将继续按预期方式工作。

C++开发

在C++中编写用户界面将首选XAML。所有与XAML一起使用的库都已被移植到C++,并且被编译为本地x86版本。使用XAML和C++编写的Metro风格应用程序并不运行在.NET之上,它们就像其他任何Visual C++应用程序一样,被直接编译为x86版本。

调用UI控件的方法就像在C++中调用任何其他对象的方法一样。在机器码级别上,某个指令将this指针推送到堆栈上,然后通过虚函数表(v-table)调用相应函数。这使得即使在低功耗设备上也能达到最优的性能。

支持一些现代的C++应用程序所用的库,例如Boost。

重叠窗口不复存在

对话框是来自上一版Windows的核心概念,而在WinRT中它将不复存在。对于微软而言,性能成本和可用性问题已不再是理所当然的。希望使用这种模式的应用程序将要开发其他的方式来传递信息,例如消息框的方式。

另一并未纳入WinRT的库是GDI。如果某个应用程序要使用Metro风格界面,那么它需要按自上而下的方式来做,将Metro风格与经典用户界面相混合的情况是不可能出现的。

PlayTo契约

另一被公开的契约是PlayTo(由……发挥)。这使得应用程序可发送如音频及视频等媒体文件到某个charm[1]。然后那个charm将允许用户选择某个他们想用的应用程序来查看该文件。据推测,媒体文件不仅限于物理文件,而是任何可表示为数据流的媒体形式。

C#/VB:平台调用(P/Invoke)之终结

从.NET中调用本地函数通常涉及建立结构和操纵指针。而在WinRT环境下,所有的API被公开为许多可通过C#及VB直接使用的对象。这把.NET开发者置于与C++开发者平等的层面上。

应用程序的响应速度对于微软而言是非常重要的。所有耗时超过50毫秒的操作系统级别的API调用将被公开为异步操作,正是为了向开发者传递这种价值观。

JavaScript

对于Windows 8而言,第四大语言就是JavaScript。尽管它不使用XAML,但它就像本地及.NET应用程序一样,拥有对底层WinRT API的直接访问权。这不仅是个像PhoneGap一样的容器,JavaScript开发者还可获得与其他开发者所使用的同样丰富的API。

由于是JavaScript,因此所选择的UI工具包是HTML和CSS而非XAML。IE 10及Metro风格的JavaScript应用程序使用的是同一渲染引擎,尽管那些应用程序实际并不运行在浏览器中。JavaScript应用程序看起来就像任何其他Metro风格应用程序一样。

JavaScript中的用户控件几乎与C++及.NET中的控件不相上下。有些控件对于HTML渲染引擎而言是固有的,而另外一些控件则是用JavaScript编写的。这些基于JavaScript的控件都是基于div的,非常像那些使用jQuery创建的控件。

应用程序容器和应用程序权限

Metro风格应用程序运行在被称为“应用程序容器”(app container)的环境中。这似乎取代了由基于Win32应用程序所使用的窗体环境。

大多数API调用被直接发送给底层内核。然而,有些调用将被通过系统代理(system broker)路由。系统代理确保应用程序只能访问那些经用户已批准的功能。例如,当某个应用程序首次尝试访问摄像头时,服务代理(service broker)将提示用户以获取他们的批准。应用程序必须包括一份清单,其中注明该应用程序可能需要的所有限制服务。这种模式对于移动设备开发者而言将是非常熟悉的。

所有Metro风格应用程序都会运行在WinRT的应用程序容器中,而且会受到系统代理的监控,甚至连那些用C++编写的应用程序也不例外。该思想是为了限制应用程序破坏系统的能力。虽然也许并不是不可能的,但是在WinRT下创建恶意软件与在Win32中相比将会难得多。

所有Metro风格应用程序必须进行数字签名

不允许匿名应用程序。应用程序为了测试可进行自签名,但是当它们出现在应用商店里时,它们就必须使用真实证书进行签名。

译注

[1] charm,微软已将“CHARM”注册为计算机、软件产品、电气和科学产品类商标。微软将CHARM描述为计算机程序、图形用户界面软件和操作系统程序。在触摸版Windows 8中,charms在屏幕右侧;在传统版(使用鼠标和键盘)Windows 8中,charms出现在屏幕左侧。charms包括:Search(搜索)、Share(分享)、Start(开始)、Devices(设备)、Settings(设置)。详见微软申请Windows 8功能charm注册商标(图)。
查看英文原文:WinRT: An Object Orientated Replacement for Win32

译者 高翌翔 基于.NET平台进行Web应用程序设计、开发,关注敏捷开发和架构设计,及各种提高代码可维护性的最佳实践。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 164
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
感觉WinRT还是一个基于Win32API的框架。。。。。。还是上层结构。
2011-9-20 15:55
0
雪    币: 2307
活跃值: (1013)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
熟悉net开发的人员将会率先强势插入啊
2011-9-20 16:10
0
雪    币: 164
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
.NET应该还是离不开IL中间层语言。
2011-9-20 16:23
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这里写 WinRT不是另一个抽象层;它就像Win32 API一样,直接驻留在内核之上。。。。。
2011-9-20 16:49
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
6
WinRT看了,表示丫最后还是native api去搞事~根本没真直接内核~
2011-9-20 17:16
0
雪    币: 164
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
我也是这么认为。只是提供另外一套面向对象的接口。
2011-9-20 18:59
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
8
想一想真要直接OO一路支持到内核...那系统内核版本号的变动巨大了~
2011-9-21 04:14
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个不懂。。。。。
2011-9-21 08:13
0
雪    币: 164
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
最底层无论如何要面向机器的。
2011-9-21 13:11
0
雪    币: 21
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
唉``和JAVA有区别么,那东西```反正是浪费机器资源的东西`
2011-9-21 14:12
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
12
所以还是X64 WINXP最爽~
2011-9-21 14:46
0
雪    币: 237
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
看来.Net还是太耗电啊,Google Android也早就应该把那个Java虚拟机摘掉了,直接用C++或者别的编译型语言写应用,底层也用C++做API。
2011-9-21 15:29
0
雪    币: 135
活跃值: (719)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不管用什么语言,与机器打交道那部分还是C语言高效.
以前上学的时候老觉得c能做什么,开发界面什么的太慢了,后来硬件知识学多了,才觉得c真是万能的

其实不管怎么弄抽象层,到OS那儿基本上还是离不开高效的C.比如,简单的能够完成的功能,为什么非得搞个"对象",再额外传个this指针.

关于面向对象,接触C#时就看不管,md明明是个main函数,非得为了"完全"面向对象,要入在一个类里面!
2011-9-21 20:05
0
游客
登录 | 注册 方可回帖
返回
//