由於真實的設備數量有限,使用模擬器來開發是個不錯的選擇。但在實際的開發過程中,會遇到很多意想不到的問題。下面我就針對我近一段時間到的問題,做一個簡要的小結,留待以后需要時回顧,也供需要的朋友參考。
我的開發環境是: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模擬器開發過程中遇到的問題,比較啰嗦,寫的不好,希望能給需要的朋友提供參考。可能后續還會有問題出現。再說吧。
