在本文里,你將學習如何為你的Windows移動應用程序創建CAB文件使得它們可以方便的部署到你的Window移動設備上。你也將學習如何自定制一個安裝包,使得終端用戶可以通過臺式機上的安裝程序來部署程序到Windows移動設備上。
下面是你為一個Windows移動應用程序創建安裝包時所需要執行的步驟的概覽:
·創建Windows移動應用程序
·將該程序打包為CAB文件
·創建一個自定制的安裝程序來安裝該Windows移動應用程序
·創建一個setup.ini文件來描述這個Windows移動應用程序及其相關的CAB文件
·創建一個Setup工程來打包CAB文件,自定制的安裝程序和setup.ini文件
創建應用程序
本文我使用Visual Studio2005創建了一個簡單的Windows Mobile5.0的應用程序,用來演示部署功能。如果你也想和我一起學習這個demo,在VS中創建一個新的設備應用程序工程并且命名其為C:\SampleApp,如圖1所示。為了簡單起見,這個程序只包含一個按鈕控件,當點擊時會彈出"Hello Packet PC World!"的消息框。這個程序的內容不重要,我只是演示如何部署它。
![]() 圖1 |
打包CAB文件
部署這個工程的第一步是將這個應用程序打包為一個Cabinet(CAB)文件。CAB文件可以被部署到設備上,然后解開并安裝。CAB文件是一個可執行的壓縮文件,其中包含了你的應用程序,其他相關的DLL文件,資源,幫助文件和其他你所要包含的文件。
在這一步里我不但會創建本程序的CAB文件,我還將進行相關配置,從而在安裝程序的時候,一個快捷方式將會被創建在用戶的開始菜單里。 創建一個新的工程,選擇File->Add Project。在工程類型欄中,展開Other Project Types節點,選擇Setup and Deployment。選擇Smart Device CAB Project模板。將新建工程命名為C:\SmartDeviceCab1,點擊確定。
在Solution Explorer中,點擊SmartDeviceCab1工程,設置ProductName屬性為MySampleApp,如圖2所示。這將會是你將程序安裝到PocketPC上的文件夾的名字。
![]() 圖2 |
在Solution Explore中右鍵點擊SmartDeviceCab1,選擇Properties。設置輸出文件名為Debug\SampleApp.cab,如圖3。這是CAB文件的名稱和存放位置。
下一步就是對CAB文件進行配置,確定它被部署到用戶的PocketPC上時將如何安裝。這里,我將為該程序在用戶的PocketPC的開始菜單中添加一個快捷方式,這樣用戶可以直接從開始菜單里啟動程序。
在文件系統面板里,右鍵點擊Application Folder并且選擇Add->Project Output…在Add Project Output Group窗口,選擇Primary output,點擊確定。
右鍵點擊Primary output from SampleApp,選擇Create Shortcut to Primary output from SampleApp(Active),如圖4。Primary output指的是將要從Sampleapp.cab中釋放出來的應用程序,這里我們給它添加一個快捷方式。
![]() 圖4 |
將缺省的快捷方式改名為"SampleApp v1."這將是終端用戶開始菜單里將要顯示的快捷方式的名稱(你將在下一步中創建快捷方式)。
在當前窗口里,右鍵點擊File System on Target Machine,選擇Add Special Folder->Start Menu Folder。
![]() 圖5 |
在當前窗口中SampleAppv1的快捷方式應該是可見的了。拖動它到Start Menu Folder。這個目錄看起來應該如圖6所示。這一步驟完成的工作是在程序安裝時在用戶的PocketPC的開始菜單中創建一個快捷方式。
![]() 圖6 |
下一步是創建CAB文件。進入到Build->Build SmartDeviceCab1來創建CAB文件工程。CAB文件其實是一個安裝程序,但是只有對計算機技術有很多了解的人才知道怎么作。下一步的工作是創建一個和普通的PC上安裝程序類似的基于窗口樣式的安裝程序。
創建自定制的安裝程序
上一步中我們創建了CAB文件。其實從技術上來說這已經解決了安裝問題。但是用戶仍然需要知道如何將CAB文件傳輸到Pocket PC上,然后使用觸筆來點擊CAB文件啟動安裝過程。一個更好的方法是創建一個Windows安裝程序來自動化安裝過程。這樣做的話,你需要寫一些代碼來啟動Windows CE App Manager。App Manager是ActiveSync(用來在Pocket PC和計算機之間進行同步的程序,工作在Windows移動設備上,如Pocket PC和Smartphone)的一個部分,在Pocket PC上完成程序安裝的任務。
開始,在當前的solution中添加一個新的工程(File->Add Project)…點擊Windows project type選擇Class Library模板。給工程命名為CustomInstaller并且點擊確定。
你需要給你的工程添加兩個引用。在Solution Explore中右鍵點擊CustomInstaller,并且選擇Add Reference…需要添加的是System.Configuration.Install和System.Windows.Forms。System.Configuration.Install命名空間提供了允許你為自己的組件編寫自定制的安裝文件的類,而System.Windows.Forms命名空間則提供了允許你通過Windows UI來和用戶進行交互(如Messagebox等)的相關類。
在Solution Explorer中雙擊Class1.vb,在文件中填入下列代碼--SetupApp類:
| Imports System.Windows.Forms Imports System.Diagnostics Imports System.Reflection Imports System.IO Imports Microsoft.Win32 <System.ComponentModel.RunInstaller(True)> _ Public Class SetupApp Inherits System.Configuration.Install.Installer Private Const INI_FILE As String = "\setup.ini" Private Sub Installer_AfterInstall(ByVal sender As Object, _ ByVal e As System.Configuration.Install.InstallEventArgs) _ Handles MyBase.AfterInstall '---to be executed when the application is installed--- Dim ceAppPath As String = GetWindowsCeApplicationManager() If ceAppPath = String.Empty Then Return End If Dim iniPath As String = GetIniPath() Process.Start(ceAppPath, iniPath) End Sub Private Sub Installer_AfterUninstall(ByVal sender As Object, _ ByVal e As System.Configuration.Install.InstallEventArgs) _ Handles MyBase.AfterUninstall '---to be executed when the application is uninstalled--- Dim ceAppPath As String = GetWindowsCeApplicationManager() If ceAppPath = String.Empty Then Return End If Dim iniPath As String = GetIniPath() Process.Start(ceAppPath, String.Empty) End Sub Public Shared Function GetWindowsCeApplicationManager() As String '---check if the Windows CE Application Manager is installed--- Dim ceAppPath As String = KeyExists() If ceAppPath = String.Empty Then MessageBox.Show("Windows CE App Manager not installed", _ "Setup", MessageBoxButtons.OK, _ MessageBoxIcon.Error) Return String.Empty Else Return ceAppPath End If End Function Public Shared Function GetIniPath() As String '---get the path of the .ini file--- Return """" & _ Path.Combine(Path.GetDirectoryName( _ System.Reflection.Assembly. _ GetExecutingAssembly().Location), "Setup.ini") & """" End Function Private Shared Function KeyExists() As String '---get the path to the Windows CE App Manager from the registry--- Dim key As RegistryKey = _ Registry.LocalMachine.OpenSubKey( _ "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\CEAPPMGR.EXE") If key Is Nothing Then Return String.Empty Else Return key.GetValue(String.Empty, String.Empty) End If End Function End Class |
這個類里包含了調用Windows CE App Manager應用程序的代碼,從而使得你的應用程序可以通過ActiveSync安裝到用戶的Pocket PC上。
SetupApp類包含了2個事件和3個方法:
·Installer_AfterInstall事件:在安裝過程啟動后事件觸發
·Installer_AfterUninstall事件:在反安裝過程啟動后事件觸發
·GetWindowsCeApplicationManager:返回包含Windows CE App Manager的路徑
·GetIniPath:返回Setup.ini文件的路徑
·KeyExists:通過注冊表檢查當前機器上是否有Windows CE App Manager可用。
SetupApp繼承了Installer類,并且將RunInstallerAttribute屬性設置為true(<System.ComponentModel.RunInstaller(True)>)。因此,Visual Studio的自定制安裝程序或InstallUtil.exe將在程序安裝時被觸發。在安裝時,SetupApp類首先檢查是否當前系統里有Windows CE App Manager。如果有的話,程序將會通過Windows CE App Manager安裝。(注:如果需要詳細了解如何在.NET中創建自定制的安裝程序,請查閱Building Custom Installer Classes in .NET)。
當添加了這個類之后,就可以創建自定制的安裝程序工程了。右鍵點擊Solution Explorer中的CustomInstaller,并且選擇Build。
創建.ini文件
下一步就是創建一個ini文件來描述你要部署的程序。這個信息將會被Windows CE App Manager使用。
用記事本程序編輯一個setup.ini文件,將它保存在C:\CustomInstaller\目錄下。
| [ceAppManager] Version = 1.0 Component = SampleApp [SampleApp] Description = Sample Application Uninstall = SampleApp CabFiles = SampleApp.cab (注:MSDN有一篇很好的參考文獻,詳細解釋了ini文件不同的域的內容) |
創建Setup包
在ini文件創建之后,最后一步就是創建一個setup工程來打包所有你早先創建的文件。在當前的solution中添加一個新的工程, File->Add Project…。
點擊Setup and Deployment工程類型,選擇Setup Project。給工程命名為Setup,點擊確定。在Solution Explorer里右鍵點擊Setup,選擇Add->File…給工程添加如下文件(如圖7):
· C:\CustomInstaller\bin\Debug\CustomInstaller.dll
· C:\SmartDeviceCab1\Debug\SampleApp.CAB
· C:\CustomInstaller\setup.ini
![]() 圖7 |
右鍵點擊Solution Explorer中的Setup并選擇View->Custom Actions。這樣會顯示所支持的各種自定義動作的類型。自定義工作編輯器允許你指定在安裝過程結束后在目標計算機上所要執行的動作。在下一步中你要使用自定義動作的Install類型,它將創建安裝程序。在Custom Actions面板里,右鍵點擊Install選擇Add Custom Action…,如圖8。
![]() 圖8 |
這個動作將會觸發一個對話框窗口彈出,在"Look in"下拉框中,選擇Application Folder,圖9所示。你可以看到list中的CustomInstaller.dll。選擇它并點擊確定。這將會將自定義的安裝程序和setup程序聯系起來。
![]() 圖9 |
這時你所作的僅是右鍵點擊Solution Explorer中的Setup并且在彈出菜單中選擇Build即可。
測試安裝
就是它了!你現在可以測試你做好的安裝程序了,進入C:\Setup\Debug,雙擊Setup,如圖10。在此以前,請確認你的Pocket PC已經通過ActiveSync連接到你的電腦上了。
![]() 圖10 |
你將會被詢問安裝路徑;使用缺省的或者你喜歡的目錄點擊下一步。按照屏幕上顯示的指令去做,如果所有的東西都被配置正確的話,你將會看到從Windows CE App Manager返回的消息,如圖11。這個消息提示你檢查一下你的移動設備的屏幕來確認安裝過程成功。
![]() 圖11 |
從圖12上你可以看到,通過ActiveSync的連接,你現在已經成功的將程序安裝到你的Pocket PC上了。
![]() 圖12 |
小提示:注意如果開始菜單比較滿包含了很多項,那么"SampleApp v1"項不會出現在開始菜單;而是會出現在程序目錄里,如圖13。當然,你可以通過ActiveSync來進入\Windows\Start Menu\目錄,刪除掉不需要的項和快捷方式以及其他任何文件。
結束語
為你的用戶創建一個更好的安裝體驗看起來像是一件很"多余"的事情,但是你最好是將它作為必不可少的一件事。這樣可以幫助更多的用戶來使用你的程序-減少不熟悉使用移動設備的用戶向客服求助的次數。這篇文章介紹了如何在Pocket PC平臺上部署一個移動程序所要做的主要步驟。這些步驟當然也可以被用來部署Smartphone應用程序,盡管Smartphone也可以通過其他更通用的方式來部署--如通過web服務器和SMS等。














