使用WiX Bootstrapper检测.NET Runtime版本失效,寻求修复方案
.NET 6 Runtime版本检测问题排查与修复
问题排查
你的配置无法正常工作,核心问题集中在以下几点:
注册表路径错误
你当前搜索的是Microsoft.WindowsDesktop.App(桌面应用运行时),但需求是检测通用.NET 6 Runtime(对应Microsoft.NETCore.App),两者注册表路径完全不同。另外,Wow6432Node仅适用于32位安装包访问64位注册表,若你的安装包是64位,无需添加该节点;若为32位,需同时覆盖32位和64位.NET Runtime的搜索路径。缺失
DotNetVersionMin属性定义
自定义动作代码中依赖DotNetVersionMin变量,但你未在WiX代码中声明并初始化该属性,导致Version.TryParse解析失败,自定义动作直接返回Failure,后续条件判断逻辑完全失效。自定义动作执行顺序未配置
你未指定自定义动作的执行时机,若动作在注册表搜索前运行,DOTNETVERSION变量为空,会直接触发解析失败的分支。条件判断逻辑不完整
若自定义动作执行失败(如未找到.NET Runtime),WIX_DOTNET_VERSION_COMPARE变量未被赋值,条件判断会因变量不存在而无法正确执行。
修复方案
1. 修正注册表搜索配置
针对.NET 6 Runtime(Microsoft.NETCore.App)调整路径,同时支持32位和64位环境:
<Fragment> <!-- 声明并初始化必要属性 --> <Property Id="DOTNETVERSION" Secure="yes" /> <Property Id="DotNetVersionMin" Value="6.0.0" Secure="yes" /> <!-- 64位系统下搜索64位.NET Runtime --> <util:RegistrySearch Id="DotNetVersionSearchX64" Variable="DOTNETVERSION" Root="HKLM" Key="SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedfx\Microsoft.NETCore.App" Value="Version" Result="value" Win64="yes" /> <!-- 32位系统或64位系统下的32位.NET Runtime --> <util:RegistrySearch Id="DotNetVersionSearchX86" Variable="DOTNETVERSION" Root="HKLM" Key="SOFTWARE\Wow6432Node\dotnet\Setup\InstalledVersions\x86\sharedfx\Microsoft.NETCore.App" Value="Version" Result="value" Win64="no" /> </Fragment>
2. 配置自定义动作执行顺序
确保动作在注册表搜索完成后、启动条件检查前执行:
<InstallExecuteSequence> <Custom Action="CheckDotNetVersion" After="CostInitialize" /> </InstallExecuteSequence> <InstallUISequence> <Custom Action="CheckDotNetVersion" After="CostInitialize" /> </InstallUISequence>
3. 优化自定义动作逻辑
增加空值处理,避免因未找到.NET Runtime导致动作失败:
[CustomAction] public static ActionResult CheckDotNetVersion(Session session) { string dotNetVersion = session["DOTNETVERSION"]; string dotNetVersionMin = session["DotNetVersionMin"]; // 未找到.NET Runtime,直接标记版本不满足 if (string.IsNullOrEmpty(dotNetVersion)) { session.Log("No .NET Runtime found on the machine."); session["WIX_DOTNET_VERSION_COMPARE"] = "-1"; return ActionResult.Success; } Version version; Version versionMin; if (!Version.TryParse(dotNetVersion, out version)) { session.Log("Failed to parse installed .NET version string."); session["WIX_DOTNET_VERSION_COMPARE"] = "-1"; return ActionResult.Success; } if (!Version.TryParse(dotNetVersionMin, out versionMin)) { session.Log("Failed to parse minimum required .NET version string."); session["WIX_DOTNET_VERSION_COMPARE"] = "-1"; return ActionResult.Success; } int result = version.CompareTo(versionMin); session["WIX_DOTNET_VERSION_COMPARE"] = result.ToString(); session.Log($"Version comparison result: {result}"); return ActionResult.Success; }
4. 修正启动条件判断
确保覆盖所有场景的判断逻辑:
<bal:Condition Message="This setup requires Microsoft .NET 6.0 Runtime or above. Please install it first."> <![CDATA[Installed OR (WIX_DOTNET_VERSION_COMPARE >= 0)]]> </bal:Condition>
内容的提问来源于stack exchange,提问作者Aditya Dalai
相关产品推荐
相关产品推荐

