WiX:基于另一个自定义操作结果的自定义操作



我对WiX相当陌生,所以可能是我问了一些非常简单的事情,但我找不到太多帮助谷歌搜索它。

我想执行 2 个自定义操作,例如 ca1 和 ca2,其中 ca2 的执行取决于 ca1 的结果,如下所示:

if ( ca1 == SUCCESS )
{
Perform ca2
}

所以 ca2 应该只在我的 ca1 返回成功(不失败(时执行。

在WiX中执行此操作的最简单方法是什么?

您描述的是默认值。如果自定义操作失败,安装将中止,之后只能执行回滚操作。因此,要使问题有意义,首先必须忽略或以其他方式掩盖第一个自定义操作的失败。

其次,一个操作知道另一个操作返回结果的唯一方法是它是否通过调用 MsiDoAction(或其某些包装器(来调用它。这样做会模糊自定义操作之间的界限,因此我将假设这不是您所描述的方案。

这给你留下了第三种也是最后一种方法:找到一个外部沟通渠道。对于立即操作,我建议 ca1 在成功时设置一个属性(调用 MsiSetProperty 或像 DTF 的 session[property] 这样的包装器(,ca2 要么读取 (MsiGetProperty/MsiEvaluateCondition(,要么直接以该属性的值为条件。对于延迟操作,属性不会传播,因此必须标识其他一些通道。(也许提前选择路径的临时文件会起作用。

但是整个场景对于Windows安装程序来说有点不寻常;我建议避免它。也许合并您的操作,以便在冒泡回到序列之前可以"内部"处理任何故障场景。或者,也许您的操作细节可能会导致更具体的建议。

切勿使用即时模式自定义操作对系统进行更改。当具有提升权限的受限用户执行设置时,它们将永远不会正常运行(即时模式操作永远不会提升,它们始终模拟用户,因此您尝试更改的任何内容都将触发访问被拒绝(。此外,它们可能无法在静默执行模式下运行,具体取决于您的排序(例如,如果您尝试从设置 GUI 调用它们(。

Michael Urman 谈到的自定义操作之间的另一个">外部通信通道"可能是 HKLM 中的注册表项,您可以编写该注册表项,然后读回。

但是,真正的解决方案是尝试WiX的内置防火墙功能。它由知识渊博的 MSI 专家可靠地编写,并支持正确的回滚。它将远远优于任何人都可以自己滚动的: http://wixtoolset.org/documentation/manual/v3/xsd/firewall/firewallexception.html

  • 有关在Wix安装程序中添加防火墙例外的问题
  • 在 WiX 中使用防火墙扩展
  • https://www.joyofsetup.com/2008/05/17/new-wix-feature-firewall-extension/

来自此处的WiX文档

<InstallExecuteSequence>
<Custom Action='FooAction1' After='InstallFiles'/>
<Custom Action='FooAction2' After='FooAction1' Condition='FOOACTION1SUCCESS'/>
</InstallExecuteSequence>

让你的代码在FooAction1中设置属性MsiSetProperty('FOOACTION1SUCCESS', '1'( 现在,FooAction2 仅在设置FOOACTION1SUCCESS属性时运行。但实际上迈克尔·乌尔曼的回答是正确的。您应该在一个自定义操作中处理所有异常。

让第一个自定义操作设置属性。然后,仅当该属性存在或设置为预期值时,才运行第二个自定义操作。

相关内容

  • 没有找到相关文章

最新更新