You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wix通过CustomAction设置INSTALLFOLDER路径报2762错误如何解决?

问题原因

错误码2762的触发原因是你将标记了Execute="deferred"的延迟自定义动作放入了InstallUISequence序列中,延迟类型的自定义动作仅允许在InstallExecuteSequence的InstallInitialize和InstallFinalize节点之间运行,UI序列中不支持执行延迟自定义动作。
同时你的配置逻辑存在颠倒:你需要先执行读注册表的自定义动作获取路径,再将路径赋值给安装目录属性INSTALLFOLDER,现有配置的传值逻辑完全不符合需求。

调整方案

方案1:修改现有自定义动作配置

第一步:修改自定义动作定义

删掉无用的传值用CustomAction,将读注册表的自定义动作改为立即执行(只有立即执行的自定义动作可以直接读写会话属性),直接在CA代码中给INSTALLFOLDER赋值:
首先修改C#代码:

string value = Registry.GetValue(userRoot, key, -1).ToString();
// 直接给Wix默认的安装目录属性赋值
session["INSTALLFOLDER"] = value; 

然后修改.wxs文件中的自定义动作配置:

<Binary Id="CustomActionBinary" SourceFile="$(var.ProAdmin_TargetDir)ExtractRegistryPath\bin\Debug\ExtractRegistryPath.CA.dll"/>
<!-- 改为立即执行,不需要deferred属性 -->
<CustomAction Id="ReadInstallPathFromReg" BinaryKey="CustomActionBinary" DllEntry="CustomAction1" Return="check" Execute="immediate"/>

第二步:调整执行序列

自定义动作需要在CostFinalize之前执行(CostFinalize会计算所有目录的最终路径,在此之后修改安装目录属性不生效),同时要覆盖UI安装和静默安装两种场景:

<InstallUISequence>
  <!-- UI安装时执行,放在CostFinalize之前 -->
  <Custom Action="ReadInstallPathFromReg" Before="CostFinalize" />
</InstallUISequence>

<InstallExecuteSequence>
  <!-- 静默安装时执行,放在CostFinalize之前,避免UI序列不执行导致读不到路径 -->
  <Custom Action="ReadInstallPathFromReg" Before="CostFinalize">
    <!-- 避免重复执行 -->
    NOT Installed
  </Custom>
</InstallExecuteSequence>

方案2:用原生Wix能力实现(无需自定义动作,更稳定)

Wix内置了RegistrySearch能力可以直接读取注册表值赋值给属性,完全不需要写自定义动作,避免CA带来的权限、执行时机等问题:

<Property Id="INSTALLFOLDER">
  <!-- 按你的实际注册表路径替换Root、Key、Name属性 -->
  <RegistrySearch Id="SearchTargetAppInstallPath" Root="HKCU" Key="Software\目标软件的注册表路径" Name="InstallLocation" Type="raw" />
</Property>

直接添加这段配置即可自动读取注册表值赋值给INSTALLFOLDER,不需要额外的自定义动作和序列配置。


内容的提问来源于stack exchange,提问作者HyperSmoit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:06:04