Windows Mobile动手实验集锦

来源:互联网 发布:ipsa 知乎 编辑:程序博客网 时间:2024/05/04 07:27
连续经历了两年的Windows Mobile动手实验,回想起来,被问得最多的一个问题就是:“动手实验的手册哪里能找到?”这是一个无法回答的问题,在TechEd和MEDC之外,的确很难获得动手实验的手册和虚拟机。
其实这些动手实验的资料在MSDN上都能找到,只是平时大家不去注意罢了。今年TechEd也有很多人问我,我回答他们后,很多人依旧迷茫,也许以为我在忽悠他们吧。正好趁这两天有时间,我把能够找到的动手实验手册都写下来,方便大家检索吧。不过丑话说在前边,有些实验环境比较简单的实验,光凭手册和代码就可以了,但是SQL Server与SQL Mobile的数据同步实验,就需要搭建一个比较复杂的环境了。最后提醒的是,这些手册都是英文的,没过CET-4的我做实验的时候用的也是英文手册,大家还怕什么?参加过动手实验的朋友都应该知道这些实验的价值,不多说了。

Windows Mobile

初学起步

Step by Step: Building a .NET Compact Framework Application for a Windows Mobile-based Device Using Visual Studio 2005
http://msdn.microsoft.com/library/en-us/dnppcgen/html/med201_msdn_netcf_app_vs2005.asp
对第一次接触Windows Mobile的开发者来说,这是一个非常好的实验,当然还是需要有一些.NET的WinForm的开发经验的。这个实验里,我们首先需要创建一个基于Smartphone的应用程序,然后添加一个SQL Mobile数据库作为数据源,还需要调用Pocket Outlook的API来完成联系人的查找和邮件的发送,最后还需要调用Web Service来下载本地没有的图片。
推荐指数:★★★★☆
知识点:1,创建Windows Mobile程序
        2,SQL Mobile添加数据源
        3,Pocket Outlook API调用
        4,Web Service的引用

Step by Step: Create a Database Browser Application for Pocket PC in C# by Using Visual Studio .NET 2003
http://msdn.microsoft.com/library/en-us/dnppcgen/html/intro_winmobile_csharp.asp
Step by Step: Create a Database Browser Application for Pocket PC in Visual Basic by Using Visual Studio .NET 2003
http://msdn.microsoft.com/library/en-us/dnppcgen/html/intro_winmobile_vb.asp
这两个实验只是语言不同的两个版本,因为比较简单,所以在国内没有选用。其实主要的目的就是添加一个Web Service的引用,从Web Service获取一个DataSet对象,然后绑定到DataGrid控件中。
推荐指数:★★★☆
知识点:1,Web Service传递DataSet对象
        2,DataGrid绑定DataSet

Step by Step: Build a Mobile Book Catalog with Visual Studio .NET 2003 for Pocket PC
http://msdn.microsoft.com/library/en-us/dnppcgen/html/mobile_book_catalog_vsnet2003.asp
这个实验就复杂得多了,实验目的是创建一个接近真实的图书信息浏览软件。我们首先要创建一个用户界面,然后使用Web Service获取图书信息,然后还需要通过P/Invoke来调用API来控制光标类型(在.NET CF 2.0里就没这么复杂了),最后为了应付Offline的状态,还需要使用XML来对数据进行本地缓存。这个实验并没有在国内使用过。
推荐指数:★★★★☆
知识点:1,建立复杂用户界面
        2,使用Web Service
        3,使用P/Invoke
        4,使用XML

Step by Step: Develop a Location-Based Application on a Pocket PC Phone Edition by Using Microsoft MapPoint Location Server 1.0
http://msdn.microsoft.com/library/en-us/dnppcgen/html/location_apps_mappoint.asp
本实验讲述如何在Pocket PC上使用MapPoint Location Server,因为MapPoint服务在中国并没有,所以我们只能感受一下,这个实验在国内也没有用过。首先需要创建工程、用户界面,将MapPoint的Web Service引用加入到工程中。首先要指定用户名、密码、要查找的区域,这里要选择“NA”(北美)。然后获取联系人的位置,最后表现到地图上。
推荐指数:★★★★☆
知识点:1,MapPoint Web Service的使用
        2,将MapPoint地图表现在程序中

Step by Step: Integrating Real-Time Tracking with MapPoint Location Server
http://msdn.microsoft.com/library/en-us/dnppcgen/html/med203_msdn_mappoint_location_server.asp
推荐指数:★★★★
与上边类似的一个实验,不过加入了实时跟踪的内容
知识点:MapPoint Web Service的使用

开发工具

Step by Step: New Native Windows Mobile Development Features in Visual Studio 2005
http://msdn.microsoft.com/library/en-us/dnppcgen/html/med304_msdn_new_native_wm_features_vs2005.asp
很多朋友都抱怨,动手实验室以.NET CF为主要开发工具,而对C++开发者关心太少了。这个实验就是专门为C++开发者准备的。在VS 2005中首先用ATL开发一个ActiveX控件,然后使用MFC创建一个Host程序,调用这个控件。
推荐指数:★★★★☆
知识点:1,创建ActiveX控件
        2,MFC程序中调用ActiveX控件

Windows Mobile编程

Step by Step: Introduction to the New Native APIs in Windows Mobile 5.0
http://msdn.microsoft.com/library/en-us/dnppcgen/html/med307_msdn_intro_new_wm5_native_api.asp
超级长的一个实验,介绍了所有Windows Mobile 5.0中比较有趣的API,当然这个实验也是以VS 2005的C++为开发环境的。首先使用Pocket Outlook中的API选择联系人;然后使用图片选择对话框和Messaging API,选择图片作为附件,发送电子邮件;接下来通过State and Notifications Broker API获取系统当前状态、系统状态改变时获取通知;最后是调用Camera Capture API,获得照相机的功能。可能唯一没涉及到的就是GPS的API了。
推荐指数:★★★★★
知识点:1,图片选择API的使用
        2,PocketOutlook API获取联系人、发送电子邮件
        3,State and Notifications Broker API
        4,Camera Capture API

Step by Step: Introduction to the New Managed APIs in Windows Mobile 5.0
http://msdn.microsoft.com/library/en-us/dnppcgen/html/med202_msdn_intro_new_wm5_managed_apis.asp
与上一个实验类似,只是环境换到了.NET CF的托管环境中。
推荐指数:★★★★★
知识点:1,图片选择API的使用
        2,.NET CF中拨打电话
        3,PocketOutlook API获取联系人、发送电子邮件
        4,State and Notifications Broker API
        5,Camera Capture API

用户界面

Step by Step: Build a Custom Control for Visual Studio .NET 2003 by Using the .NET Compact Framework on Smartphone
http://msdn.microsoft.com/library/en-us/dnppcgen/html/sp_lab1_build_custom_control.asp
为Smartphone创建一个自定义控件,并为这个控件添加设计期支持。这是一个比较老的动手实验了,曾经在TechEd 2004中国中出现过。现在我们在VS2005中有了更容易的方法。
推荐指数:★★★★
知识点:1,创建自定义控件
        2,添加设计期支持

Step by Step: Develop Orientation-Aware and DPI-Aware Applications for Pocket PC
http://msdn.microsoft.com/library/en-us/dnppcgen/html/orientation_dpi_aware_apps.asp
这也是一个比较老的实验,用于让大家了解针对不同显示方式、不同分辨率的编程。当时只有Pocket PC 2003 SE存在这个问题,现在所有的Pocket PC和Smartphone都需要考虑这些问题了。
推荐指数:★★★★
知识点:1,不同显示方式
        2,不同分辨率

Step by Step: Developing Orientation-Aware and Resolution-Aware Windows Mobile-based Applications in Native Code
http://msdn.microsoft.com/library/en-us/dnppcgen/html/med305_msdn_dev_orientation_res_aware_apps_native.asp
上边实验的升级,不同的是运行在Windows Mobile 5.0平台上
推荐指数:★★★☆
知识点:1,不同显示方式
        2,不同分辨率

Step by Step: Implement Smartphone-Style Scrolling Data Entry Dialogs by Using the .NET Compact Framework on Smartphone
http://msdn.microsoft.com/library/en-us/dnppcgen/html/sp_lab2_implementing_scrolling_dialogs.asp
创建一个Smartphone上的可滚动对话框,这个问题在VS 2005中已经得到了解决,这个实验只是针对VS 2003和.NET CF 1.0的。
推荐指数:★★★☆
知识点:1,Smartphone界面特点
        2,如果滚动对话框

Step by Step: Implement Style List Controls by Using the .NET Compact Framework on Smartphone
http://msdn.microsoft.com/library/en-us/dnppcgen/html/sp_lab3_implementing_list_controls.asp
实现一个自画的ListView用来显示来自Web Service的数据。
推荐指数:★★★☆
知识点:1,添加自画的ListView
        2,Web Service引用

数据操作

Step by Step: Developing a SQL Mobile Application with Visual Studio 2005 and SQL Server 2005
http://msdn.microsoft.com/library/en-us/dnppcgen/html/med302_msdn_sql_mobile.asp
这个实验就是MEDC和TechEd 2006中所用的实验,主要分三个大部分:将SQL Mobile数据库作为数据源添加到工程中,通过拖拽产生用户界面;配置SQL Server的Replication,使SQL Server可以与设备端的SQL Mobile同步;通过Web Service进行数据同步。
推荐指数:★★★★★
知识点:1,添加SQL Mobile作为数据源
        2,使用Replication进行数据同步
        3,使用Web Service进行数据同步

Step by Step: Program Microsoft SQL Server CE 2.0 Merge Replication Using .NET Compact Framework
http://msdn.microsoft.com/library/en-us/dnppcgen/html/sql_serverce_replication_net.asp
这是Merge Replication实验较老的一个版本,使用的是SQL Server CE 2.0和SQL Server 2000,与上边实现大体相似,只是增加了冲突解决的步骤。
推荐指数:★★★★★
知识点:1,配置Merge Replication
        2,配置IIS和SQL Server CE Server Tools
        3,订阅发布,并进行同步
        4,冲突解决

平台迁移

Step by Step: Migrating a Windows Mobile Application from GAPI to DirectX
http://msdn.microsoft.com/library/en-us/dnppcgen/html/med308_msdn_migrating_wm_gapi_app_directx.asp
这其实是一个关于D3D Mobile的实验,具体情况就不多说了。
推荐指数:★★★★☆
知识点:D3D Mobile

Step by Step: Migrating an eMbedded Visual C++ Application to Visual Studio 2005
http://msdn.microsoft.com/library/en-us/dnppcgen/html/med303_msdn_migrate_evc_app_vs2k5.asp
该实验分辨将MFC和Win32程序从EVC中迁移到VS 2005中。
推荐指数:★★★★
知识点:VS 2005对Native C++工程迁移的支持

.NET Compact Framework
Step by Step: Incorporating COM Objects into Your .NET Compact Framework 2.0 Application
http://msdn.microsoft.com/library/en-us/dnnetcomp/html/med301_msdn_com_netcf2.asp
在.NET CF 2.0程序中使用COM组件,包括两部分内容,在VS 2005中使用ATL开发一个COM组件,并在.NET CF 2.0的程序中调用;使用POOM操作Pocket Outlook,最后还使用了Windows Mobile 5.0里的托管API来实现相同功能。值得一提的是,.NET CF 2.0只支持COM组件调用,但并不支持ActiveX控件。
推荐指数:★★★★☆
知识点:1,使用ATL创建COM组件
        2,.NET CF 2.0中调用COM组件
        3,.NET CF 2.0中调用POOM
        4,使用Windows Mobile 5.0托管API

Step by Step: Developing Multithreaded Applications with the .NET Compact Framework 2.0
http://msdn.microsoft.com/library/en-us/dnnetcomp/html/med204_msdn_dev_multithread_apps_netcf2.asp
非常好的一个多线程实验,包括线程创建、线程池、线程同步等,强烈建议大家做一下。
推荐指数:★★★★★
知识点:.NET CF关于多线程的知识


Step by Step: Tips, Tricks, and Techniques for Debugging .NET Compact Framework Applications
http://msdn.microsoft.com/library/en-us/dnnetcomp/html/med306_msdn_debugging_netcf.asp
这是非常新的一个实验,也是唯一一个不针对开发而针对调试的实验,主要内容有三个:设置线程相关断点;调试一个P/Invoke;使用Interop Log来判断平台调用。当然大家会发现这些Debug技术都是针对比较复杂的多线程或平台调用的。
推荐指数:★★★★★
知识点:1,设置线程相关断点
        2,调试一个P/Invoke
        3,使用Interop Log

好了,所有的实验就介绍到这里了,当然还有一些没有公布的实验,我也不知道该去哪里找他们的手册。不过大家也不要以为有了这个实验手册列表,明年就可以不参加动手实验了,要知道Windows Mobile动手实验每年都会进行更新,如果你错过了,可能就要再等一年,期待能在明年的MEDC和TechEd的实验室里见到大家。
还有一点,现在的实验都是美国那边的,中国这边只是做了本地化的工作。我想在这里做个调查,希望大家能给我更多的反馈:
1,如果要做中国自己的实验,大家是不是支持呢?
2,对动手实验的内容,有什么样的期待呢?
3,是偏向对新技术的介绍,还是更加接近实战?
4,您对哪些内容感兴趣,觉得出现在动手实验里会有趣?
希望听到大家的意见,谢谢。

发表于 @ 2006年09月27日 18:20:00 | 评论 (0)

2006年09月25日
 Windows Mobile BLOG 问题集锦 2006-9-25


    摘要:这段时间一直在准备TechEd的课程,今天发现邮箱里的问题已经成堆了,还是总结起来回答一下。    (全文共9880字)——点击此处阅读全文

发表于 @ 2006年09月25日 16:17:00 | 评论 (0)

2006年09月21日
 TechEd庙会记(一)

 

一年一度的微软技术庙会TechEd将于明天在北京九华山庄正式开始,技术庙会的称呼来自于MVP彭彭的MSN口称,不过仔细想想,在中国人的记忆里还有比庙会更热闹的地方吗?不管是想增长功力,还是想以武会友,无论抱着何种目的,大家也都千辛万苦地从计算机里把头抬起来,参与这场技术庙会之中了。

我比各位早到一步,在动手实验室里忙了一阵后,跑到各处拍了些照片。和往日光彩亮丽、准备就绪的会场不同,TechEd前一天的会场仍然是一个忙碌的工地。让大家知道,TechEd光彩的背后也有一群人在默默工作。

TechEd咨询台位于五楼的开放区域。

准备好的课程列表

给自己的课程一个特写,记得哦“使用SQL Server Everywhere开发Windows Mobile最佳移动数据应用”,9221630-1745,第八分会场,打个广告先:)

五层的主题讨论区,大家可以到这里对感兴趣的话题进行讨论,卡通形象还是很可爱的。

来一张全景,好多地方还在布置。

位于三层的日程表,列出的是第一天的课程。

微软硬件的展台,很COOL吧?

主会场,微软的CIO正在进行keynote的彩排

连瓶装水上都有TechEd的标志,不过这些水到第三天就很难找到了。

看看这位帅哥站的地方,位于五层的小吃街,我喜欢。大家记得,小吃街的旁边就是Windows Mobile的动手实验室,欢迎光临。

深夜11点,动手实验室的同志们还在奋战,为了大家能够对Windows Mobile有一个全新的体验,同志们还要继续奋战……

晚上11点的小吃街,雀巢的摊位已经布置好了,小吃街也有人在收拾东西,不过据说时要付钱的。在每个人的手册里有两块钱的代金卷,不过一根烤肠都要三块钱……大家要准备好零钱。

好,明天TechEd会场上见!

 

发表于 @ 2006年09月21日 01:46:00 | 评论 (7)

2006年09月05日
 Device Emulator共享源码初体验(二)

原以为程序编译之后,让Device Emulator正常运行起来是件很容易的事情。可是这件看起来“很容易”的事情却花了一下午的时间。顺便我们也来说一说模拟器的命令行启动方式。
模拟器代码中的“How To Build”文档并没有很详细地说明如果启动编译好的模拟器,只是简单地说模拟器的命令行与Device Emulator 1.0的命令行完全相同。于是我在网上找到这样一篇文章《How can I launch the Smartphone 2002 emulator without eVT?》,连接如下:http://www.smartphonedn.com/qa/emulator_launch.html
在这里特别说明的是,我们在Visual Studio 2005里使用的Device Emulator和在Visual Studio 2003、EVC 4.0和EVT 3.0中使用的模拟器是两个不同的应用程序,前者是将ARM指令JIT编译成x86指令执行,这也是为什么VS 2005的模拟器可以安装一些ARM指令的应用程序的原因,而后者是通过交叉编译的方式,将代码编译成x86指令后运行在模拟器上的。所以说后者更简单一些,而且这两个模拟器在命令行方面还略有差别,这也是造成我最大困扰的原因。
Visual Stuido 2003里的模拟器叫做“PBEmulator”,我们可以在X:/Program Files/Windows CE Tools/wce420/POCKET PC 2003/Emulation的路径下(X表示你安装Pocket PC SDK的盘符),找到一个叫做emul.cmd的批处理,这就是VS 2003和EVC、EVB启动模拟器的方式。
start "" "D:/Program Files/Common Files/Microsoft Shared/Windows CE Tools/Platman/bin/PBEmulator.exe" /MemorySize 64 /Fastbackground /Skin "D:/Program Files/Windows CE Tools/wce420/POCKET PC 2003/Emulation/pocket_pc_emulator_skin.xml" /CEImage "D:/Program Files/Windows CE Tools/wce420/POCKET PC 2003/Emulation/PPC_2003_WWE.bin" /VMName "POCKET PC 2003 - POCKET PC 2003 Emulator" /HostKey 165
这里边我们注意/CEImage和/Skin两个选项,这两个选项分别指定了模拟器需要调用的Image地址和Skin配置文件的地址,其实有了这两个选项,模拟器就可以正常启动了。
可是问题就出在这里,Visual Studio 2005的DeviceEmultor命令行方式并不一样,而帮助文件里又没有很详细地进行说明。如果你直接双击DeviceEmulator.exe(X:/Program Files/Microsoft Device Emulator/1.0),将显示一个对话框,提示命令行参数。最后,我们实验成功的命令行是这样的:
start "" "C:/Program Files/Microsoft Device Emulator/1.0/DeviceEmulator.exe" "D:/Program Files/Microsoft Visual Studio 8/smartdevices/emulators/Images/PocketPC/2003/1033/PPC_2003_SE_WWE_ARMv4.bin" /skin "D:/Program Files/Microsoft Visual Studio 8/smartdevices/Skins/PocketPC_2003/PocketPC_2003/1033/PocketPC_2003_Skin.xml"
我们要使用的是Visual Studio 2005中自带的Pocket PC 2003的ARM指令的bin文件,而不能使用前面SDK中包含的bin文件。而DeviceEmultor命令行中提示的bitfile,大家千万不要在命令行里写bitfile,而是把bin文件的全路径写进去就可以了,我在这里犯了错误。而/skin部分和PBEmulator是一样的,如果大家想查阅DeviceEmultor的命令行参数,可以在DeviceEmultor的Help里找到:“Device Emulator Command Line Reference”
了解了DeviceEmultor命令行参数,启动模拟器就不会很难了。我们在DeviceEmultor工程的命令行参数中,直接指定就可以了。选择“Project”菜单-“Properties”项,在弹出的菜单中选择Configuration Properties的Debuggin,右侧的Command Arguments项,在里边添加下面的命令行。
"D:/Program Files/Microsoft Visual Studio 8/smartdevices/emulators/Images/PocketPC/2003/1033/PPC_2003_SE_WWE_ARMv4.bin" /skin "D:/Program Files/Microsoft Visual Studio 8/smartdevices/Skins/PocketPC_2003/PocketPC_2003/1033/PocketPC_2003_Skin.xml" /memsize 64
 
设置完成后,我们直接选择F5进入Debug模式,运行DeviceEmultor.但是DeviceEmultor会提示Error:System resources exhausted.我是在中文的XP SP2和英文的Visual Studio 2005中编译的,不知道是不是语言环境造成的这样的错误提示。
经过反复的跟踪代码,最后确定是在wininterface.cpp的489行,IOWinController类的LCDThreadProc函数中,加载菜单资源时发生的错误。于是我把493行的    exit(1);代码注释掉。再进行编译运行,模拟器终于运行起来了。
大家可以看到,运行起来的模拟器没有菜单,这个问题我们要稍后解决,但是模拟器的整体运行还是正常的。
在这里不得不感叹两句,以前使用一些Open Source的类库时,光导入到开发环境中就需要各种各样的设置、裁减、编译,好不容易编译通过之后,想正常运行的话,还需要修改N处代码才可以。我们必须承认微软在产品发布方面还是有很好的优良传统的。我按照文档的说明,编译过程没遇到任何意外错误,而运行过程只修改了一处代码,这种情况确实很罕见。这从另外一个侧面也反应了,一个成熟的软件公司在代码管理方面的良好风格。这一点确实值得大家学习。如果你提供给同事或者用户的代码,可以有一份指导文档,能够在一天内通过编译,并且被加入到用户的工程中。如果那样,就等于你做了一件大善事。
 

 

发表于 @ 2006年09月05日 18:45:00 | 评论 (2)

2006年08月31日
 SQL Mobile 2005的Replication和RDA开发入门 FAQ

 SQL Mobile 2005的Replication和RDA开发入门 ---Level 300
活动日期: 2005-12-23 10:00 -- 11:30
主 讲: 马宁 
________________________________________
Q:SQL Mobile 2005的Replication和RDA开发要具备哪些知识和工具?
A:RDA是SQL Mobile的特有技术,不需要什么预备知识;Replication最好具备SQL Server配置管理经验。
________________________________________
Q:IIS用户的权限需要设置为完全控制吗?
A:不需要,能够读写数据库、访问snapshot共享文件夹就可以。
________________________________________
Q:对Mobile感觉挺感兴趣的,但查了蛮多手机开发方面的公司,大多面向硬件方面,且大多JAVA,感觉心里没底,可以给点建议吗?
A:的确,目前的手机开发公司更多集中在游戏行业,而Windows Mobile上的开发大多属于企业级开发,两者要求的技术是不同的。
________________________________________
Q:支持和其他类型的数据库的同步吗?比如Oracle等
A:不支持,可以通过SQL Server的DTS将数据同步到SQL Server数据库中,然后再进行同步;或者通过Oracle的数据同步机制;最后,也可以自己编写数据同步机制。

 

发表于 @ 2006年08月31日 11:49:00 | 评论 (0)

 Windows Mobile 开发黄金周(6):Direct 3D Mobile初体验 FAQ


    摘要: Windows Mobile 开发黄金周(6):Direct 3D Mobile初体验 ---Level 200 活动日期: 2005-10-28 10:00 -- 11:30 主 讲: 马宁     (全文共2048字)——点击此处阅读全文

发表于 @ 2006年08月31日 11:48:00 | 评论 (0)

2006年08月23日
 Shared Source Microsoft Device Emulator初体验


    摘要:微软最近发布了Device Emulator 1.0的源代码,我也乘机下了一个,准备研究一下。首先提醒大家的是,模拟器的源代码是Shared Source,而不是Open Source,大家一定看清楚license,以免将来有不必要的麻烦。    (全文共2764字)——点击此处阅读全文

发表于 @ 2006年08月23日 15:22:00 | 评论 (10)

2006年08月14日
 Blog问题集锦2006-08-14


    摘要:不少朋友在我BLOG上提问,谢谢大家对我的信任,我也希望自己的BLOG能够成为Mobile开发者交流的地方。又过了不短的时间了,可能回复不算及时,没办法,毕竟我也有很多代码要写。如果哪位的问题解决了,能够把原因和解决办法写出来,我在这里不胜感激。另外,我会把自己以前讲过的一些Webcast列出来方便大家的查找。     (全文共9315字)——点击此处阅读全文

发表于 @ 2006年08月14日 18:21:00 | 评论 (10)

2006年07月26日
 技术书也能下酒


    摘要:Head First Design Patterns的一些读后感,这是一本可以下酒的技术书,唯一的缺点是不能用来催眠。    (全文共1755字)——点击此处阅读全文

发表于 @ 2006年07月26日 17:56:00 | 评论 (3)

2006年07月19日
 Windows Mobile FAQ 2006.7.19


    摘要:最近一直在忙着写程序,所以从MEDC后就没好好回答问题,BLOG上已经积攒了不少的问题,干脆在这里集中回答一下,大家也更方便来找。如果回答得有什么不妥,请大家给予指正,谢谢。如果这样效果好的话,我打算以后也这样做,把一段时间的问题汇总在一起。     (全文共6098字)——点击此处阅读全文

发表于 @ 2006年07月19日 13:11:00 | 评论 (4)

2006年06月28日
  Windows Mobile 2nd 开发黄金周(4):Windows Mobile设备编程中的本地存储FAQ


    摘要: Windows Mobile 2nd 开发黄金周(4):Windows Mobile设备编程中的本地存储 ---Level 200 活动日期: 2006-03-27 14:30 -- 16:00 主 讲: 马宁     (全文共1588字)——点击此处阅读全文

发表于 @ 2006年06月28日 13:53:00 | 评论 (14)

2006年06月20日
 MEDC 2006预告

微软MEDC 2006后天就要在长城饭店开始了,从明天下午我就得离开办公室了,不知道在现场能不能上网,我会尽量拍些好玩的照片放上来和大家分享。这次MEDC我有一场关于SqlCeResultSet的Session和四场Hands on Lab,分别是关于SQL Mobile开发和Mobile Composite UI Application Block的。
我的课程是在周五上午的时候,名字是《SQL Server 2005 SqlCeResultSet和高性能数据访问深度探索》,主要内容是关于.NET CF 2.0中新加入的数据访问对象SqlCeResultSet的,还有一部分内容是关于如何提高SQL Mobile数据库访问效率的,其中会谈到Base Table Cursor的概念。
Hands on Lab仍然是以看实验手册做实验的形式为主,比起去年来,增加了一个大概10分钟左右的讲解。讲师主要会把这个实验涉及的技术背景、实验过程和最后的目标讲解一下。因为中国这边的参会者很多都是没有Windows Mobile开发的相关经验的,如果让他们埋头做实验,可能做完了之后还不知道实现的是什么。那样的话,效果就打了折扣。
我负责的Hands on Lab是两个实验:第一个实验是《使用Visual Studio 2005和SQL Server2005开发基于SQL的移动应用》,这个实验的主要内容是让大家了解Visual Studio 2005和SQL Server 2005中如何开发Mobile应用的,分为三个部分:第一个部分是针对本地SQL Mobile数据库进行操作;第二部分是通过Merge Replication与远程SQL Server数据库进行数据同步;第三部分是通过Web Service进行数据同步。可以说,这个实验是很有价值的,唯一的问题是,这个实验时间很长,大概是一个半小时,所以对于实验者来说可以完成一部分。第二个实验是《Mobile Composite UI Application Block介绍》,介绍的是一个比较新的技术:Composite UI Application Block是微软推出的一个基于源代码的应用程序块,实现了一个IOC容器,用于比较复杂的企业级应用,可以将用户界面和商业逻辑以一种松耦合的方式连接。Composite UI Application Block(简称CAB)中的新概念会很多,这是我最担心的问题,我生怕这个实验做下来,大家还是不了解CAB是个什么东西。希望我能够在十分钟的时间里让大家能对CAB有一个初步的印象。
今年HOL请到很多MVP来进行指导,所以今年,每个人的工作都会轻松一些,希望我们将近一个月的准备,能够为大家带来一场精彩的MEDC。
我会收集现场有意思的画面,及时发布到BLOG上的。希望大家看世界杯的同时,别忘了同样精彩的MEDC。

发表于 @ 2006年06月20日 12:54:00 | 评论 (3)

2006年05月22日
 设计.Net Compact Framework CLR(3)

第三章:GC Heap管理
这是《设计.Net Compact Framework CLR》的第三部分。在前面两章中,我们讨论了CLR如何管理内存和JIT编译器的基本设计原则。
Part I, Overview and Background
Part II, Jit Compiler Design Considerations
这一章我们主要讨论垃圾收集设计中如何管理GC heap的问题。
---------
讨论.NET平台如何管理内存,垃圾收集肯定是第一个被提及的话题。不必惊讶,Compact Framework的垃圾收集和桌面版本有很多地方不同,原因是运行环境的不同。就像Compact Framework CLR中的其他大部分子系统一样,垃圾收集被设计成,在设备可用内存较低时,释放所有能够释放的内存。
对更高层次,GC提供了两个基本功能:分配内存保存引用类型的实例,在这些实例不再使用时收集他们。
Allocating Reference Types
通过第一章的讨论,我们知道GC heap存在于进程独有的32M虚拟地址空间中。和JIT堆一样,GC heap开始时很小,随着增长需要更多的空间。然而,比较JIT堆,GC heap的增长有两个重要的不同:GC heap以一个固定的增量增长,另外,它不会增长到很大。
 
GC Heap的增量通常是6K。当一个新的64K“内存段”被创建时,内存分配将从该段中被分配,直到没有足够的空间,然后一个新的“内存段”将被创建。Compact Framework GC使用标准Win32 API VirtualAlloc来分配新的内存段。分配一个内存段是很快的。在.NET Compact Framework 2.0的性能测试显示,每秒可以分配750万个小型引用类型的实例。分配器之所以如此高效,是因为它使用了简单的算法。在GC堆中用一个指针指向下一个有效空间。当分配一个新实例的空间时,分配器简单地将指针移动该对象所需要的字节数就可以了,如图4所示:
 
Figure 4
分配一个新的引用类型只是简单地移动“next object”指针
GC heap默认的增量值是64K,在分配大于64K的对象时,分配器将会以比较大的增量来增加Heap的尺寸。例如,如果一个程序尝试创建一个70K的对象,分配器将创建一个新的70K的内存段来存储这个大对象。
 
Gc Heap会像我们描述得这样一直增加,直到达到1MB。这时一个垃圾回收机制将被启动(更多地回收将在以后出现)。在这以后,GC Heap也许会继续增长,但是从上一次回收后,只要分配了1MB的对象,垃圾回收就会被启动。
Collecting Reference Types
现在我们已经了解GC Heap是如何增长的,让我们来看看它是如何收缩的。此外,在内存压力下减少GC heap尺寸的能力是帮助应用程序更好地运行在内存受限设备上的关键。在这一节中,我们将考虑那些原因会触发一次垃圾回收和内存何时被释放并被返回给操作系统。
 
有一些原因会触发垃圾回收机制。这些原因中的一个就是分配了1MB的托管对象。其他原因包括分配资源失败,例如,无法分配更多的内存,创建更多的Windows句柄等。请查看An Overview of the .Net Compact Framework Garbage Collector中对这些引发收回原因的详细讨论。
当GC发生时,内存不是每次都会被释放并返回给操作系统的。为了理解从操作系统角度来看内存何时被释放,让我们来看一下当垃圾回收运行时到底发生了什么?
Unreferenced Objects
在每次垃圾回收的过程中,GC会检索整个Heap以发现哪些对象不再被引用。这些不再使用对象的内存将被释放回GC Heap,使GC heap有更多可用空间。在释放不再引用的类型后,一些64K的内存段将有可能是完全空着的。如果内存段是完全空的并且GC仍然有1MB以上的分配空间,空的64K内存段将通过调用VirtualFree被归还给操作系统。除了完整GC(原文为”full” GC,将在下面讨论)外,收集器将会保持总数1MB的64K内存段的缓存,即使其中的一些内存段是空的。通过缓存代码段的方式,我们通过减少调用VirtualAlloc和VirtualFree的次数来改善性能。
Compacting the GC Heap
在垃圾回收的过程中,GC将随意地压缩堆。当一个堆充满碎片时,收集器将通过将所有活动对象移动到一起的方式,来“压实”整个堆。压实堆的主要目的是产生大量的有效内存块,以分配更多的对象。图5表现了GC Heap中的内容在压缩前后的状态。
 
Figure 5
The contents of a sample GC heap before and after compaction
通过”简单”对象回收,GC将归还1MB内存段缓存之外的空64K内存段给操作系统。
A "Full" GC
在正常的事态发展下,GC将按照下面描述的方式来工作:在每次分配1MB之后,周期性的垃圾回收将被启动;如果Heap充满碎片,它将被压缩;如果收集器有1MB的缓存,多余的空内存段将被返还给操作系统。
事实上,在这三个设定之外,为了获取更多的可用内存,还会使用哪些更激烈地做法。这些做法和发生的时机密切相关,就像第二章中JIT在这些时候减小它的Heap尺寸:当分配内存或其他资源失败时发生,当一个应用程序被切换到后台时,或者当应用程序接收到操作系统的WM_HIBERNATE消息时。在这些时候,GC将不再保持在1MB的内存段缓存上。(译注:原文为the GC will hot hold onto its 1MB segment cache.严重怀疑是the GC will not hold onto its 1MB segment cache.否则意思不通,故改之)它将回收所有的不在引用的对象,压缩堆,并且释放所有可以释放的内存。
Pulling it All Together
现在我们已经了解了GC如何分配和释放内存,让我们看一下GC heap的尺寸在应用程序的生命周期中的变化。
 
Figure 6
The size of the GC heap over the lifetime of an application.

图6跟踪了两部分的数据,黄色线表示在应用程序的生命周期中,垃圾收集被请求分配的累计byte数。该数将持续增长,不会跳跃,就像应用程序持续分配新对象。
 
图6中的蓝色线表示每个时间GC heap的尺寸。有几个时间点值得注意。首先,当应用程序开始并持续运行时,我们看到GC heap的尺寸的增长和前面所见是一致的。图中的每一步和新创建的64K GC段是一致的。第二,我们可以看到有时蓝色线水平偏离。就像你在前边关于分配和回收算法的讨论中所了解的那样,在1MB的时候heap尺寸变成水平。接下来,你可以看到heap尺寸戏剧性地下降。下降的发生在我将应用程序切换到后台时。在应用程序切换到前台后,我们开始看到heap再次以64K开始增长。
 
这个系列现在覆盖了.Net Compact Framework如何管理内存的基础,和构建JIT编译器和垃圾回收时的设计决定。在我的下一篇中,我们将讨论在内存受限设备中,CLR class loader如何运行得更有效率。
This posting is provided "AS IS" with no warranties, and confers no rights.

Aawolf: Steven老兄最近好象对这个系列文章不感兴趣了,没有再更新。不过他的文章还是很有意思的,不多的文字就解释了一些隐藏在背后的运行机制。期待他的下一篇。

发表于 @ 2006年05月22日 16:57:00 | 评论 (3)

2006年05月16日
 3GSM大会-程序天下事专栏2005年第三期


    摘要:中国人的春节刚过,全世界移动通讯行业的目光就集中在了法国戛纳。这座以电影闻名于世的小城,此刻正在举办全球通讯界的盛会3GSM世界大会。这次盛会不但有各国的移动运营商、设备厂商,而且还有移动软件厂商参与其中。    (全文共1411字)——点击此处阅读全文

发表于 @ 2006年05月16日 13:09:00 | 评论 (0)

 程序天下事专栏2005年第二期


    摘要:记得去年最后一篇程序天下事,我是以“蓄势待来年”作为结尾的。新年刚过,关于移动智能设备的新闻便已经是铺天盖地了。在首次将3G列入工作日程后,信息产业部宣布将在3月进行3G商用测试。如此看来,2005年成为中国的3G元年应该是顺理成章的。    (全文共1199字)——点击此处阅读全文

发表于 @ 2006年05月16日 13:07:00 | 评论 (0)

 程序天下事专栏2005年第一期


    摘要:伴随着第一股寒流的到来,曾经充斥着各种移动设备新闻的秋天也悄然落幕了。各大移动厂商已经开始盘算明年开春在中国移动市场这片土地上撒什么种子了。可这个冬天注定不会平淡,一种叫做“skulls(骷髅)”的手机病毒引起了所有主流媒体的关注。手机病毒的出现无疑是给了主推智能手机的厂商当头一棒,统一开发的手机操作系统不但能够带来PC上丰富的应用,还能带来PC上的瘟疫。    (全文共1306字)——点击此处阅读全文

发表于 @ 2006年05月16日 13:05:00 | 评论 (0)

2006年05月15日
 Windows Mobile机器人和SPOT

这是关于两个机器人的故事。记得小时候《变形金刚》在热播的时候,我就幻想着什么时候能够制造一个属于自己的机器人;后来大学学的是计算机,知道了机器人是一个专门的学科;再后来离电子远了,离自己的梦也远了。

今天在浏览Windows Mobile Team Blog的时候忽然看到了一个有趣的Robot:WiMo。(http://blogs.msdn.com/windowsmobile/archive/2006/05/13/596684.aspx)。看到WiMo的第一个感觉就是想笑,这也叫机器人?可是再一想,人家用现成的Smartphone作为控制系统,没有自己开发什么复杂的硬件设备,就实现了一个机器人。这叫什么?这就叫“软件就是力量”。想想也是,自己开发一个机器人硬件的成本,能跟量产的Smartphone比吗?再说对于咱们这些缺乏电子工程背景的软件工程师来说,如何利用现有硬件把软件的力量发挥到极致,这才是正路。
WiMo的控制系统也非常COOL,竟然是Pocket PC,通过蓝牙来控制WiMo。软件开发方面也充分利用了现有的类库,绝大部分的代码都是用C#来实现的。为了使用DirectShow采集照片,作者写了个Native层,但是最后还是通过C#来调用的。
看到这里我不得不佩服美国版的小米加步枪。这绝对没法和正规开发的机器人相比。但是WiMo带给大家最大的震撼就是,在软件工业化的今天,我们仍然能够看到略带些个人英雄主义的奇思妙想。也许我们也应该在每天烦琐的工作之余,抬起头,在抱怨老板没给你20%的自由时间前,先想一想自己年少时的梦。也许一个看似不可能完成的任务,用很简单的办法就可以达到。WiMo真的震撼了我。
这位老兄还说他会将制作WiMo的方法发布到网上,即使没有电子工程背景的人也可以看得懂。看懂是一回事,复制又是另一回事了,在那张光盘底下还是隐藏着一些线路板的。Robot最困难的地方是传动机制,不知道这位老兄是如何控制的。让我们静心等待吧。

另一则关于机器人的消息来自MEDC。Mike Hall主持了一场SumoRobot的比赛,SumoRobot使用了.NET MicroFramework。就像JAVA有Smart Card JVM一样(是叫这名字吧?),MicroFramework是针对嵌入式设备来运行的.NET CLR,比.NET Compact Framework更小。这次的SumoRobot应该是MicroFramework的第二个作品,第一个应该是Smart Watch。那时候.NET MicroFramework还叫SPOT,其中的.NET CLR部分叫做TinyCLR。SPOT甚至不是运行在一个操作系统之上,它只是包括bootloader、HAL和CLR三部分,200-400K,只支持100个左右的API,可以说是超轻量级选手了。
但是SPOT对于嵌入式平台来说却是正合适,虽然目前SPOT还只支持C#,但是拥有Visual Studio 2005这样的IDE,对于嵌入式开发者来说,却是梦寐以求的东西。SPOT的目标平台是ARM7或不带MMU的ARM9。如果我们设想一下,我们可以在定制的嵌入式平台上移植SPOT,然后使用C#来编写应用程序。应用程序只需要很少的修改就可以应用于不同的平台之上。这种诱惑实在是太大了。
只是目前我们还不了解SPOT的授权情况,一切只能停留在假设的阶段。但是目前看来,SPOT是一项十分有前途的技术,包括在机器人方面的应用。
下面是一些关于SPOT的连接,大部分和Chris Tacke有关,看来这位老兄对SPOT相当有研究。
MEDC 2006关于SumoRobot的实验:
http://blog.opennetcf.org/ctacke/PermaLink,guid,cf3e3fef-a282-4845-b347-519fe31a45a9.aspx
OpenNETCF上关于SPOT的话题:
http://blog.opennetcf.org/ctacke/CategoryView,category,SPOT.aspx
关于TinyCLR的文章:
http://dotnet.sys-con.com/read/84123.htm
其他连接:
http://www.danielmoth.com/Blog/2006/05/net-micro-framework.html
http://www.windowsfordevices.com/articles/AT6914689493.html

发表于 @ 2006年05月15日 18:58:00 | 评论 (2)

2006年04月14日
 Windows Mobile开发简明目录(2006.04)


    摘要:太久没写Blog了,以致每个见到我的人总会在“我看过你的Blog”之后加一句“最近好象不怎么更新”了。有的时候总觉得时间不是自己的,是公司的,是朋友的,是所有知道我名字的人的……今天终于找到点空,换换脑子,继续写我的简明目录。    (全文共1565字)——点击此处阅读全文

发表于 @ 2006年04月14日 18:15:00 | 评论 (43)

2006年02月10日
 我的BCB情缘


    摘要:今天在CSDN上看到Borland放弃IDE产品线的新闻后,忽然觉得失去了什么。Borland C++ Builder,一个曾经如此熟悉的名字,就这样消失了。以后,也许还会有C++ Builder,但不会再有BCB了。    (全文共5298字)——点击此处阅读全文

发表于 @ 2006年02月10日 13:48:00 | 评论 (7)

2005年12月30日
 组件化思考


    摘要:今天翻看OpenNETCF的Blog,OpenNETCF年末总会评选出一年中最好的文章,尽管“The Best of 2005”有所减少。但是OpenNETCF.Rss占据了很重要的位置,谁叫Blog今年这么火呢。因为这两天也在琢磨着类似的题目,所以留心看了看,看完OpenNETCF.RSS的类图还是吃了一惊,从异步到同步,不同网络协议的支持,不同RSS协议都得到很好的支持。尽管作者参考了其他人的设计,但是如此考虑完善的类库,让我觉得“人比人也得扔”。紧接着,看同一位作者(Alex Yakhnin)写的RSS阅读器,一句话让我很有感触:“The best way to test functionality and usability of a library is to use it for development for some real project.” 于是,我一下子明白了大家的差距为什么这么大。写软件如同盖房子,这是个不新鲜的比喻了。除了设计图纸、土木工作外,建材也很重要。中国农民盖房子,会买砖、瓦、木头,这些基本的材料,然后木工、瓦工一起上,把木头变成门窗、房梁    (全文共8142字)——点击此处阅读全文
 
原创粉丝点击