为Wix Toolset添加Click Through功能实现更新提示
实现Wix MSI更新提示的可行方案
你提到的"Click Through"并非Wix内置的官方功能,Wix本身的MSI包不具备主动检查更新并提示的能力,要实现更新提示,主要有两种可靠方案,结合你的现有代码,具体实现如下:
方案一:在应用程序内添加更新检查(推荐)
这种方式更灵活,用户启动solutions.exe时自动检查服务器上的最新版本,若有更新则提示下载安装,步骤如下:
在
solutions.exe中编写版本检查逻辑:- 读取当前程序集版本(可通过
Assembly.GetExecutingAssembly().GetName().Version获取) - 从你的服务器获取最新版本信息(比如一个JSON文件)
- 对比版本号,若服务器版本更高,弹出提示框引导用户下载最新MSI安装包
- 读取当前程序集版本(可通过
确保MSI支持无缝升级:
你的代码中已经包含<MajorUpgrade>元素,这是实现版本替换的核心,需要注意两点:- 每次发布新版本时,必须修改
Product元素的Version属性(至少提升第三位,比如从1.0.0.0改为1.0.1.0) - 保持
UpgradeCode属性不变,这是Wix识别同一产品系列的唯一标识,不能随版本更改
- 每次发布新版本时,必须修改
方案二:使用Wix Burn引导程序实现安装前更新检测
如果希望用户运行安装程序时自动检查更新,可以用Wix的Burn引导程序,它能在安装前检测服务器上的最新安装包,自动下载并升级:
实现步骤:
- 创建Wix Bootstrapper项目,在引导程序的
.wxs文件中添加以下代码:
<?xml version="1.0" encoding="UTF-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"> <Bundle Name="Solutions Testing" Version="1.0.0.0" Manufacturer="MyCompany" UpgradeCode="固定的GUID"> <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" /> <!-- 配置更新检查 --> <bal:WixStandardBootstrapperApplication DetectCondition="NOT Installed OR (Version < v1.0.1.0)" /> <bal:UpdateUrl Url="http://你的服务器地址/updates/feed.xml" /> <!-- 引用你的MSI包 --> <Chain> <MsiPackage SourceFile=".\SolutionsTesting.msi" /> </Chain> </Bundle> </Wix>
- 在服务器上创建更新feed文件
feed.xml,包含最新版本信息:
<?xml version="1.0" encoding="utf-8"?> <Feed xmlns="http://schemas.microsoft.com/wix/2011/feed"> <Bundle Name="Solutions Testing" Version="1.0.1.0" Manufacturer="MyCompany"> <Payload Url="http://你的服务器地址/updates/SolutionsTesting_v1.0.1.msi" /> </Bundle> </Feed>
针对你现有代码的优化
你的MSI代码已经具备基础升级能力,这里有两处修正建议:
- 修正产品图标属性(原代码中
ARPPRODUCTION拼写错误,应为ARPPRODUCTICON):
<Icon Id="favicon.ico" SourceFile="$(var.ProjectDir)images\favicon.ico"/> <Property Id="ARPPRODUCTICON" Value="favicon.ico" />
- 优化
<MajorUpgrade>配置,增强升级安全性:
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." AllowDowngrades="no" AllowSameVersionUpgrades="no" Schedule="afterInstallInitialize" />
总结
- 应用内检查更新更适合日常使用场景,用户启动软件时就能收到提示
- Burn引导程序适合安装环节的更新检测,确保用户安装的是最新版本
- 无论哪种方案,
UpgradeCode必须固定,ProductVersion每次更新都要提升
内容的提问来源于stack exchange,提问作者Motty
相关产品推荐
相关产品推荐

