Wix Toolset检测.Net版本时安装条件判断始终为false如何解决
问题根因
Wix 3.11 的默认版本比较逻辑仅支持major.minor.build.revision格式的纯数字版本号。你设备上安装的是带预发布标识的6.0.0-preview.5.21301.5,RegistrySearch读取到的NetVersion会被识别为字符串类型而非版本类型,直接使用<进行比较时执行的是逐字符的字符串比对,而非版本号规则比对,因此判断逻辑始终返回false。
可行解决方案
方案一:提取纯数字版本前缀比较(最简单)
使用Wix Util Extension的StringSearch能力,提取版本号中预发布标识-之前的纯数字部分,再做版本比较,配置示例如下:
注意:需要提前在项目中引用WixUtilExtension,且Wix项目根节点声明
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"命名空间
- 保留你原有的
RegistrySearch配置不变,新增如下节点提取纯净版本号:
<util:StringSearch Source="[NetVersion]" Regex="^(\d+\.\d+(\.\d+){0,2})" Variable="CleanNetVersion" />
- 修改
ExePackage的安装条件,使用处理后的纯净版本号做比较:
<ExePackage SourceFile="D:\somepath\windowsdesktop-runtime-5.0.7-win-x64.exe" Vital="no" PerMachine="yes" InstallCondition="VersionNT64 AND CleanNetVersion < v5.0.7"/>
方案二:自定义动作实现语义化版本比较
如果你需要严格遵循语义化版本规则(比如正确判断预览版低于同编号正式版),可以编写轻量自定义动作:
- 用C#等语言编写自定义动作,将
NetVersion作为入参,使用语义化版本解析库(或.NET内置的Version类、SemVersion类)完成版本比较 - 将比较结果存为布尔类型的变量,直接在
InstallCondition中引用该布尔变量即可
额外注意项
如果.NET 5.0.7运行时是你的软件必填依赖,建议将ExePackage的Vital属性改为yes,避免运行时安装失败时仍继续主程序安装,导致后续运行报错。
内容的提问来源于stack exchange,提问作者Christoph
相关产品推荐
相关产品推荐

