打包和部署 Pocket PC 应用程序






4.04/5 (35投票s)
2004 年 4 月 17 日
13分钟阅读

335146
创建 Pocket PC 应用程序 MSI Windows Installer 的分步说明。
引言
本文介绍如何创建自包含的 Windows Installer 文件(使用 Visual Studio .NET),该文件用于安装 Pocket PC / Windows Mobile 应用程序。文章详细介绍了如何使 CE App Manager 安装正确的 CAB 文件,以及如何将所有这些内容自动化到一个 MSI(安装)文件中。
我假设该应用程序是一个 .NET 应用程序;辅助组件创建的也是 .NET 组件。
第一次尝试此操作时,我发现有很多关于如何实现具体细节的文章和信息,例如 CabWizard 的每个选项是什么,但关于如何将所有内容整合起来的信息却很少。MSDN 上有一篇题为《开发和部署 Pocket PC 安装应用程序》的文章,其中提供了从头到尾的完整演练,但它遗漏了一些让我挠头几个小时的具体细节。我写这篇指南几乎是作为上述文章的补充,希望能帮助其他人少走弯路。
概述
Pocket PC 应用程序通过 CAB 文件安装到设备上。为此,您可以直接将 CAB 文件复制到设备上然后运行它,或者在 PC 上使用 CE App Manager(CeAppMgr.exe)安装 CAB 文件。
然而,由于许多用户不知道如何操作,并且每种不同的处理器类型都需要不同的 CAB 文件,因此这种方法最多算得上是麻烦。
目标是拥有一个正常的安装程序样式程序,该程序运行后,会将正确的文件复制到正确的位置,联系 CE App Manager 并让它在设备上安装正确的 CAB 文件,理想情况下,所有这些都包含在一个可以从 VS.NET 内部自动生成的安装文件中。
路线图
假设您有一个包含 PPC/WM 项目的 VS.NET 解决方案,创建 MSI 文件的过程如下:
- 步骤 1:将 VS.NET 创建的 BuildCab.bat 和 INF 文件复制到一个新目录中,以便我们可以进行编辑而不会覆盖我们的更改。
- 步骤 2:向您的解决方案中添加一个 **自定义安装程序** 项目——这个项目将生成一个 DLL 程序集,其中包含一些 Windows Installer 事件的钩子,以便我们可以在安装完成后执行操作。
- 步骤 3:向您的解决方案中添加一个安装项目——这是一个 Windows Installer 项目,它将获取 PPC 应用程序的输出,引用自定义安装程序 DLL,并安装应用程序。
- 步骤 4:创建一个 MyProject.ini 文件,该文件由 CE App Manager (CeAppMgr.exe) 用于安装您的应用程序。将其添加到应用程序的项目中,并从解决方案中的安装/安装程序项目进行引用。
- 步骤 5:使其更加完善。
准备工作
为了演示此过程,我有一个 VS.NET 中的简单 Smart Device 解决方案,其中包含一个非常简单的应用程序,如下图所示,它显示两个按钮,点击其中一个按钮会打印“HI”,而另一个按钮则会退出。
步骤 1 - 复制 BuildCab.bat 和相应的 INF 文件
在 Visual Studio .NET 中的“生成”菜单下,有一个“生成 Cab 文件”选项。运行它,VS.NET 将生成 CAB 文件、一个相应的 INF 文件(用于告知 CE App Manager CAB 的所有信息)以及一个用于重新生成上述文件的批处理文件(BuildCab.bat)。
我们需要编辑这些文件,但我们需要将它们存放在一个 VS.NET 不会每次重新生成时都覆盖它们的地方,因此第一步是在应用程序的项目树下创建一个目录,我们可以在其中存储副本。所以,在我的示例中,我有一个 MyProject 目录,其中包含 bin、cab、obj 等目录。在其中创建一个名为 BuildCabs 的目录(名称实际上无关紧要),并将 BuildCab.bat 文件和 INF 文件复制到其中。(INF 文件将命名为 ProjectName_PPC.inf,所以在示例中是 MyProject_PPC.inf)。
现在打开 INF 文件。您可以在此处添加许多选项,并且有关于所有语法的详细“操作指南”,不同的选项以及其他所有内容——请查阅以获取高级选项。我们真正需要更改的是 **提供程序字符串 (Provider string)**,将其替换为公司名称,以及 **应用程序名称 (AppName)**,将其替换为应用程序的名称。如果需要,您也可以更改 **安装目录 (InstallDir)**,但请保留其中的 %CE1%\,以便 CE App Manager 可以在用户选择时将其安装到存储卡上。
因此,MyProject_PPC.inf 文件(现在已复制并保存在我们的 BuildCabs 目录中)的前几行如下所示(请注意,所有其他内容仍然存在,这些只是已修改的行):
[Version]
Signature="$Windows NT$"
Provider="Lionkey"
CESignature="$Windows CE$"
[CEStrings]
AppName="My Test Project"
InstallDir=%CE1%\%AppName%
..
..
..
现在打开我们的 BuildCab.bat 文件。它所做的只是在适当的 INF 文件上运行 CabWiz,因此唯一需要更改的是第一个参数,使其指向我们存储在 BuildCabs 目录中的已修改 INF 文件。然后,我们将从修改后的 **预生成 (Pre-Build)** 事件中“手动”(即自动,但不是由 VS.NET 自动完成)运行我们的 BuildCab.bat 文件,因为显然 VS.NET 不会知道如何自动运行我们的副本。这将在下一节中完成。
步骤 2 - 创建自定义安装程序
下一阶段是向解决方案中添加自定义安装程序项目。最简单的方法是向您的解决方案中添加一个新的空白项目。将其命名为 **CustomInstaller**。
首先,右键单击并选择属性,然后将 **输出类型 (OutputType)** 设置为类库 (Class Library)。
现在,右键单击解决方案中的空项目,然后选择“添加新项...”。选择 **安装程序类 (Installer Class)** 类型的项,将其命名为 CustomerInstaller.cs,然后单击确定。(我假设您使用的语言是 C#)。现在,为这个新项目添加一些引用,您需要添加 System.Data
、System.Windows.Forms
和 System.XML
。
另外,添加以下
using System.IO;
using System.Diagnostics;
using Microsoft.Win32;
using System.Reflection;
using System.Windows.Forms;
您的解决方案资源管理器视图将类似这样:
接下来,您需要向 CustomInstaller
类添加将在 Installer
类的 AfterInstall
和 AfterUninstall
事件上运行的方法。为此,请输入构造函数 CustomInstaller()
,然后输入
this.AfterInstall += new InstallEventHandler(Installer_AfterInstall);
this.AfterUninstall += new InstallEventHandler(Installer_AfterUninstall);
但是不要复制粘贴! 因为,当您键入时,当您到达“=”时,VS.NET 会提示您建议的事件处理程序的名称,并会显示“TAB 插入”,它会插入“=”之后的所有内容。然后它会显示“TAB 生成类中的处理程序”。
完成此操作后,您将获得处理程序的存根。现在您需要添加文章《开发和部署 Pocket PC 安装应用程序》中找到的 RunAppManager
的代码——我不想未经许可复制它,所以不在此包含。基本上,只需从文章中获取代码并将其粘贴到类中。
接下来,将以下代码添加到 CustomInstaller_AfterInstall
string arg = Path.Combine(
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
"MyProject.ini");
RunAppManager(arg);
以及将以下代码添加到 CustomInstaller_AfterUninstall
RunAppManager(null);
MyProject.ini 文件是在第 4 步中创建的文件。这个 INI 文件是我们告诉 CeAppMgr.exe 关于我们应用程序的文件。请注意,在原始文章中,它被称为 setup.ini。但是我发现,将其命名为描述所安装项目的名称很有用。这样更方便,因为 Windows Installer 项目本身会创建自己的 setup.ini 文件,并且很容易混淆。
此阶段要做的最后一件事是设置 **预生成 (Pre-Build)** 事件。我们需要在重建解决方案时重建 CAB 文件,但我们不希望 VS.NET 来做这件事,因为我们想使用已修改的 INF 文件——因此才移动了 BuildCab.bat 文件。所以,这里是一个方便的放置位置,作为 **预生成** 事件。再次右键单击 **CustomInstaller** 项目,单击属性,选择生成事件 (Build Events),然后在预生成命令 (Pre-Build Event Command Line) 中输入 BuildCab.bat 的路径。最简单的方法是使其相对。如下所示:
步骤 3 - 将安装项目添加到解决方案
接下来,在解决方案资源管理器中右键单击解决方案,然后选择“添加 -> 新建项目”。将其命名为 ProjectNameInstaller——所以在示例中,我将其命名为 MyProjectInstaller。
首先,将 CAB 文件添加到安装项目中。这可以通过右键单击项目名称,然后选择“添加 >> 文件...”来完成。导航到 CAB 文件所在的位置,通常是 MyProject/cab/Release。添加那里列出的所有 CAB 文件。
到目前为止,如果运行安装程序,CAB 文件将被复制到用户的 PC 并放在 \Program Files\Application Folder(在我的示例中,Application Folder 是 MyProject)。但仅此而已。
接下来,我们添加要执行的 **自定义操作 (Custom Actions)** 的引用——这些由我们的 CustomInstaller
类处理。因此,第一项工作是将我们的 CustomInstaller 项目生成的 CustomInstaller.dll 文件(其主要输出)添加到安装项目中。
右键单击 Windows Installer 项目,选择添加 >> 文件...,然后导航到 CustomInstaller.dll 文件,该文件将位于您的 **CustomInstaller** 项目的输出目录中。当然,请注意,您至少必须生成一次 **CustomInstaller** 项目,这样 DLL 才会在此处存在。
现在,要设置安装程序以使用我们 DLL 中包含的 **自定义操作**,请右键单击安装项目名称。单击查看 >> 自定义操作 (Custom Actions)。您将在主面板中看到一个列表,其中包含诸如 Install、Commit 等自定义操作。
右键单击Install并选择“添加自定义操作”。选择“应用程序文件夹 (Application Folder)”——这是用户计算机上用于复制添加到安装程序的所有文件等的目录——然后选择“CustomInstaller.dll”。
现在您应该会看到类似以下的内容:
现在唯一剩下的必要步骤是创建 MyProject.ini 文件并将其添加到安装项目中。这就是第四步!
步骤 4 - 为 CeAppMgr.exe 创建 INI 文件
要让 CE App Manager 安装应用程序,您必须在运行它时指定一个 INI 文件。虽然原始文章引用了一个 setup.ini 文件,这是一个很好的标准名称,但我发现使用特定的项目名称可以减少混淆,因为 Windows Installer 项目本身喜欢创建自己的 setup.ini 文件,而且很容易混淆,导致 Windows Installer 设置文件进入您的应用程序等。
注意:我发现 CE App Manager 对这些文件非常挑剔,不正确的位置多一个空格或空行,它就会告诉您 INI 文件无效。如果无效,请仔细检查 MSDN 以获取规范。
现在,右键单击主项目名称,单击添加 >> 新建项...,然后选择文本文件 (Text File) 类型。将其命名为 ProjectName.ini 或类似名称,我将其命名为 MyProject.ini。请注意,此 INI 文件不一定需要包含在 VS.NET 项目中。但是,这样做意味着它可以方便地访问,从而方便编辑。在新文件中输入以下内容:
[CEAppManager]
Version = 1.0
Component = MyProject
[MyProject]
Description = A Test Project.
CabFiles = MyProject_PPC.ARM.CAB,MyProject_PPC.ARMV4.CAB,
MyProject_PPC.MIPS.CAB,MyProject_PPC.SH3.CAB,
MyProject_PPC.WCE420X86.CAB,MyProject_PPC.X86.CAB
显然,根据您的项目调整详细信息。保存此文件。
注意 1:在 [MyProject]
部分定义和 Description =
键行之间不能有换行符。任何换行符都会导致 CE App Manager 报告您的 INI 文件无效。这很容易被忽略,因为许多示例中都有很多注释,给人一种换行符可以随意放置或仅用于使这些文件更易读的印象,但如果部分定义和键之间有换行符,文件将无效。
注意 2:在每个 CAB 文件列表之间不能有空格。任何空格都将被视为文件名的一部分,因此 CAB 文件将无效。
注意 3:您可以通过将此文件作为第一个参数运行 CeAppMgr.exe(通常在 c:\program files\microsoft activesync\ 中)来测试此文件——但请注意,如果像这样运行时,CeAppMgr.exe 找不到 CAB 文件(因为它们没有指定完整路径),则 INI 文件将被报告为无效——即使它不是。因此,如果您通过这种方式测试文件,请确保从 CAB 文件所在的目录运行 CeAppMgr.exe。
注意 4:一些示例显示这些 CeAppMgr.exe INI 文件带有以;字符开头的注释,位于实际 INI 文件行的末尾(即,不是仅位于它们自己的空白行上)。我发现这样做会导致 CeAppMgr.exe 报告 INI 文件无效。我不知道设计功能是什么,或者这是否是一个 bug,但几个示例中的 INI 文件就是无法工作。(至少以我的 CeAppMgr.exe 版本!!)
注意 5:我发现,不知何故,如果 X86 CAB 文件放在 CAB 文件列表的开头,就像大多数示例一样,它可能会导致某些设备上安装应用程序出现问题。发生的情况是,您会在设备上收到一条消息,显示“<应用程序名称> 安装失败。请再次运行设置。”。我不知道原因,但将它放在列表的末尾可以获得更好的结果。
接下来,将此文件添加到安装项目中,选择将其放置在应用程序文件夹中。(这是我们使用的一切的去向)。这意味着,在用户计算机上安装期间,它将被复制到用户计算机上的该文件夹中,从而使 CeAppMgr.exe 可以使用。
现在您就完成了。您应该能够生成整个解决方案。您将在 InstallerProject\Release 目录中得到一个 MSI 文件。您还将获得 setup.ini 和 setup.exe 文件,但您可以仅分发 MSI 文件。
步骤 5 - 使其更加完善
遵循上述过程应该可以生成一个可用的 MSI 文件。您可以做一些事情使其稍微用户友好一些。这是基本的东西,并且在所有帮助文件中都有介绍。
如果单击安装项目使其成为活动对象,您可以使用属性工具窗口设置各种选项,例如**作者 (Author)**、**制造商 (Manafacturer)**、**支持 URL (SupportURL)**、**标题 (Title)** 等。这些是 Windows Installer 项目中使用的内容,当您在 Windows 资源管理器中右键单击 MSI 文件并查看 MSI 的属性时可以看到它们。
您还可以使用此属性页的第一个条目 **AddRemoveProgramsIcon**,它很容易被忽略,因为名称的“Icon”部分通常被隐藏了,因为它太长了——但这可以创建将在“控制面板”的“添加/删除程序”列表中显示的自定义图标。
另外,如果右键单击安装项目,选择查看 >> 用户界面 (User Interface),然后选择一个 UI 元素,例如“欢迎”或“安装文件夹”,这些项目在其属性页面中有一个可设置的 BannerBitmap
属性。
您可以使用此图像来更改安装窗口的标题/横幅图像。图像必须是 500x70 像素。另外,如果您需要放置徽标,只能依赖图像的最后 80 像素宽度作为无文本区域(即从 420-500)。
总结
希望上述内容能填补其他信息来源在过程中留下的一些空白。我知道其中一些烦恼——尤其是 CeAppMgr.exe INI 文件配置——让我困惑了很长时间。
如果文章中有任何错误,或者您有任何反馈,请随时给我发送电子邮件:si <at> kittle.co.uk