我正在使用 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
这是令人困惑的部分:最初我有一个工作版本,我没有ActionResult.Failure
在Catch
块中返回的行。换句话说,该函数仍然记录失败,但Success
即使抛出异常最终也会返回。我觉得这有点误导,因为有时当发生异常并且我检查日志时,它会说自定义操作成功。这就是我添加该行的原因
Return ActionResult.Failure
但是,现在它不再起作用了!每当我安装时,我发现我的CommitCA
永远不会被执行。注意:不是InstallCA
我所做的唯一代码修改的 ,而是CommitCA
实际安排在InstallCA
. 当我说“永远不会被执行”时,我的意思是我找不到任何放在函数调用中的日志条目,并且MMSIBREAK
环境变量甚至根本不起作用(通知我附加到 rundll32 进程的窗口永远不会弹出)。但是以下InstallCA
仍然被执行。
如果我注释掉这条线Return ActionResult.Failure
,一切都会再次起作用:我可以附加进入CommitCA
并被InstallCA
调用。
关于自定义操作的返回结果,我可能有一些误解。ActionResult.Failure
在这种情况下我不应该回来吗?但实际上我ActionResult.Failure
也在其他一些地方返回。事实上,在CommitCA
函数本身中,我使用了相同的结构:ActionResult.Failure
在Catch
块中返回。那么有人能告诉我我做错了什么吗?