65.9K
CodeProject 正在变化。 阅读更多。
Home

创建本地化的 Windows Installer 和引导程序:第 2 部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.17/5 (3投票s)

2010年8月22日

CPOL

4分钟阅读

viewsIcon

36630

downloadIcon

184

本系列文章是使用一些实际需求构建可本地化 Windows Installer & Bootstrapper 的完整端到端解决方案。

引言

第 1 部分 中,我们研究了使用 Wix 创建 Windows 安装程序所需的步骤,该程序动态打包来自目标 .NET 应用程序的二进制文件,以供部署。 在本部分中,我们将研究向安装程序添加一些条件检查,以防止用户在未满足某些条件的情况下安装该软件。

在我们的解决方案中,我们将为以下内容创建条件检查

  • 仅在 Windows 7 上安装
  • 仅在安装 Microsoft .NET Framework 4 Client Profile 的情况下安装
  • 仅在 Dell 硬件上安装

Wix 提供了多种方法来添加条件检查,例如使用注册表或文件系统搜索。 当条件元素作为 Project 元素的子节点添加时,它仅在满足条件时才允许安装。 如果不是,安装将以给定的错误消息终止。

Windows 7 条件

要添加一个条件,以防止用户在 Windows 7 以外的 Windows 版本上安装该应用程序,我们可以利用 Windows 安装程序填充的一些现有属性。 这些是 VersionNTWindowsBuild 属性。 如果我们查看 操作系统属性值 的文档,我们发现检测 Windows 7 所需的值是 VersionNT 601 并且 WindowsBuild 大于 7100。

要实现此条件,我们将以下元素添加到 Project 节点中的 Main.wxs 文件中。

<Condition Message='[ProductName] can only be installed on Windows 7' >
  VersionNT = 601 AND WindowsBuild >

结果是安装程序现在将仅在运行 Windows 7 的设备上安装该应用程序,否则会抛出一个错误并且安装终止。

Microsoft .NET Framework 4 Client Profile 条件

第 1 部分 中使用的 WixNetFxExtension.dll 扩展提供了一组与 .NET Framework 相关的有用实用程序,其中包括可用于检测当前已安装的 .NET Framework 版本的属性。

不幸的是,框架版本 3.0 不包括用于检测 .NET 4.0 的属性,并且仅在 Wix 3.5 中可用。 幸运的是,检测是否安装了特定版本的框架并不难,我们可以使用一个简单的注册表搜索,如下所示

<Property Id="NETFRAMEWORK40CLIENT">
   <RegistrySearch Id="NetFramework40Client" 
      Root="HKLM" 
      Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" 
      Name="Install"
      Type="raw" />
</Property>

如果找到注册表项,则此属性将填充名为 NETFRAMEWORK40CLIENT 的属性,其值为 1 。 使用此方法,我们就可以实现条件检查。 如果随后删除了框架,我们将在卸载时跳过条件检查。

<Condition Message="[ProductName] requires the Microsoft .NET Framework 4 Client Profile">
    Installed Or NETFRAMEWORK40CLIENT
</Condition>

Dell 硬件条件

要实现硬件检查,我们需要执行 WMI 查找以确定硬件制造商。 要将 WMI 值放入 Windows 安装程序中,以便我们可以实现条件,我们需要使用自定义操作。

有多种方法可以实现自定义操作。 为简单起见,在这种情况下,我们将使用一个嵌入的 VBScript,名为 WMIQuery.vbs。 该脚本将执行 WMI 查找,并将其插入安装程序中作为名为 WMI_Manufacturer 的属性。

首先,我们使用 Binary 元素添加对 WMIQuery.vbs 文件的引用。 然后,我们定义一个自定义操作,它将调用脚本中的一个函数,并将其安排在 InstallExecuteSequenceInstallUISequence 序列中的 AppSearch 之后运行。 这使得该属性在安装期间运行条件检查之前可用。

新代码看起来像这样

<Condition Message='This application cannot be installed on this hardware.'>
  <![CDATA[
    SKIPCHECK 
    OR Installed 
    OR WMI_Manufacturer >< "dell"
  ]]>
</Condition>

<CustomAction Id="WMIQuery" Return="check" BinaryKey="WMIQuery" VBScriptCall="Main" />
<Binary Id="WMIQuery" SourceFile="Binary\WMIQuery.vbs" />

<InstallExecuteSequence>
  <Custom Action="WMIQuery" After="AppSearch" />
</InstallExecuteSequence>

<InstallUISequence>
  <Custom Action="WMIQuery" After="AppSearch" />
</InstallUISequence>

请注意条件检查对包含 string 运算符 >< 的使用。 运算符字符必须在 CDATA 块中转义,以防止与 XML 相关的验证问题。 我们还添加了一个名为 SKIPCHECK 的覆盖属性,它允许我们从命令行运行时覆盖硬件条件以进行测试。 为此,我们按如下方式执行 MSI

msiexec /i setup.msi SKIPCHECK=1

摘要

到目前为止,在本系列中,我们研究了使用 Wix 创建 Windows 安装程序,该程序动态打包 .NET 应用程序并对安装期间的程序集应用 NGen。 现在,我们还添加了一些条件,以防止应用程序在特定情况下使用一系列技术安装。 在 第 3 部分 中,我们将研究本地化安装程序,并使用用户的区域设置提供自动语言检测。

历史

  • 2010年8月22日:初始发布
© . All rights reserved.