分享
 
 
 

开发和部署Pocket Pc 安装程序

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

开发和部署Pocket Pc 安装程序

原作者: Ralph Arvesen Vertigo Software, Inc. 发表于2003年3月MSDN

翻译者:liu_sir

应用:

Microsoft® .NET Compact Framework 1.0

Microsoft Visual Studio® .NET 2003

概要:

了解如何创建一个独立的.msi文件,通过运行台式机上该Msi文件在不同的Pocket Pc设备上安装应用程序。

开发部署过程自动化,因此可以很容易的创建和打包所有必要的组件生成一个.msi文件。示例代码以C#和VB.Net语言提供。(共21印刷页)

这里下载范例代码Deployment.msi

内容:

概述

部署

卸载

开发

开发过程自动化

概述

下面所列为开发和部署Pocket Pc应用程序的要点:

● Pocket Pc设备有不同的处理器类型(如ARM,SH3,MIPS等)。

● 安装程序用.Cab格式部署。

● Cab向导(cabwiz.Exe)生成特定处理器的.cab文件。

● WinCE应用程序管理器部署和安装桌面系统上的.cab文件到Pocket Pc设备上。

我们首先论述部署和卸载过程,然后是开发和开发过程的自动化。

部署

用户可以拷贝和运行合适的.cab文件到他们的设备上,但是一个更好的解决方案是通过运行桌面上的一个.msi文件把应用程序装载到设备上。

.msi安装文件检测设备的型号,拷贝正确的.cab文件到设备上,然后运行这个.cab文件安装应用程序。所有的过程都对用户透明;

用户只要运行他们桌面系统上的一个.msi文件,应用程序就可以被自动的安装到Pocket PC上。

下面是关于基于.msi文件部署的步骤:

● 用户在他们的桌面上运行.msi文件。

● msi文件解包成特定处理器的.cab文件,setup.ini和一个自定义安装组件。

● 在安装过程中被调用安装组件,由安装组件运行WinCE应用程序管理器(WinCE Application Manager)部署和安装正确的.cab文件到设备上。

● Setup.ini文件向WinCE应用程序管理器提供应用程序的描述信息。

下面的图说明与部署过程相关的各部分,接着是每个部分的描述信息。

图1.包含在部署过程中的各模块

.msi 文件

.msi文件是可以从桌面上安装你的Pocket Pc应用程序的独立文件。用户运行.msi文件,它

解包成特定处理器的.cab文件,一个自定义安装组件,和一个setup.ini文件。

.cab文件

通过运行.cab文件把Pocket PC应用程序安装在设备上。这些文件是自解压文件,包含有安装指令和应用程序所需的所有文件。这些文件是针对不同的处理器的,所以对于每一种应用程序支持的处理器需要单独的.cab文件。

安装组件

这是一个在安装过程中被调用的自定义组件。它运行WinCE应用程序管理器,通过它拷贝和安装正确的.cab文件到设备上。

Setup.ini文件

向WinCE应用程序管理器描述应用程序信息的初始化文件,在WinCE应用程序管理器安装应用程序的过程中是必不可少的。

WinCE应用程序管理器

WinCE应用程序管理器位于用户的桌面系统上,用于在Pocket PC设备上安装和卸载应用程序。下图显示应用程序管理器提示用户将要安装示例应用程序在Pocket Pc设备上。

图2.从桌面上安装一个Pocket PC应用程序

卸载 .cab文件在Pocket PC上存储安装信息,因此应用程序可以被卸载。用户可以在Pocket PC上直接卸载应用程序,或者从桌面上卸载。用Pocket PC卸载应用程序,用户可以选择应如下图所示的应用程序设置中的删除应用程序。

图3.使用Pocket PC卸载一个应用程序

就象安装时一样,用户也可以从他们的桌面上卸载应用程序。从控制面板应用程序下的添加删除程序选择要卸载的程序,点击删除按钮。这个过程调用自定义安装组件,由它使WinCE应用程序管理器运行在卸载模式(不需要指定一个Setup.Ini文件)。用户去掉应用程序上的对勾,点击OK去卸载Pocket PC上的应用程序。

图4.从桌面系统上卸载一个PocketPc程序

开发安装程序

开发安装程序的目标是用最小的工作量生成一个.msi文件(如果可能的话,点一下鼠标)。首先让我们看一下开发安装程序过程所涉及的各部分:

● BuildCab.bat通过运行cab向导启动安装过程。

● 信息文件(.inf)向cab向导提供应用程序描述。

● cab向导根据.inf文件所指出的处理器类型生成不同的.cab文件。

● .cab文件,一个自定义安装组件和一个Setup.ini文件被打包成一个.msi文件。

下面的图表说明与安装开发过程相关的各部分,接下来是每个部分的描述信息。

图5.与安装开发过程的相关部分

BuildCab.bat文件通过运行Cab向导工具生成特定处理器的.cab文件。当你从生成菜单上选择生成cab文件时, Visual Studio生成一个模板BuildCab.Bat文件。让Microsoft® Visual Studio®生成这个文件,然后拷贝它到一个不同的路径,然后做一些更改是一个好办法。很有可能,仅有的改变是为.cab和log文件指定一个新的路径。示例中的BuildCab.Bat如下所示。 C:\Program Files\Microsoft Visual Studio .NET

2003\CompactFrameworkSDK\v1.0.5000\Windows CE\..\bin\..\bin\cabwiz.exe"

"c:\program files\pocketpc deploy

sample\Source\CS\PocketApp\BuildCabs\PocketApp_PPC.inf" /dest

"c:\program files\pocketpc deploy

sample\Source\CS\PocketApp\BuildCabs\Cabs" /err CabWiz.PPC.log /cpu

ARMV4 ARM SH3 MIPS X86 WCE420X86

信息文件(.inf)

Microsoft Windows® CE .NET .inf文件向cab向导指定了安装设置和应用程序文件。如buildcab.bat文件,当生成cab文件被选择时,Visual Studio生成一个模板.inf文件。你应该首先用Visual Studio生成这个文件,然后拷贝到另外的路径去做一些更改。这个文件通常需要很小的修改;通常修改Provider的名称就可以了。 Visual Studio生成一个.inf文件包含对vsd_setup.dll的引用。这个dll是用于版本检查以及假如Pocket PC没有正确的安装.Net精简板,报告这个信息。把它包含在你的应用程序中是一个好注意,但为了更清晰,我们把它从示例代码中移除了。 例子程序中的.inf如下所示。你可以访问Microsoft Windows CE .NET: Creating an .inf File获取多信息。 Signature="$Windows NT$"

Provider="Sample Company"

CESignature="$Windows CE$"

[CEStrings]

AppName="PocketApp"

InstallDir=%CE1%\%AppName%

[CEDevice]

VersionMin=3.00

VersionMax=4.99

[DefaultInstall]

CEShortcuts=Shortcuts

CopyFiles=Files.Common

[SourceDisksNames]

1=,"Common1",,"C:\Code\Microsoft\Pocket PC

Whitepapers\Deployment\Code\CS\PocketApp\obj\Release\"

[SourceDisksFiles]

PocketApp.exe=1

[DestinationDirs]

Files.Common=0,%InstallDir%

Shortcuts=0,%CE2%\Start Menu

[Files.Common]

PocketApp.exe,,,0

[Shortcuts]

PocketApp,0,PocketApp.exe,%CE11%

Cab向导

Cab向导(cabwiz.exe)生成.cab文件,该文件可以被安装在不同的Pocket PC设备上。一个.inf文件作为命令行的第一个参数传递,用于向向导描述应用程序。其它可选参数为目的路径,错误日志文件,和CPU类型。你可以访问You can visit Microsoft Windows CE .NET: CAB Wizard Syntax获取更多的信息。

安装组件

自定义安装组件通过处理AfterInstall和AferUnInstall事件以及运行WinCE应用程序管理器实现部署过程自动化。WinCE应用程序管理器的路径存储在注册表HKLM\software\Microsoft\Windows\CurrentVersion\App Paths\CEAppMgr.exe健值下。下面是AfterInstall和AferUnInstall事件的代码。 C#

private void Installer_AfterInstall(object sender,

System.Configuration.Install.InstallEventArgs e)

{

// get fullpath to .ini file

string arg = Path.Combine(

Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),

"Setup.ini");

// run WinCE App Manager to install .cab file on device

RunAppManager(arg);

}

private void Installer_AfterUninstall(object sender,

System.Configuration.Install.InstallEventArgs e)

{

// run app manager in uninstall mode (without any arguments)

RunAppManager(null);

}

private void RunAppManager(string arg)

{

// get path to the app manager

const string RegPath = @"Software\Microsoft\Windows\" +

@"CurrentVersion\App Paths\CEAppMgr.exe";

RegistryKey key = Registry.LocalMachine.OpenSubKey(RegPath);

string appManager = key.GetValue("") as string;

if (appManager != null)

{

// launch the app

Process.Start(

string.Format("\"{0}\"", appManager),

(arg == null) ? "" : string.Format("\"{0}\"", arg));

}

else

{

// could not locate app manager

MessageBox.Show("Could not launch the WinCE Application Manager.");

}

}

VB.Net

Private Sub Installer_AfterInstall(ByVal sender As Object, _

ByVal e As System.Configuration.Install.InstallEventArgs) _

Handles MyBase.AfterInstall

' get fullpath to .ini file

Dim arg As String = Path.Combine(Path.GetDirectoryName( _

System.Reflection.Assembly.GetExecutingAssembly().Location), _

"Setup.ini")

' run WinCE App Manager to install .cab file on device

RunAppManager(arg)

End Sub

Private Sub Installer_AfterUninstall(ByVal sender As Object, _

ByVal e As System.Configuration.Install.InstallEventArgs) _

Handles MyBase.AfterUninstall

' run app manager in uninstall mode (without any arguments)

RunAppManager(Nothing)

End Sub

Private Sub RunAppManager(ByVal arg As String)

' get path to the app manager

Const RegPath As String = "Software\Microsoft\Windows\" & _

"CurrentVersion\App Paths\CEAppMgr.exe"

Dim key As RegistryKey = Registry.LocalMachine.OpenSubKey(RegPath)

Dim appManager As String = CStr(key.GetValue(""))

If Not (appManager Is Nothing) Then

If arg Is Nothing Then

Process.Start(String.Format("""{0}""", appManager))

Else

' launch the app

Process.Start( _

String.Format("""{0}""", appManager), _

String.Format("""{0}""", arg))

End If

Else

' could not locate app manager

MessageBox.Show("Could not find app manager")

End If

End Sub

Setup.ini文件

.ini文件用于在WinCE应用程序管理器向Pocket PC设备部署应用程序时,描述应用程序信息。下面所示的是Setup.ini的例子。你应该在你的应用程序中设置Version,Description和CabFiles属性。你可以访问Microsoft Windows CE 3.0: Creating an .ini File for the Application Manager 去获取更多的关于.ini文件的信息。

[CEAppManager]

Version = 1.0

Component = App

[App]

Description = Sample Pocket PC application.

CabFiles =

PocketApp_PPC.X86.CAB,PocketApp_PPC.ARM.CAB,PocketApp_PPC.ARMV4.CAB,

PocketApp_PPC.MIPS.CAB,PocketApp_PPC.SH3.CAB,PocketApp_PPC.WCE420X86.CAB

.msi文件

这是分发给用户的文件。它包含了从桌面向不同的Pocket PC部署Pocket PC应用程序所必要的模块。

安装过程自动化

现在你已经熟悉了与安装开发过程相关的所有模块。让我们看一下生成过程如何自动化。要点如下:

● 创建一个包含多工程的解决方案(Pocket PC app, customer installer, 和 setup)。

● 把自定义的安装组件加入安装过程的安装和卸载自定义动作中。

● 用一个预生成事件去调用BuildCab.bat文件去生成.cab文件。

● 指定项目的依赖性以使项目按正确的顺序生成。

● 用配置管理器设置生成Pocket PC程序的Debug配置和Release配置。

下面的部分更加详细的描述了C#和VB.Net例子解决方案。C#解决方案点一下鼠标就生成所有的项目(Pocket PC应用程序,自定义安装组件和.msi文件)。VB.Net版本需要更多步骤,由于VB.Net缺少这两个属性:

1. 一个解决方案不能包括不同平台的VB.Net项目(Pocket PC应用程序不能和自定义安装组件在同一个解决方案中)。

2. 预生成和后生成命令事件在任何VB.Net工程中都是不支持的。

VB.Net方案仍就可以实现自动化的,只是比不上C#版本便捷而已。

解决方案和项目

C#解决方案包含三个项目:PocketPC App, Custom Installer 和 Setup。PocketPC App项目是一个基于Pocket PC的智能设备应用程序。Custom Installer项目是一个自定义安装组件。安装项目把所有的项目打包成一个.msi文件。下面显示的是C#解决方案。

图6.包含PocketPC App, Custom Installer 和 Setup项目

VB.Net需要两个解决方案。第一个包括智能设备项目PocketApp。第二个解决方案生成一个.msi文件,包括CustomInstaller, Pre-Build 和 Setup项目。CustomInstaller和Setup项目与C#中的项目相同,预生成项目是一个C++ Makefile项目;预生成项目并不包括任何C++代码,仅仅用于指定一个预编译事件。VB解决方案如下图。

图 7. 包含Pocket PC, installer component, pre-build and setup projects的VB.Net解决方案

PocketApp项目

PocketApp是一个简单的智能设备项目,“Hello World”应用程序;一个PocketPC简单程序。BuildCab.bat和PocketApp_PPC.inf文件用于生成.cab文件,Setup.ini文件用于部署应用程序。 文件app.ico是一个应用程序图标文件,显示在Pocket Pc的程序工作组中。下面显示的是在C#和VB.Net中指定应用程序图标。

图8.在C#中指定应用程序图标

图9.在VB.Net中指定应用程序图标

图10.显示在Pocket PC应用程序组中的图标

CustomInstaller项目

这个组件运行WinCE应用程序管理器,让其部署.cab文件到Pocket PC设备上。C#和VB.Net的代码已经早在上文中说明了。

Setup项目

安装项目生成一个.msi文件包括特定处理器的.cab文件,CustomerInstaller安装组件和setup.ini文件。CustomerInstaller组件添加进来作为Install和UnInstall自定义动作的响应,如下图所示

图11.添加Install和UnInstall自定义动作的响应

预生成事件

在PocketApp项目生成后,你需要运行BuildCab.bat生成.cab文件。Visual Studio不允许你为C#智能设备项目指定生成后命令事件。所以我们最好为CustomerInstaller项目指定一个预生成命令事件。

图 12.用一个预生成命令事件去在C#中生成.cab文件

Visual Studio不允许VB.Net项目有任何生成事件,所以我们用一个C++ Makefile工程去定义预生成事件,如下图所示。

图 13.用一个C++预生成事件作为VB.Net的解决方法

项目依赖

由于解决方案包含许多工程,所以设置正确的生成顺序是很重要的。对于C#,生成顺序设置为PocketApp,CustomeInstaller 和 Setup,如下图所示。

图 14.为C#解决方案设置生成顺序

VB.Net版本包含有两个解决方案;PocketApp解决方案应首先生成,接下来是PocketPCSetup解决方按。Setup解决方案的生成顺序如下图所示。

图 15.指定VB.Net解决方案的生成顺序

配置管理器

配置管理器用于生成Pocket PC项目在Debug模式和所有的程序在Release模式。就是说,仅为调试应用程序Pocket PC应用程序,你不用经历整个生成过程。C#版本的配置图示如下。 这个配置在VB.Net中不需要,因为其中的一个解决方案是对于Pocket PC的,另外一个解决方案用于生成.msi文件。

图 16.仅生成Pocket PC项目在Debug模式

图 17.生成所有的项目于Release模式

安装和生成示例解决方案

下面是安装和生成示例解决方案的注意点。

● 运行PocketPC部署程序Sample.msi文件,安装C#和VB.Net到你的系统中。指向Visual Studio解决方案文件的链结添加在开始菜单中的PocketPC Deploy Sample组下面。

● 在BuildCab.bat和PocketApp_PPC.inf文件中的硬编码被更新以与你的系统匹配(例子安装文件夹和Visual Studio的路径)。你应该多检查这些文件的路径信息,如果你生成示例程序的时候遇到困难。

● 选择Release模式生成所有的项目(Debug模式只生成Pocket PC应用程序)。

● .msi文件命名为PocketApp Setup.msi,在Setup\Release文件夹下创建。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有