程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB.NET >> 開發和部署Pocket PC安裝程序

開發和部署Pocket PC安裝程序

編輯:VB.NET

應用Microsoft® .NET Compact Framework 1.0
Microsoft Visual Studio® .NET 2003

概要

了解如何創建獨立的 .msi 文件,該文件從桌面運行以便將應用程序安裝到不同的 Pocket PC 設備上。開發過程是自動化的,所以能輕松創建和打包所需組件到一個 .msi 文件。示例代碼用 C# 和 VB.NET 語言編寫。

內容提要

概述

部署

卸載

開發

開發過程自動化

概述

下面所列為開發和部署 Pocket PC 應用程序的要點:

Pocket PC 設備有不同的處理器類型(如:ARM,SH3,MIPS 等)。

應用程序用 .Cab 文件格式部署。

Cab 向導(cabwiz.Exe)生成特定處理器的.cab文件。

WinCE 應用程序管理器從桌面部署和安裝.cab文件到 Pocket PC 設備上。

我們首先論述部署和卸載過程,然後是開發和開發過程的自動化。

部署

一般用戶可以通過拷貝和運行合適的.cab文件到他們的設備上來安裝 Pocket PC 應用程序,但是有一個更好的解決方案是從桌面運行 .msi 文件 來安裝應用程序到其設備。該.msi文件檢測設備類型,拷貝正確的.cab文件到設備上,然後運行這個.cab文件安裝應用程序。所有的過程都對用戶透明,用戶只要 在其桌面運行.msi文件,應用程序就可以被自動安裝到 Pocket PC 上。

下面是基於 .msi 部署涉及的步驟:

用戶在他們的桌面運行 .msi 文件。

msi 文件解包成特定處理器的 .cab 文件,setup.ini 和一個定制的安裝程序組件。

安裝過程中安裝程序組件被調用,通過運行WinCE應用程序管理器(WinCE Application Manager)將正確的 .cab 文件部署和安裝到設備上。

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

下圖說明了與部署過程相關的各部分,接著是每個部分的描述信息。

圖一 包含在部署過程中的各個模塊

.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設備上。

圖二 從桌面上安裝一個Pocket PC應用程序

卸載

.cab文件在Pocket PC上存儲安裝信息,因此應用程序可以被卸載。用戶可以在Pocket PC上直接卸載應用程序,或者從桌面上卸載。用Pocket PC卸載應用程序,用戶可以選擇應如下圖所示的應用程序設置中的刪除應用程序。

圖三 使用Pocket PC卸載一個應用程序

就象安裝時一樣,用戶也可以從他們的桌面上卸載應用程序。從控制面板應用程序下的添加刪除程序選擇要卸載的程序,點擊刪除按鈕。這個過程調用自定義安裝組件,由它使WinCE應用程序管理器運行在卸載模式(不需要指定一個Setup.Ini文件)。用戶去掉應用程序上的對勾,點擊OK去卸載Pocket PC上的應用程序。

圖四 從桌面系統上卸載一個PocketPc程序

開發安裝程序

開發安裝程序的目標是用最小的工作量生成一個.msi文件(如果可能的話,點一下鼠標)。首先讓我們看一下開發安裝程序過程所涉及的各部分:

BuildCab.bat通過運行cab向導啟動安裝過程

信息文件(.inf)向cab向導提供應用程序描述

cab向導根據 .inf 文件所指出的處理器類型生成不同的.cab文件

.cab文件,一個自定義安裝組件和一個Setup.ini文件被打包成一個.msi文件

下面的圖表說明與安裝開發過程相關的各部分,接下來是每個部分的描述信息。

圖五 與安裝開發過程的相關部分

BuildCab.bat

通過運行Cab向導工具生成特定處理器的.cab文件。當你從生成菜單上選擇生成cab文件時,Visual Studio生成一個模板BuildCab.Bat文件。讓Microsoft? Visual Studio?生成這個文件,然後拷貝它到一個不同的路徑,然後做一些更改是一個好辦法。很有可能,僅有的改變是為.cab和log文件指定一個新的路徑。示例中的BuildCab.Bat如下所示。

"C:Program FilesMicrosoft Visual Studio .NET
2003CompactFrameworkSDKv1.0.5000Windows CE..in..incabwiz.exe"
"c:program filespocketpc deploy
sampleSourceCSPocketAppBuildCabsPocketApp_PPC.inf" /dest
"c:program filespocketpc deploy
sampleSourceCSPocketAppBuildCabsCabs" /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獲取多信息。

[Version]
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:CodeMicrosoftPocket PC
 WhitepapersDeploymentCodeCSPocketAppobjRelease"
[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應用程序管理器的路徑存儲在注冊表HKLMsoftwareMicrosoftWindowsCurrentVersionApp PathsCEAppMgr.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 = @"SoftwareMicrosoftWindows" +
   @"CurrentVersionApp PathsCEAppMgr.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 = "SoftwareMicrosoftWindows" & _
   "CurrentVersionApp PathsCEAppMgr.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缺少這兩個屬性:

一個解決方案不能包括不同平台的VB.Net項目(Pocket PC應用程序不能和自定義安裝組件在同一個解決方案中)

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

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

解決方案和項目

C#解決方案包含三個項目:PocketPC App, Custom Installer 和 Setup。PocketPC App項目是一個基於Pocket PC的智能設備應用程序。Custom Installer項目是一個自定義安裝組件。安裝項目把所有的項目打包成一個.msi文件。下面顯示的是C#解決方案。

圖六 包含 PocketPC App, Custom Installer 和 Setup 項目

VB.Net需要兩個解決方案。第一個包括智能設備項目PocketApp。第二個解決方案生成一個.msi文件,包括CustomInstaller, Pre-Build 和 Setup項目。CustomInstaller和Setup項目與C#中的項目相同,預生成項目是一個C++ Makefile項目;預生成項目並不包括任何C++代碼,僅僅用於指定一個預編譯事件。VB解決方案如下圖。

圖七 包含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中指定應用程序圖標。

圖八 在C#中指定應用程序圖標

圖九 在VB.Net中指定應用程序圖標

圖十 顯示在Pocket PC應用程序組中的圖標

CustomInstaller項目

這個組件運行WinCE應用程序管理器,讓其部署.cab文件到Pocket PC設備上。C#和VB.Net的代碼已經早在上文中說明了。

Setup項目

安裝項目生成一個.msi文件包括特定處理器的.cab文件,CustomerInstaller安裝組件和setup.ini文件。CustomerInstaller組件添加進來作為Install和UnInstall自定義動作的響應,如下圖所示

圖十一 添加Install和UnInstall自定義動作的響應

預生成事件

在PocketApp項目生成後,你需要運行BuildCab.bat生成.cab文件。Visual Studio不允許你為C#智能設備項目指定生成後命令事件。所以我們最好為CustomerInstaller項目指定一個預生成命令事件。

圖十二 用一個預生成命令事件去在C#中生成.cab文件

Visual Studio不允許VB.Net項目有任何生成事件,所以我們用一個C++ Makefile工程去定義預生成事件,如下圖所示。

圖十三 用一個C++預生成事件作為VB.Net的解決方法

項目依賴

由於解決方案包含許多工程,所以設置正確的生成順序是很重要的。對於C#,生成順序設置為PocketApp,CustomeInstaller 和 Setup,如下圖所示。

圖十四 為C#解決方案設置生成順序

VB.Net版本包含有兩個解決方案;PocketApp解決方案應首先生成,接下來是PocketPCSetup解決方按。Setup解決方案的生成順序如下圖所示。

圖十五 指定VB.Net解決方案的生成順序

配置管理器

配置管理器用於生成Pocket PC項目在Debug模式和所有的程序在Release模式。就是說,僅為調試應用程序Pocket PC應用程序,你不用經歷整個生成過程。C#版本的配置圖示如下。

這個配置在VB.Net中不需要,因為其中的一個解決方案是對於Pocket PC的,另外一個解決方案用於生成.msi文件。

圖十六 僅生成Pocket PC項目在Debug模式

圖十七 生成所有的項目於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,在SetupRelease文件夾下創建。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved