由于真实的设备数量有限,使用模拟器来开发是个不错的选择。但在实际的开发过程中,会遇到很多意想不到的问题。下面我就针对我近一段时间到的问题,做一个简要的小结,留待以后需要时回顾,也供需要的朋友参考。
我的开发环境是:Windows 7旗舰版(简体中文)、Visual Studio 2008专业版(简体中文)SP1。
我先后安装了以下三个东西:
1、 Windows Mobile设备中心(http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyId=46F72DF1-E46A-4A5F-A791-09F07AAA1914&displaylang=zh-cn)。
2、 Windows Mobile 6 Professional SDK.msi
3、 Windows Mobile 6 Professional Images (CHS).msi
备注:对于Windows Mobile设备中心,就是以前的ActiveSync,是针对Vista和Win7操作系统的。
我在开发过程中主要遇到以下三大问题:
1) 模拟器与PC连接问题(利用Windows Mobile设备中心)。
2) 模拟器内存空间太小。
3) 模拟器上的客户端程序通过Socket与 PC上的服务器端的连接遭遇强进关闭。
下面来我一一回顾一下我的解决方法:
1) 模拟器与PC连接问题(利用Windows Mobile设备中心)。
这个连接问题,08年的时候,就记我抓狂过。那段时间曾经历过短暂的SmartPhone的开发。那时是的环境主要是Windows Server 2003 + ActiveSync + VS2005 + Windows Mobile 5.0 SDK等。模拟器与PC的连接,十次有八次失败,真实的设备连接PC倒算正常。由于当时主要工作是负责服务器端的开发,客户端的问题也就没有深入研究下去。
今年,又开始接触到Windows Mobile的开发了,开发环境与设备的平台稍有变化,Win7 + VS2008 + Windows Mobile 6, 真实的机器叫做“啥物理网移动计算机”,好像就是一个PDA+Phone的设备,网上有提到过掌上电脑型手机,不知道是不是这个东西。WinCE, Smart Phone, Pocket PC,Windows Mobile,这些概念挺复杂的,建议去网上搜索一下文章。
言归正转,曾经遇到的连接不稳定的问题,这一次依然出现了。疯狂的在互联网搜索,发现有不少人也遇到了,试了许多方法,都不成功。
正常的连接步骤,其它挺简单的:打开Windows Mobile设备中心,选择连接设备的端口为DMA -> 打开设备仿真器管理器 ->右键所需的模拟器,选择连接(这时会弹出一个模拟器画面) -> (等模拟器中的系统启动完毕后)再在设备仿真器管理器中右击刚才选择的模拟器,选择插入底座(模拟真实设备通过USB连接PC的行为)。——经过这几个步骤,正常情况下,模拟器就会与PC成功连接,进行进行数据同步等。
但是,上面的正常的情况,我十次尝试,估计只会有两次是成功连接的。
死活连接不上的过程,暂且略过。
我的解决办法:
上面步骤,只需要调整其中的一个就行,那就是——打开设备仿真器管理器。我之前总是先打开Visual Studio 2005/2008,然后再通过菜单“工具->设备仿真器管理器”打开的。后来,我找到了这个设备仿真器管理器的可执行文件,它位置就在“C:\Program Files\Microsoft Device Emulator\1.0\ dvcemumanager.exe”,通过这个位置打开“设备仿真器管理器”,其它的步骤不变,就可以提供正常连接PC的机率(反正我现在是100%连接成功)。不知道以后会不会再遇到不能连接的问题。暂且就先这样了,再遇到问题再说吧。
2) 模拟器内存空间太小。
由模拟器默认的存储空间有限(30MB左右),而我的程序(客户端主程序文件+.Net Compact Framework3.5)正好超过了这个限制。
令人抓狂的是,如果我手动在模拟器上分别安装.Net Compact Framework3.5 和我的程序的安装文件cab时,安装失败,也不提示一下失败的原因。
利用Visual Studio 调试或部署的时候,才从输出窗口中得到提示:模拟器的空间不足。
从这位朋友的博客上得到的扩展模拟器存储空间的办法:http://www.cnblogs.com/dearsj001/archive/2009/08/15/ExtandWMMemory.html。
我使用的是其中的方法:2.2 利用Storage Card进行扩展的方法
具体方法如下,选择模拟器的File->Configure->General->Shared folder,并选择本地PC的一个文件夹,映射为模拟器的Storage Card。
在使用VS进行部署和调试的时候,需要使用到方法:2.3 改变程序调试目录进行扩展
我们建立的Windows Mobile项目,默认的程序调试路径为My Device->Program Files,但是有的时候,我们调试的应用程序可能会占用很大的空间,如果超过了Storage的限制(32M),那么肯定就无法进行调试。既然Storage的大小为32M,已经hard code了,那么我们有没有办法来改变程序调试的路径,使其也映射到本地PC文件夹呢?答案是肯定的。具体方法如下:点击”Project Properties”,(注意不是Solution Properties),改变Device中的Output File Folder,例如改为“\storage card\***”,这样,当你Debug程序的时候,就会下载到Storage Card当中去了,而Storage Card又已经通过方法2.2映射到本地PC的文件中去了。因此,我们就不用受32M Storage空间的限制了。
以上两段内容,摘自施炯的文章,非常感谢他的无私分享。
3) 模拟器上的客户端程序通过Socket与 PC上的服务器端的连接遭遇强进关闭。
当模拟器可以与PC连接了,模拟器上网也是很顺理成章的事了,我还在PC上建了一个Web站点测试了一下,模拟器上的IE是可以正常访问PC上的Web站点的。
模拟器上的存储空间也扩展了,很大,几个G呢!
我的客户端程序也在模拟器上成功部署和安装了,运行起来,都挺正常的。
但又出现了另一个问题。我的客户端需要通过Socket连接PC端上的一个服务,IP是192.168.0.138,端口是8080。客户端和服务端两个程序首先是没有问题的,因为使用真实的设备跑过,一切正常。但使用模拟器时,却不成功,经调试,发生是Socket连接时,发生异常:现有连接被远程主机强行关闭。
这个异常信息,似乎以前遇到过。但一时想不起来,后来才想起来,我曾经在调用Web Service时,遇到过,好像是Web Service的地址写错了。我在想是不是因为我的客户端向一个未提供服务的端口发出请求,被拒绝了。应该是这样,专业的描述,我不会描述。这时我想起了,我曾在yalin_M 的BLOG:(技术QA:如何设置 Windows Mobile 6.0 模拟器上网?http://yalin.blog.51cto.com/262153/59962/)上了解到有两种方法可以实现Windows Mobile模拟器上网。第一种是通过 Windows Mobile 设备中心,也就是先前的 ActiveSync,连接到 Internet 上;第二种是通过配置 IP 地址,直接通过公司的网络连接到 Internet 上。
而我一般都是使用Windows Mobile设备中心实现上网,我在想是不是因为这个模拟器没有独立的IP,是不是,这个模拟器此是的IP与PC上的IP是同一个,然后模拟器连接不到真实位置的服务端。——这仅是我的猜想,不过感觉有类似的原因在里面。
我取消了模拟器的连接,即在设备仿真器管理器中,右击已插入底座的模拟器选择移除底座。
具体步骤:在模拟器窗口,选择文件->配置->网络->选择“启用NE2000 PCMCIA 网络适配器并绑定到”,在下拉框中选择你的PC的物理网卡。点击“确定”退出。在模拟器内部的Windows Mobile界面中,点击开始->设置->连接->网卡->选择“NE2000 兼容 Ethernet驱动程序”-> 选择“使用服务器分配的IP地址”。-> 点击右上角OK保存退出。此时你的模拟器已经了连接。再设置一下,就可以上网了。开始->设置->连接->连接->高级->选择网络->在程序自动连接到Internet时,使用的选项由默认的“Internet设置”改为“单位设置”(因为我们在上一个步骤中网卡设置的就是单位设置)。->OK退出。现在可以使用模拟器上的IE访问互联网了。
在上面步骤中,注意观察的话,可以发现模拟器已经有了独立的IP,一个与PC不同,但属于同一个网段的IP。
此时再跑一下我的程序,我的客户端程序可以与PC上的服务端程序,通过Socket正常通信了。
以上是这一段时间,使用Windows Mobile模拟器开发过程中遇到的问题,比较啰嗦,写的不好,希望能给需要的朋友提供参考。可能后续还会有问题出现。再说吧。