【问题标题】:Windows Installer custom actions: commit action won't get executedWindows Installer 自定义操作:不会执行提交操作
【发布时间】:2013-10-28 21:31:29
【问题描述】:

我正在使用 WIX 设计一个 Windows 安装程序项目。现在它在安装中失败了,因为不会执行 Commit 自定义操作,这很奇怪,因为预定的后续自定义操作有一个返回 ActionResult.Success 的路由。让我详细解释一下:

基本上,我有两个关于安装的自定义操作:一个称为 CommitCA,另一个称为 InstallCA。执行时间表如下:

<CustomAction Id="CommitCA" BinaryKey="CustomActionDll" DllEntry="CommitCA" Execute="commit" Return="check" Impersonate="no"/>
<CustomAction Id="InstallCA" BinaryKey="CustomActionDll" DllEntry="InstallCA" Execute="deferred" Return="check" Impersonate="no"/>

我已从 ORCA 验证,在编译的安装程序中,CommitCA 安排在 InstallCA 之前。 CommitCA 的类型是 3585,InstallCA 是 3703(我找不到对它们的引用,但我假设一个用于提交操作,另一个是我声明的延迟操作)。这个想法是在 CommitCA 中,它将生成一些将由 InstallCA 使用的文件。

我的InstallCA 的结构是这样的:

Try
    ' Do some work
    ...

Catch ex As Exception
    ' Log the failure into installation log
    Return ActionResult.Failure
End Try
Return ActionResult.Success

这是令人困惑的部分:最初我有一个工作版本,我没有在 Catch 块中返回 ActionResult.Failure 的行。换句话说,该函数仍然记录失败,但即使抛出异常,最终也会返回Success。我觉得这有点误导,因为有时当发生异常并且我检查日志时,它会说自定义操作成功。这就是我添加该行的原因

        Return ActionResult.Failure

但是,现在它不再起作用了!每当我安装时,我发现我的CommitCA 永远不会被执行。注意:不是InstallCA,它有我所做的唯一代码修改,而是CommitCA,它实际上是在InstallCA 之前安排的。当我说“永远不会被执行”时,我的意思是我找不到任何放在函数调用中的日志条目,而且MMSIBREAK 环境变量甚至根本不起作用(通知我附加到rundll32 进程永远不会弹出)。但是下面的InstallCA 仍然会被执行。

如果我注释掉 Return ActionResult.Failure 行,一切都会恢复正常:我可以附加以进入 CommitCA 并且 InstallCA 也会被调用。

我对自定义操作的返回结果可能有一些误解。在这种情况下我不应该返回ActionResult.Failure 吗?但实际上我也在其他一些地方返回ActionResult.Failure。事实上,在CommitCA 函数本身中,我使用了相同的结构:在Catch 块中返回ActionResult.Failure。那么有人能告诉我我做错了什么吗?

【问题讨论】:

    标签: wix windows-installer custom-action


    【解决方案1】:

    我会从阅读开始:

    Installation Phases and In-Script Execution Options for Custom Actions in Windows Installer

    关于提交 CA 的一些需要了解的事情:

    提交自定义操作通常并不意味着更改机器的状态。它们旨在清理回滚临时数据。

    如果回滚被禁用(通过属性或系统策略),则不会执行提交自定义操作,因为这意味着没有要清理的回滚数据。

    当无法进行回滚并且您希望尽可能晚地推迟更改时,有时会使用提交自定义操作来配置机器。 (更改用户密码,将 DLL 安装到 GAC )在这些情况下,成本核算应指示延迟的自定义操作来完成工作,因为回滚/提交永远不会执行。

    回滚自定义操作应安排在延迟自定义操作之前,提交操作应安排在延迟自定义操作之后。这样脚本生成阶段才能正确创建脚本。

    如果延迟阶段失败,脚本将向后走,以便执行回滚。

    如果所有延迟阶段都成功,则提交脚本将向前执行。这意味着所有延迟的 CA 必须在任何提交执行之前完成。

    【讨论】:

    • 感谢您的回复。所以我不应该在任何延迟 CA 之前安排提交 CA? (当然我不应该让那里的 CommitCA 完成当前的工作)。我想这是有道理的,因为“提交”听起来应该是在安装 CA 之后。而且我想我应该将所有当前的工作转移到 InstallCA
    • 让我换个说法。不要在相应的延迟 CA 之前安排它。其他 CA 很好,因为所有提交都在其他延迟 ca 之后的另一个阶段运行。
    猜你喜欢
    • 2010-09-11
    • 2012-08-26
    • 2013-03-31
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多