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






4.17/5 (3投票s)
本系列文章是使用一些实际需求构建可本地化 Windows Installer & Bootstrapper 的完整端到端解决方案。
- 第 1 部分:介绍 & 设置
- 第 2 部分:定义条件
- 第 3 部分:本地化
- 第 4 部分:提供先决条件
引言
在 第 1 部分 中,我们研究了使用 Wix 创建 Windows 安装程序所需的步骤,该程序动态打包来自目标 .NET 应用程序的二进制文件,以供部署。 在本部分中,我们将研究向安装程序添加一些条件检查,以防止用户在未满足某些条件的情况下安装该软件。
在我们的解决方案中,我们将为以下内容创建条件检查
- 仅在 Windows 7 上安装
- 仅在安装 Microsoft .NET Framework 4 Client Profile 的情况下安装
- 仅在 Dell 硬件上安装
Wix 提供了多种方法来添加条件检查,例如使用注册表或文件系统搜索。 当条件元素作为 Project
元素的子节点添加时,它仅在满足条件时才允许安装。 如果不是,安装将以给定的错误消息终止。
Windows 7 条件
要添加一个条件,以防止用户在 Windows 7 以外的 Windows 版本上安装该应用程序,我们可以利用 Windows 安装程序填充的一些现有属性。 这些是 VersionNT
和 WindowsBuild
属性。 如果我们查看 操作系统属性值 的文档,我们发现检测 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 文件的引用。 然后,我们定义一个自定义操作,它将调用脚本中的一个函数,并将其安排在 InstallExecuteSequence
和 InstallUISequence
序列中的 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日:初始发布