|
Visual Studio2005支持诸如Pocket PC和Smartphone等Windows移动应用程序的开发。但是,当一个程序开发完了之后,如何将它部署到用户的设备上呢?在Visual Studio2005中,部署程序到设备上,只需要使用ActiveSync将设备连接到开发机器上并且按下F5即可。但是这种方法对于终端用户来说还是难以接受的,因为他们习惯了使用GUI方式的安装程序来隐藏安装过程细节。 在本文里,你将学习如何为你的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文件的名称和存放位置

图3 下一步就是对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
|
|
|
|
|
|