首页 > 知识库 > .NET > Win8探索学习笔记
2015
06-27

Win8探索学习笔记

目录

“程序”的“安装”

基于JS的metro程序基础

基于C++的metro程序基础

WinRT(desktop)之Hello, World

WinRT之语法扩展

“程序”的“安装”

传言win8改变了很多,恩,废话。我希望试图从开发人员关心的角度来了解一下win8,对于用户而言,其实我觉得win8改变真的不多,无非就是修改了一下开始界面,然后程序会使用metro风格的界面,对于开发人员来说,可能变化的比较多,多了很多新名词,我希望能对其有所了解,所以记录一下我所看到的,当然,由于win8其实只是一个预览版,很多东西我觉得还是会变的,所以真正的东西出来的时候或许还会有些不一样吧。

首先关于变化,我想到的是“程序”是如何“安装”和“运行”的,之所以用这么多引号,是因为变化太多,我甚至不知道该不该用“安装”等来表达。有点乱,慢慢来吧,有新的发现就更新下面的内容。

(1) win8程序的类型

win8新增了metro,主要是希望便于平板等触摸设备上使用。从大的类别分,win8上的程序分为desktop和metro程序(暂且,我就这么分吧,因为据说win8会有多个版本,支持arm和x86处理器,并不是所有处理器都支持desktop和metro版本,PS:我所使用的是MS的64bit+VS11的preview 版本,安装在VBox中)。

对于desktop程序,只能运行在“desktop”环境下,metro风格的程序,只能运行在“metro”环境下。desktop环境,就和我们的win7类似。至于“metro”,在后面还会慢慢的研究。

(2) desktop程序如何”安装”到”开始界面“中

参考怎样在Windows8桌面上创建自定义快捷方式

说明:这里说的程序是desktop的。

简单来说,对于一个exe文件,通过创建其快捷方式(假设为hello.exe – shortcut),将快捷方式放到:

C:ProgramDataMicrosoftWindowsStart MenuPrograms

中,或者在这里创建一个文件夹,放到文件夹中也是可以的。然后,到win8的start界面中,查找这个程序的名字hello.exe,就会出现了,用右键选中这个程序,就可以将其pin到start界面中。

问题一:一个程序pin到start界面,这些pin的信息保存在哪里的?

只要在C:ProgramDataMicrosoftWindowsStart MenuPrograms,那么在start界面搜索都是可以出现的,那么这个比较容易理解了,搜索会自动去这个目录下遍历。那么哪些程序被pin了,这些信息保存在哪?相信肯定是某个注册表项的吧,具体就不去找了。

问题二:所有能在start界面搜索到的程序(的快捷方式)都是在上面这个目录下保存的吗?

事实上,C:Users<username>AppDataRoamingMicrosoftWindowsStart MenuPrograms目录下也是可以保存的。至于还有没有其它目录也可以被start界面搜索到,那就不清楚了。

总结:传统的desktop程序在win8下都是没有问题的,win32的API那些东西都还是支持的,什么MFC都是可以用的,弄个快捷方式到metro风格的start界面上也是可以的,只是运行还是会自动切换到desktop模式下。下面的内容开始探索metro程序到底是怎么”运行“的。到底是二进制本地运行还是在.net虚拟机上运行,还是在一个所谓的native实际上还是“虚拟机”的解释环境下执行,慢慢来吧。

基于JS的metro程序基础

(1) Metro程序支持的开发方式和语言

对于Metro风格应用开发,可以使用JS实现程序逻辑,结合HTML5/CSS3设计用户接口;也可以使用C++, C#或VB结合XAML来实现用户接口,使用Native C++或托管C#或VB来实现应用程序逻辑。对于Metro风格的C++游戏,可以使用Native C++的DX11库和HLSL等。

对于Win8,本地扩展允许用户构建可重用的组件库,可以使用C++、C#或VB构建组件,然后使用JS或者其它的支持的语言在程序中调用这些组件。

(2) 下面是Win8提供的VS11预览版对Metro支持的工程选项

Win8探索学习笔记 - 同创卓越 - 1

(3) 使用JS实现的hello, metro

实现hello, metro很简单了,用VS 11新建一个最简单的JavaScript工程,默认的工程模板如下:

Win8探索学习笔记 - 同创卓越 - 2

简单分析一下,这里有css文件夹、images文件夹、js文件夹、winjs文件夹和default.html和一个manifest文件。其实,和一般的web程序是一样的,default.html是“起始页”,css和images和js文件夹是对应的一些引用的文件了。winjs文件夹,重点说明一下,是win8为基于JS的metro程序创建的一个JS库吧,暂且理解这么多。然后package.appxmanifest,对于开发人员都很熟悉了,打包用的一个列表文件,在VS中,双击打开可以使用UI的方式编辑了。打开default.html,里面其实就是对其它的css/js文件的一些引用了,就是提供了一个简单的模板工程了。

到了这里,我已经大概猜测到了,基于JS的metro程序最后还是打包一下,放到一个“虚拟机”/”runtime”上去跑而已,原本以为MS会把JS编译到二进制,成为native程序的,下面会进一步证明这一点。

简化上面的工程,删除css、js、和winjs文件夹,最后只剩下images、default.html、package.appxmanifest的内容。事实上,这才是一个”最简单“的基于JS的metro工程。default.html内容如下:

<!DOCTYPE html>  
<html>
<head>
    <title>Hello,metro </title>  
</head>  
<body>  
    <button>  
        Hello, Metro with JS!  
    </button>  
    <p>  
        This is an metro app implemented by JS!  
    </p>  
</body>   
</html>

然后,使用VS的start without debuging运行就可以切换到metro界面运行这个程序了。

发现几个问题:

1. 不支持JS中的部分内容,比如alert这么常用的东西没支持,需要使用winJS里面的一些东西去实现吧,参考http://social.msdn.microsoft.com/Forums/zh-SG/winappswithhtml5/thread/dbdabf29-206d-4d93-a491-b5e8fcd6a920提到了这个问题。

function alert(theMessage) { 
        Windows.UI.Popups.MessageDialog(theMessage).showAsync().then();
}  
  
function doingSomethingAndWantToShowAnAlert() {          
        alert("Hello Nurse");  
}

2. VS11的智能提示有些问题,比如上面的这个JS的实现的那个Windows….就没有任何提示,完全手写的。

3. 用VS运行之后,回到desktop的VS中之后,再次用VS无法运行程序(编译没有错误,问题在于运行),提示”神马文件被其它神马打开神马的”,一看就知道文件正在被使用,非要我用任务管理器kill掉metro程序的进程后才能用VS再次启动。PS:要是这样,别人边写程序边测试不是要麻烦死了,跑一次就要用一下任务管理器。

4. 上面这样一个简单的metro程序,占用的内存居然可以到10M以上,即使是到desktop中,进程处于suspended状态,依然不变。PS:个人对内存占用倒是没有太多了解,也不知道这是不是算正常,但是,不是说win8对内存管理怎么怎么优化神马的嘛。

5. 对于上面基于JS的metro程序,在任务管理器中,右键,go to details,发现,这里的details中,发现到了一个WWAHost.exe的进程,所有的自己写的基于JS的metro程序最后都对应到一个名字为WWAHost.exe的进程上。运行了一下系统自带的metro程序,部分程序并不是对应到WWAHost.exe的,比如IE(对应的还是IE),部分系统自带的会对应到WWAHost.exe上,比如那个天气程序(其可能就是基于JS写的了)。到此,更加大胆的猜测:这个WWAHost.exe才是这些基于JS的metro程序的”虚拟机”,再次让我看到了所谓的基于JS的metro程序是native的应该是不会的了。至于更多,期待有高手去研究,我不是砖家。

最后编辑:
作者:同创卓越
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。