Win8探索学习笔记
目录
传言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程序如何"安装"到"开始界面“中
说明:这里说的程序是desktop的。
简单来说,对于一个exe文件,通过创建其快捷方式(假设为hello.exe - shortcut),将快捷方式放到:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs
中,或者在这里创建一个文件夹,放到文件夹中也是可以的。然后,到win8的start界面中,查找这个程序的名字hello.exe,就会出现了,用右键选中这个程序,就可以将其pin到start界面中。
问题一:一个程序pin到start界面,这些pin的信息保存在哪里的?
只要在C:\ProgramData\Microsoft\Windows\Start Menu\Programs,那么在start界面搜索都是可以出现的,那么这个比较容易理解了,搜索会自动去这个目录下遍历。那么哪些程序被pin了,这些信息保存在哪?相信肯定是某个注册表项的吧,具体就不去找了。
问题二:所有能在start界面搜索到的程序(的快捷方式)都是在上面这个目录下保存的吗?
事实上,C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs目录下也是可以保存的。至于还有没有其它目录也可以被start界面搜索到,那就不清楚了。
总结:传统的desktop程序在win8下都是没有问题的,win32的API那些东西都还是支持的,什么MFC都是可以用的,弄个快捷方式到metro风格的start界面上也是可以的,只是运行还是会自动切换到desktop模式下。下面的内容开始探索metro程序到底是怎么”运行“的。到底是二进制本地运行还是在.net虚拟机上运行,还是在一个所谓的native实际上还是“虚拟机”的解释环境下执行,慢慢来吧。
(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支持的工程选项
(3) 使用JS实现的hello, metro
实现hello, metro很简单了,用VS 11新建一个最简单的JavaScript工程,默认的工程模板如下:
简单分析一下,这里有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的应该是不会的了。至于更多,期待有高手去研究,我不是砖家。
(4) 分析基于JS的metro程序
上面已经大概试了一下基于JS的metro程序。下面继续分析。
1. 工程的projects->properties
看看JS Metro工程的projects->properties,看看有没有什么配置选项,发现,几乎什么也没有,再次看到它和web的相同之处了,所以继续大胆猜测,对于JS Metro程序,其没有所谓的”编译、链接“的概念,就是一个”打包“的过程吧,然后原封不动的丢给一个"runtime”(我喜欢也称之为“虚拟机”)去执行,就像HTML/JS/CSS运行于IE这个"runtime/虚拟机"一样,所以说,哪里来的native!
2. VS 11对于JS Metro程序的错误机制
为了再次看看VS 11对于html/js的处理,看看它能不能检查”错误"。随便在html里面弄点乱七八糟的,或者弄点“错误”的JS,比如<script>test()</script>,用VS build一下,都是不会有错误的,说明VS 11没有“静态”查错的能力,用debug运行,是可以查到这些错误的。类似于Chrome的开发者工具的功能了,可见,其实基于JS的metro就是把html给runtime去解析的,类似于web在浏览器中运行一样,所以,自然效率上,你懂的。
PS:之所以我一直在分析JS Metro到底会不会native的跑,并不是说这个用runtime去跑html是不行的,而是想看看MS到底有没有新的东西,弄一个runtime去跑HTML,早已经不是新东西了,那些基于webkit的Mobile上的”客户端“程序都是这么个原理,真心想看到有没有办法把JS真的”编译“为native去跑,当然,这样可能或许真的很难。
3. Build和Deploy
既然没有“编译、链接”这些,那就看看Build菜单下有什么吧:Build和Deploy。
我想,build应该就是打包的过程,deploy就是部署了。PS:实在不得不让我想起了android工程,要说更类似的,让我想起了WAC程序,打包一下,部署一下,丢给runtime去跑HTML/JS/CSS,这样的东西在HTML5被“炒作”的今天,实在太多了!既然这样,那就来看看VS是如何打包和部署的吧。
先看看用Build能得到一些什么:
在工程目录下,有一个bld文件夹和Debug文件夹。删除之后build还是会生成的。至于bld里面的内容,暂且不去细细研究了,用记事本打开看看,估计就是一些中间文件了(工程的manifest配置中,有一个配置Package Name的,是一串ba6a209b-2b36-4a5e-a4d8-c122dce439e0这样的玩意,在bld里面的子文件夹的名字就是这个package name)。然后就是debug文件夹,里面生成的是一个xml、一个appxrecipe(也是xml)、一个prj文件,两个xml都是一些配置信息吧。VS Build之后就是得到这些文件。
那么Deploy呢:
Build之后Deploy会生成什么呢?试试就知道了,先在Start界面上卸载掉这个程序,然后build后发现start界面上不会有这个程序,Deploy之后,程序就会出现在start界面上了。那么VS到底是部署了些什么内容呢(部署后,删除VS工程肯定也是可以运行程序的)?
经过查找,VS中Deploy的Metro程序都到了C:\Users\<user name>\AppxLayouts中,其中以程序的package name为文件夹组织的。其中部署的一些文件,里面就有工程的default.html,这样,居然部署之后还可以看到程序源代码,可见其很可能就是打个包,然后丢给“隐藏的IE“("runtime")去解析运行了。那么,这些文件是不是都是运行必须的呢?试着删除一下,发现只有resource.prj文件是无法删除的(只有去start界面uninstall后才可以删除),删除其余所有文件后,程序还是可以正常运行的,可见resource.prj里面就包含了所有运行需要的内容了(html/js/css/images等),至于这些其余的被删除的文件有什么用,可能有些跟管理程序升级什么的有关吧。
说明:这个部署后的程序出现在start界面上,这个start界面上的信息是在哪里保存的,或者说它怎么知道如何来启动这个resource.prj文件,相信在某一个角落(应该是注册表)中保存有这些信息,比如弄一个地方保存start界面上的所有应用程序的列表,对于每一个程序,有一个属性,对于JS Metro程序,弄一个属性叫"JS Metro"和一个属性指定程序对应的文件的位置,然后启动的时候根据这个就知道该如何启动了,是启动desktop的程序(desktop程序也可以出现在start界面上,参考前一篇),还是启动JS Metro,或是启动其它类型的,总之,一切都是猜测,具体,这个信息在哪里,暂时没有兴趣去找了。)
4. 关于程序的打包Package
这次打包才是真的打包了,到这里,一个自然的问题是,上面的程序可以build和deploy。那么如果要把程序给别人,到别人的电脑上去运行呢?
MS引进了store的模式,具体这个store貌似还没有建立起来,在VS的store菜单下,有一些内容,比如打包程序(Create App Package),其它的就是一些需要store帐号的东西吧,还有什么上传到store什么的。这里就说说打包了。用Create App Pakage之后,在工程下会生成一个Packages文件夹。主要的文件就是:一个bat文件,一个安装脚本;一个appx文件,可以理解为打包的文件了;一个cer文件,可能跟认证什么的有关。只需要运行一个bat文件,就可以在自己的电脑上安装了。(PS:我选择的是只在本地机器使用,所以肯定是没有问题的,至于能不能弄到别的机器上去运行,或者说会不会必须通过MS store上传下载,就不清楚了,总之,这模式应该跟app store很类似了)。通过这样的方式,安装之后就可以在start界面上看到程序了,但是这个程序总该有一些”安装文件“吧,本以为也会在Deploy的AppxLayouts文件夹下,事实上,不在。那在哪里呢。。。。实在不想去找了,MS就知道跟我们玩神秘,偶然发现,那个C:\ProgramData\Microsoft\Windows的目录下的AppRepository文件夹的更新时间就是我install和uninstall的时间,也就是说,很可能就是保存在这里面的。MS又跟我玩神秘,这个文件夹居然打不开,当然,肯定是权限问题,不过这个也不知道弄了个神马权限,反正我打不开。
总结:由于我不是砖家,上面的内容可能有点罗嗦,也很简单,因为我也是一下午在这里坐着,想到了什么就先试试,然后马上记录一下内心所想,多么希望能看到MS一点创新的东西,但是实在没有看到,除了界面上弄了一个Metro Style,本质上是没有创新的,包括其store的模式。当然,这里只是一个基于JS的Metro的程序,基于其它的语言的Metro程序某些地方肯定是和上面的类似的,但是某些可能会不一样。(比如,上面的html/css/js我觉得应该是运行在IE的内核的一个runtime上,就像很多Mobile上的html运行在webkit的runtime上一样,但是基于c++的可能是可以得到一个exe可执行文件,然后native执行的,具体暂时不清楚了)。至于程序怎么写,WinJS怎么用,这些就不该是大问题了,web该怎么弄还是怎么弄。最后,metro界面还是不错的,就是希望真正的win8出来的时候,不要把desktop界面和metro界面杂交,metro用在PC上是在不必要,也很丑陋。
本来打算像上一篇一样看看基于C++的Metro程序都有些什么内容的,据说Metro支持Native c++,结果。。。尼玛,昨天新建一个C++ Metro工程都可以跑的,今天就见鬼了,随便建一个C++工程自己都编译不过去,尼玛VS11的bug也太多了。看了看默认生成的C++代码,里面什么partial ref的,应该都是托管C++才有的关键字吧?(PS:不熟悉托管C++,所以不太清楚如何知道一段代码属于托管C++)怀疑:MS的C++ Metro也是使用托管C++构建那个UI。所谓的Metro支持Native C++,应该是说可以使用Native C++构建一些模块,给其它的Metro程序(JS/Managed C++/C#/VB)去调用而已吧。这个里面,对于MS来说,根本不算新东西吧。不知道那个WinRT到底体现在哪里,到底是Native C++实现的还是托管的玩意。
总结:从目前了解的情况,实在没有看到win8的新内容到底在哪里,除了那个Metro Style的UI是一个创建,程序的本质上,貌似没看到实质性的创新,无非就是:1. 借用了一些现有的“流行”的模式/实现,比如HTML/JS的支持,比如store的模式。2. 换了一些接口定义,弄了一些“忽悠”人的各种技术词汇。当然,这只是针对C++的角度来看的,对于.NET来说,或许有很多新的东西,比如可以更好的调用Native C++什么的,具体我就不清楚了,不熟悉.NET!慢慢来吧,有了新的发现再继续研究,至少,就目前的Preview来看,没有更多兴趣去研究了。:(
不过,从另外来说,其实MS这样也是没有错误的,毕竟那个Metro风格,用在PC上还是不适合的,win8可能主要考虑的新的东西都在触摸设备(平板)上的,所以,自然,对于这些应用,程序的效率也是不重要的,用托管的玩意、JS这些去整一些界面神马的就够了,可能我对MS的要求高了点!
说明:这里的描述都是个人看法,很可能错了,毕竟主流的声音都是说winRT是一个API结合,不是一个运行时,都说基于C++的是Native的,待研究啊。。。
参考文档:
http://bbs.pediy.com/archive/index.php?t-140353.html
http://www.codeproject.com/KB/cpp/WinRTVisualCppIntro.aspx
http://kb.cnblogs.com/page/116862/
http://webservices.ctocio.com.cn/138/12201138.shtml
http://topic.csdn.net/u/20110915/08/e4b7e628-a412-49d4-a8c8-0d4002d94635.html
http://tirania.org/blog/archive/2011/Sep-15.html
http://msdn.microsoft.com/en-us/library/windows/apps/hh454062(v=VS.110).aspx(MSDN,WinRT文档)
补充:
上面是曾经的一点想法,现在看来,WinRT是基于COM的,使用C++的Metro程序理论上是可能完全Native的。
这里要补充的一点是,上面提到了用VS11建立一个C++工程突然不灵了,自己都编译不过去,现在居然被我自己给找到解决方法了,确实应该是VS11的bug。其编译错误消息是:
Error : Manifest references file 'hellometro_withcpp.exe' which is not part of the payload.
找了很久没找到解决方法,类似的文章找到了"http://social.msdn.microsoft.com/Forums/zh-SG/winappswithhtml5/thread/88842e72-a620-4ee7-9a6a-d0ba52a36240",但是这个文章很容易理解,但是我这里的错误是exe的问题,尼玛exe不是VS自己生成的。经过仔细分析,发现exe是生成了,打开manifest文件看看,发现里面的文件名居然被VS偷换了,我的工程命名是hellometro_withCPP,所以得到的exe是hellometro_withCPP.exe,但是那个VS自己生成的manifest居然是小写的!手动修改namifest就可以build通过了。所以:如果你使用C++的metro工程,工程名不要使用大写字母就不会遇到这个问题了!
WinRT(desktop)之Hello, World
关于WinRT的MSDN参考:http://msdn.microsoft.com/en-us/library/windows/apps/hh454062(v=VS.110).aspx
先声明,这里的Hello,World程序不是Metro Style的WinRT,在Metro中使用WinRT的程序可以找到很多相关的资料了(当然,网上很多文章不适合入门,都弄得太复杂)。个人还是喜欢从简单开始,所以从Desktop程序来开始了解WinRT不是更好?
(1) 神马是WinRT?
关于什么是WinRT,去网上搜吧,很多人在讨论(当然,这玩意目前大多数都停留在讨论阶段,毕竟还是preview)。
大概来说,WinRT是win8提供的新的API集合,不同于传统的win32在于,WinRT以OO的方式提供API,而且WinRT支持Desktop程序,也支持Metro程序(当然,两者支持不是完全一样)。另外,WinRT编译后也可以得到winmd文件,winmd是win8里面的一个很重要的东西,类似于com、.net这样的吧,winmd可以在不同的语言(C#、C++、VB、JS)之间交叉调用(当然,是Metro程序了),个人理解winmd类似于接口定义或者接口导出的文件吧,具体慢慢研究就能理解了。
(2) WinRT for desktop app
简单来说,对于桌面程序,WinRT更多的可以理解为一个语法扩展了,里面有一些新的类,一些语法的扩展等。
(3) WinRT编译和链接
http://msdn.microsoft.com/en-us/library/windows/apps/hh441567(v=VS.110).aspx
编译选项:
/ZW enable WinRT language extensions
/AI<dir> add to assembly search path
<dir> is the folder where the compiler searches the winmd files
/FU<file> forced using assembly/module
force the inclusion of the specified winmd file
/D "WINAPI_FAMILY=2"
set this define to compile against the ModernSDK subset of Win32
链接选项:
/APPCONTAINER[:NO]
marks the executable as runnable in the appcontainer (only)
/WINMD[:{NO|ONLY}]
emits a winmd; if “ONLY” is specified, does not emit the executable, but just the winmd
/WINMDFILE:filename
name of the winmd file to emit
/WINMDDELAYSIGN[:NO]
/WINMDKEYCONTAINER:name
/WINMDKEYFILE:filename
used to sign the winmd file
选项就不一一介绍了,说得很清楚了,关键还是来试试。
(4) Hello, World with WinRT
如下:
// File: hello_winRT.cpp
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <string>
using namespace Platform;
int main()
{
String^ str1="a test";
std::wstring wstr(str1->Data());
std::wstring wstr1(str1->Data(), str1->Length());
std::wcout<< wstr << std::endl;
std::wcout<< wstr1 << std::endl;
// printf("%s\n",wstr.c_str());
// printf("%s\n",wstr1.c_str());
system("pause");
return 0;
}
// Compile with:
// set_vs_vars.bat
// cl hello_winRT.cpp /ZW /AI%winmd% /EHsc /MD
// Result:
// hello_winRT.cpp(24) : warning C4447: 'main' signature found without threading model. Consider using 'int main(array<Platform::String^>^ args)'.
说明:在命令行下运行这里的命令编译就可以了,为了简化书写,我先用了一个简单的bat设置了一下环境变量,如下:
@echo OFF
rem ## file: set_vs_vars.bat
set winmd="C:\Program Files (x86)\Windows Kits\8.0\Windows Metadata"
echo winmd:
echo %winmd%
rem ##set env of vs
echo setting vs environment...
call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\vsvars32.bat";
echo done
这个,你懂的。
说明一下上面的CPP的内容:
这里使用的是WinRT的String,using namespace Platform; 是必须的,WinRT的命令空间吧,String^是WinRT的类型吧,其它就没什么了。关于编译选项,/ZW和/AI是必须的,指定使用WinRT和搜索winmd文件的路径(WinRT定义在winmd文件中),/MD也是必须的,不知道为何/MT编译会出错,神马重定义了,这个没去研究,有兴趣的可以去看看。/EHsc不是必须的,不使用会有一个警告,这个选项是设置是否使用VS的异常了。另外,使用上面的选项编译后,还是有一个警告,说main的签名不对,还给出了建议,结果,我改成它的建议之后,就说没有入口点,尼玛玩我啊!没有具体去研究这个“入口”的问题,参考下面的文章,有这么使用main的,不过都是用vs编译的吧,没试过:
http://msdn.microsoft.com/en-us/library/br229585
http://code.msdn.microsoft.com/DWriteHelloWorld-760793d2/sourcecode?
PS:关于winmd文件,有时间再去研究,这里有一篇文章http://www.cnblogs.com/waninlezu/articles/win8MetaData.html,貌似可以用ILSpy打开winmd文件。上面的hello, world编译后会生成一个winmd文件和一个exe文件,后面再研究这个吧。
参考:http://msdn.microsoft.com/en-us/library/windows/apps/hh454076(v=VS.110).aspx
(1)WinRT对象和引用计数
WinRT是一个OO的库,所以都是以对象的形式操作。在WinRT中,使用引用计数管理对象,关键字ref new新建一个对象,返回的是对象的指针,但是在WinRT中,使用^符号替代*,仍然使用->操作符使用对象的成员方法。另外,由于使用引用计数,不需要使用delete去释放,对象会在最后一个引用失效的时候自动被释放。
说明:WinRT内部是使用COM实现的,对于引用计数,在底层,WinRT对象是一个使用智能指针管理的COM对象。
Platform::String^ str1 = "str1";
Platform::String^ str2 = str1;
Platform::String^ str3 = ref new Platform::String(L"str3");
注意:这里的str1,是对象的“指针”,和std::string的使用不一样。
(2)WinRT中的数字类型
bool b = true;
char c8 = 'A';
char16 c16 = L'A'; // same as wchar_t
int8 i8 = 0x12; // same as char
int16 i16 = 0x1234; // same as short
int32 i32 = 0x12345678; // same as int, long
int64 i64 = 0x1234567890abcdef; // same as long long, __int64
int8 ui8 = 0x12; // same as unsigned char
int16 ui16 = 0x1234; // same as unsigned short
int32 ui32 = 0x12345678; // same as unsigned int, unsigned long
int64 ui64 = 0x1234567890abcdef; // same as unsigned long long, __uint64
float32 f32 = 12.34E-23; // same as float
float64 f64 = 1234.56E-234; // same as double, long double
C++的数字类型会被自动转换为WinRT对应的类型,比如从一个标准的C++函数返回一个数字值,赋值给winRT类型。
说明:这些类型都定义在Platform命名空间中。
(3)ref class实现自定义类
用ref class标记一个自定义类,就可以使用winRT的对象的方式使用这个类了。当然,在类中,是可以混合使用标准C++的一些类型的。
(4)Value struct结构体
如果一个类只包含数据成员,那么就可以使用value struct定义:
value struct Coordinates
{
float64 Latitude;
float64 Longitude;
};
value struct City
{
Platform::String^ Name;
int64 Population;
int Altitude;
Coordinates Coordinates;
};
(5)WinRT中的property
在WinRT中,使用property关键字声明共有数据成员,而且,还可以为property设置访问它的时候get()、set()的逻辑。
ref class Prescription
{
private:
Platform::String doctor_;
int quantity_;
public:
property Platform::String Name;
property Platform::String Doctor
{
Platform::String get() { return doctor_; }
}
property int Quantity
{
int get() { return quantity_; }
void set(int value)
{
if (value <= 0) { throw ref new Platform::InvalidArgumentException(); }
quantity_ = value;
}
}
}
(6)WinRT定义接口
WinRT也能实现类似于标准C++的接口功能,当然,标准C++本身并没有提供接口这一概念(很多新的语言如C#、Java都有提供),但是标准C++使用纯虚类是可以实现这一功能的。WinRT使用interface关键字来定义一个类为接口类(只需要声明方法,而不需要实现的类),然后就可以被其它的ref class去继承和实现接口了。
(7)WinRT委托、事件、partial类等
WinRT还有一些其他的语法扩展,委托、事件等,发现这些扩展都跟C#一样了,所以不继续废话了。直接看参考链接吧。
PS:以为会有一些特别的地方,发现都是C#的旧东西了。