如果在 InstallExecuteSequence 上执行,则类型 2 自定义操作无法在 InstallUISequence 上执行

A type 2 Custom Action is failing to execute on InstallUISequence while it is executed if put on InstallExecuteSequence

我有一个类型 2 自定义操作,它正在执行一个带参数的可执行文件。 我需要在 InstallWelcome 对话框之前执行此 CA,因为它用于收集一些信息以便稍后预填充对话框。 因此,我在 InstallUISequence 中的 CostFinalize 操作之后对该 CA 进行了排序,但安装程序无法执行它并出现如下错误。

如果我在 InstallExecuteSequence 序列中移动 CA,它会按预期执行。 (正如后面的评论中所解释的那样,这不是真的,它在这个序列中也失败了)。

有人知道会发生什么吗?

可能有用的信息:如果在 Type 18 自定义操作中使用相同的可执行文件(可执行文件与应用程序的二进制文件一起安装),则执行没有问题。

<CustomAction Id='RunEXE' BinaryKey='EditCfg.exe.CA.ID' ExeCommand='[INSTALLFOLDER][SEPARATOR][CONFIG_FILE_NETWORK_LOCATION][SEPARATOR][USER_NAME][SEPARATOR][PASSWORD][SEPARATOR][WIX_UPGRADE_DETECTED][SEPARATOR][CHECKED_RULE][SEPARATOR][CERTIFICATE_LOCATION]' Execute='immediate' Impersonate='no' Return='check' />

<Binary Id='EditCfg.exe.CA.ID' SourceFile='path_to_the_exe_file'/>


MSI (c) (14:04) [15:18:36:452]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 1722 
Error 1722. There is a problem with this Windows Installer package. A program run as part of the setup did not finish as expected. Contact your support personnel or package vendor.  Action RunEXE, location: C:\Users\yyyyy\AppData\Local\Temp\MSIC8A9.tmp, command: param1§param2§param3§§param5§§param7

1722 错误表示 exe return 退出代码非零。如果这是预期的,您可以更改 Return attribute 以使用 ignore 而不是 check。但如果不是预期的,您可能需要弄清楚 return 代码表示什么,因为它很可能是某种故障。

以下是一些可能导致失败的事情:

  • exe文件可能有一些依赖关系。仅将 exe 放入二进制文件 table 中不会携带它的依赖项,因此尝试加载和 运行 exe 可能会失败,甚至在它到达 exe 的主代码之前,这取决于种类依赖性。
  • 当作为与产品一起安装的文件执行时,截至自定义操作执行时,该文件可能不存在于指定位置。安装期间,新文件直到 InstallFiles 之后的 deferred/in-script 操作(或 InstallExecute 之后的常规调度)才会显示;在卸载过程中,它们通常会被 RemoveFiles 消失。维护可以是这些的组合。但是,缺少 exe 可能会导致 1721 错误而不是 1722 错误。

无论如何,请注意 exe 自定义操作无法将有用的数据传回 Windows 安装程序会话,因此如果没有借助其他基于 DLL 的操作或系统搜索。如果您还添加了一个基于 DLL 的操作,您可能会发现从该操作启动 exe 更友好(或者甚至将它所做的完全合并到 dll 中),因为您可以记录比您看到的通用诊断更好的诊断这里。