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
相关产品推荐
相关产品推荐

