Wix安装程序中如何仅比较版本号第四位?移除前三位遇格式错误求解
实现Wix安装程序仅比较版本号第四位的方法
首先明确:Wix的Product/@Version属性必须严格遵循x.x.x.x格式,每段数值范围为0到65534,直接移除前三位会触发格式错误。要实现仅比较版本号第四位的需求,需通过自定义逻辑绕开默认版本比较规则,以下是两种可行方案:
方案一:自定义动作(CustomAction)控制升级流程
保持完整合法的版本号,通过自定义代码仅比较第四位,决定是否执行升级:
- 定义Upgrade元素查找已安装产品
在Wix项目中添加Upgrade元素,用于检测所有已安装的同产品版本:
<Upgrade Id="你的产品升级GUID"> <UpgradeVersion Minimum="0.0.0.0" Maximum="99.99.99.99" Property="OLD_VERSION_FOUND" IncludeMinimum="yes" IncludeMaximum="no" /> </Upgrade>
- 编写自定义动作代码
用C#编写自定义动作,提取已安装版本和当前版本的第四位进行比较:
[CustomAction] public static ActionResult CompareRevision(Session session) { string installedVersionStr = session["OLD_VERSION_FOUND"]; if (string.IsNullOrEmpty(installedVersionStr)) return ActionResult.Success; Version installedVersion = new Version(installedVersionStr); Version currentVersion = new Version(session["ProductVersion"]); // 比较版本号第四位(Revision段) if (currentVersion.Revision > installedVersion.Revision) { session["ALLOW_UPGRADE"] = "1"; } else { session["ALLOW_UPGRADE"] = "0"; } return ActionResult.Success; }
- 配置自定义动作和执行顺序
引用编译好的自定义动作DLL,安排在FindRelatedProducts之后执行,控制RemoveExistingProducts的触发条件:
<Binary Id="CustomActionsDll" SourceFile="你的自定义动作DLL路径" /> <CustomAction Id="CompareRevision" BinaryKey="CustomActionsDll" DllEntry="CompareRevision" Execute="immediate" /> <InstallExecuteSequence> <Custom Action="CompareRevision" After="FindRelatedProducts">OLD_VERSION_FOUND</Custom> <RemoveExistingProducts After="InstallInitialize">ALLOW_UPGRADE = "1"</RemoveExistingProducts> </InstallExecuteSequence>
方案二:固定前三位版本号(简易版)
如果业务允许将版本号前三位固定为相同值(比如0.0.0.xxxx),可直接利用Wix默认版本比较逻辑:
- 将所有版本的前三位设为固定值,例如当前版本
0.0.0.1941,旧版本0.0.0.4203 - Wix会自动比较完整版本号,由于前三位完全相同,实际效果就是仅比较第四位大小,无需额外自定义逻辑
注意事项
- 版本号第四位对应
Version类中的Revision属性,若你的版本号结构中第四位是Build段,需调整代码中比较的属性 - 自定义动作需编译为符合Windows Installer规范的DLL,确保在目标系统上兼容
内容的提问来源于stack exchange,提问作者Manish
相关产品推荐
相关产品推荐

