创建检测和更新Framework 的MSI软件包

 
   前提条件
  要成功生成此示例,需要:  
   Visual Studio .NET 2003  
   Microsoft Platform SDK 的 Microsoft 安装程式部分(http://www.microsoft.com/msdownload/platformsdk/sdkupdate/[英文])  
  用于 Pocket PC SDK 的 Windows CE .NET 或 Windows Mobile(用于 Pocket PC SDK 的 Windows Mobile 2003:http://www.microsoft.com/downloads/details.aspx?familyid=9996b314-0364-4623-9ede-0b5fbb133652&languageid=f49e8428-7071-4979-8a67-3cffcb0c2524&displaylang=en%20[英文])。  
  假如希望修改 SetupHelper.dll 文档,则需要使用适当的 Platform Builder/Embedded Visual C++ 工具来为任何相应的平台进行编译。  
  默认情况下 Makefile 配置为直接从 Visual Studio 目录中拖动 .cab 文档,尽管 Makefile 是为.NET Compact Framework 的 SP1 编写的(SP1 将 ARMV4T cab 替换为 ARMV4I)。为方便起见,示例使用的 SetupHelper.dll 文档包括为 .NET Compact Framework 支持的任何平台编译的二进制文档。
  
   检测 Microsoft .NET Compact Framework
  需要创建一个能够从 MSI 文档作为自定义操作调用的 .dll 文档。  
  首先使用 CeRapiInitEx 连接到设备。  
  然后使用 CeFindAllFiles 在设备的 Windows 目录中搜索 GAC_mscorlib_*.dll。假如存在,表明设备上安装了某种类型的 .NET Compact Framework。  
  查询设备注册表并枚举 HKLM/SOFTWARE/Microsoft/.NETCompactFramework 中的值。将会找到表示 NETCF 的当前版本的注册表键(如 1.0.2268.00:REG_DWORD:0)。这个版本由任何 .cab 安装创建,并将包括在以后任何的 ROM 安装中。在 RTM .NET Compact Framework 的初始 ROM 安装会丢失此键,所以假如没有找到此键,则假定其值为 1.0.2268.0。  
  此时,您就能够知道 .NET Compact Framework 是否存在,连同是否需要将自己的版本部署到此设备。如还需部署 SQL CE 文档,能够使用类似的机制在 Windows 目录下搜索 GAC 库。SQL 安装不向注册表发布其版本信息,因此获得此生成版本的唯一途径便是读取 .dll 文档的 Win32 资源。在示例中,我选择始终安装 SQL .cab(假如需要)。这样比较安全,因为 CE 安装程式将防止将设备中的 SQL 软件包误降级。对于.NET Compact Framework 也能够采用类似的方法。
  
   检测设备类型
  要成功地选择要部署到设备的正确 .cab,您将需要以下信息:Windows CE OS 版本、平台字符串、处理器类型和指令集。现在,无法通过 RAPI 直接获得以上任何信息,因此获取这些信息的唯一途径便是将本机“SetupHelper.dll”文档下载到设备,并通过 CeRapiInvoke 调用他。这有点象母鸡和蛋的问题,如何才能知道要下载哪种本机 .dll 来确定需要哪种 .cab 呢?答案是把任何 .dll 文档都试一遍。假如 .dll 文档不能在设备上运行,则 CeRapiInvoke 将失败。由于这些 .dll 文档大小均为 4k 左右,因此依次尝试每个文档是个比较迅速的操作,并且一般尝试头几个文档即可。以下给出了确定正在处理哪种平台的步骤:  
   CeGetVersionEx 将给出 Windows CE OS 的版本信息。  
  假如该设备为 Windows CE 3.0,可通过 SetupHelper.dll 检索平台字符串。.NET Compact Framework 将只能在基于 Windows CE 3.0 的 PocketPC 上运行,并且 PocketPc 将包含平台字符串“Palm PC2”或“PocketPC”。假如为任何其他值,则表明 Windows CE 3.0 不支持此平台。  
  假如设备为 Windows CE 3.0 和 PocketPC,请调用 CeGetSystemInfo 并使用 dwProcessorType 字段选择相应的平台:
   Platform
Processor Type
x86
386, 486, 586, 686
MIPS
4000, 5000
SH3
10003, 10004, 103
ARM
2577, 1824, 2080, 70001
   基于 Windows CE 3.0 的 PocketPC 的 .cab 文档名为 netcf.core.ppc3.[Platform].cab,即 netcf.core.ppc3.arm.cab。  
  假如设备为 Windows CE 4.1 或更新版本,要正确选择适当的 .cab 文档,需要知道设备指令集(通过 SetupHelper.dll)。
  
Processor
Instruction Set Id
ARMV4
83951616
ARMV4I or ARMV4T
84082688, 84017152
SH3
67174400, 67174401
SH4
67239934
MIPS16
16842752
MIPSII
16908288
MIPSII_FP
16908289
MIPSIV
16973824
MIPSIV_FP
16973825
X86
65537
   Windows CE 4.1+ 的 .cab 文档名为 netcf.all.wce4.[Processor].cab。 
 
   部署到设备
  要对设备调用 .cab 文档,必须调用 wceload.exe,并将此 .cab 文档的完整路径作为命令行参数,使用 CeCreateProcess 可轻松完成操作。但是,由于一般无需同时调用多个 .cab 文档,因此需要等候 wceload 完成,并且不能和使用 CreateProcess 相同在进程句柄上使用 WaitForSingleObject。   
  这是另一个 SetupHelper.dll 能派得上用场的例子。能够对设备进行 WaitFor???... 调用并仅仅阻塞,但这样安装程式将依赖于设备的行为。可改为每隔一秒轮询一次,以确定进程是否结束。这样便能够依次调用需要的任何 .cab 文档,首先调用 .NET Compact Framework,然后调用两个 SQL CE .cab,最后调用应用程式。  
  但应注意,不能确保 wceload 无需干涉。特别是升级 .NET Compact Framework 的 ROM 安装时,设备上可能出现需要用户交互的对话框。因此,最好让 MSI 提醒用户注意设备的变化,或换用 SetupHelper.dll 监控 wceload 进程的弹出窗口,并使用 WIN32 API 按下相应的按钮。  
   在设备上 - Cab 和 GAC
  作为补充,本示例演示了托管应用程式安装的另外两个方面:制作 cab 文档并安装到 GAC。   
  应用程式本身是个简单的“ Hello World”表单,但他包括一个德语附属程式集 .dll,并将其放到设备的全局程式集缓存中。在最初由 Visual Studio 生成时,附属程式集被放置在应用程式下的子目录中,名为 de/MyApp.resources.dll。通常无需将这样的 .dll 文档放在 GAC 中,因为 .NET Compact Framework 支持大多数和桌面相同的探测机制,并将搜索应用程式目录下已本地化的子目录以查找资源。为实现本示例的目的,创建的 .dll 文档相对较简单.  
  附属程式集 .dll 进行了完全签名。这是必须进行的操作,因为 .NET Compact Framework GAC 不支持延迟签名。文档名也从 de/MyApp.resources.dll 重命名为 MyApp.resources.de.dll。这仅仅是为了避免安装程式创建“de”目录。假如创建了此目录,则他将在 .dll 文档移至 GAC 后将被清空。一旦放入了 GAC,他将把最初的名称“MyApp.resources”作为严格名称的一部分。  
  然后,将创建 .gac 文档,该文档带有放置 .cab 文档和移动 .dll 文档的显式路径。我选择的是 /windows/,也能够是 /temp/ 甚至根目录。要紧的是此路径须一致,因此,编写 .gac 安装程式不像生成 .cab 文档那样支持使用 %CE#% 宏。  
  最后,生成 .cab 本身。本示例将 .dll 和 .gac 文档放入 /windows/(.gac 文档“必须”放入 %CE2% 指向的目录中),将应用程式放入 Program Files,并创建相应的快捷方式。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值