VS2005为Windows移动程序创建安装文件

2010-08-28 10:50:18来源:西部e网作者:

  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!"的消息框。这个程序的内容不重要,我只是演示如何部署它。

VS2005为Windows移动程序创建安装文件

图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上的文件夹的名字。

VS2005为Windows移动程序创建安装文件
图2

  在Solution Explore中右键点击SmartDeviceCab1,选择Properties。设置输出文件名为Debug\SampleApp.cab,如图3。这是CAB文件的名称和存放位置。

VS2005为Windows移动程序创建安装文件
图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中释放出来的应用程序,这里我们给它添加一个快捷方式。

VS2005为Windows移动程序创建安装文件
图4


  将缺省的快捷方式改名为"SampleApp v1."这将是终端用户开始菜单里将要显示的快捷方式的名称(你将在下一步中创建快捷方式)。

  在当前窗口里,右键点击File System on Target Machine,选择Add Special Folder->Start Menu Folder。

VS2005为Windows移动程序创建安装文件(2)
图5

  在当前窗口中SampleAppv1的快捷方式应该是可见的了。拖动它到Start Menu Folder。这个目录看起来应该如图6所示。这一步骤完成的工作是在程序安装时在用户的PocketPC的开始菜单中创建一个快捷方式。

VS2005为Windows移动程序创建安装文件(2)
图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

VS2005为Windows移动程序创建安装文件(3)
图7

  右键点击Solution Explorer中的Setup并选择View->Custom Actions。这样会显示所支持的各种自定义动作的类型。自定义工作编辑器允许你指定在安装过程结束后在目标计算机上所要执行的动作。在下一步中你要使用自定义动作的Install类型,它将创建安装程序。在Custom Actions面板里,右键点击Install选择Add Custom Action…,如图8。

VS2005为Windows移动程序创建安装文件(3)
图8

  这个动作将会触发一个对话框窗口弹出,在"Look in"下拉框中,选择Application Folder,图9所示。你可以看到list中的CustomInstaller.dll。选择它并点击确定。这将会将自定义的安装程序和setup程序联系起来。

VS2005为Windows移动程序创建安装文件(3)
图9

  这时你所作的仅是右键点击Solution Explorer中的Setup并且在弹出菜单中选择Build即可。

  测试安装

  就是它了!你现在可以测试你做好的安装程序了,进入C:\Setup\Debug,双击Setup,如图10。在此以前,请确认你的Pocket PC已经通过ActiveSync连接到你的电脑上了。

VS2005为Windows移动程序创建安装文件(4)
图10

  你将会被询问安装路径;使用缺省的或者你喜欢的目录点击下一步。按照屏幕上显示的指令去做,如果所有的东西都被配置正确的话,你将会看到从Windows CE App Manager返回的消息,如图11。这个消息提示你检查一下你的移动设备的屏幕来确认安装过程成功。

VS2005为Windows移动程序创建安装文件(4)
图11

  从图12上你可以看到,通过ActiveSync的连接,你现在已经成功的将程序安装到你的Pocket PC上了。

VS2005为Windows移动程序创建安装文件(4)
图12

  小提示:注意如果开始菜单比较满包含了很多项,那么"SampleApp v1"项不会出现在开始菜单;而是会出现在程序目录里,如图13。当然,你可以通过ActiveSync来进入\Windows\Start Menu\目录,删除掉不需要的项和快捷方式以及其他任何文件。

VS2005为Windows移动程序创建安装文件(4)
图13

  结束语

  为你的用户创建一个更好的安装体验看起来像是一件很"多余"的事情,但是你最好是将它作为必不可少的一件事。这样可以帮助更多的用户来使用你的程序-减少不熟悉使用移动设备的用户向客服求助的次数。这篇文章介绍了如何在Pocket PC平台上部署一个移动程序所要做的主要步骤。这些步骤当然也可以被用来部署Smartphone应用程序,尽管Smartphone也可以通过其他更通用的方式来部署--如通过web服务器和SMS等。

关键词:VS.NET