重启管理器:The Restart Manager Feature of Windows (Installer)(middle page) is designed to help restart applications automatically during installation rather than requiring a reboot。
- 应始终使用此功能来尝试消除重新启动要求。
- 只有在非常特殊的情况下才真正需要重新启动。
技术速成课程:这是在您的应用程序中实施 Restart Manager 的技术花絮和建议 - 来自 Advanced Installer,制造商领先的部署工具:
更新:MSI Expert Phil Wilson on Restart Manager(对于某些 Restart Manager 现实检查 - 请阅读)。
为 ScheduleReboot 添加条件
您需要按照此处描述的内容为您的ScheduleReboot 条目插入一个条件:https://www.firegiant.com/wix/tutorial/events-and-actions/extra-actions/(链接的文章可能显示的条件有点过于包容或不受限制)。
更新:有一些问题需要考虑:
-
意外操作:除非确实有必要,否则绝不应使用 ScheduleReboot。例如,如果您尝试替换正在使用的文件,MSI 将在不调用 ScheduleReboot 的情况下处理该问题。
-
多种安装模式:如果没有适当的条件,ScheduleReboot 将导致在多种安装模式下出现重启提示:安装、卸载、升级、修复、自我- 修复、修补等...这是不可取的。
-
静默、即时重启:如果 MSI 在静默模式下运行且未指定 REBOOT=ReallySuppress,ScheduleReboot 操作将自动触发计算机的即时重启有问题 - 这可能非常令人惊讶且非常不受欢迎。
出于您的目的,您或许可以使用以下条件:
<InstallExecuteSequence>
<ScheduleReboot After='InstallFinalize'>NOT Installed AND NOT WIX_UPGRADE_DETECTED</ScheduleReboot>
</InstallExecuteSequence>
这完全取决于您是要在重大升级期间安排重启,还是仅在原始的全新安装期间安排重启?信息。像NOT Installed AND NOT REMOVE~="ALL" 这样的普通情况似乎会在重大升级期间安排重新启动,但不适用于不是由重大升级触发的手动卸载(我会在有机会时进行测试 - 更新:经过验证,仅限基本测试)。
请注意,特殊的 WIX_UPGRADE_DETECTED 属性是 WiX-specific construct,只有在使用 WiX 的 MajorUpgrade 元素时才能设置。您也可以set up major upgrades the old fashioned way in WiX 并避免使用 MajorUpgrade 元素“便利功能”,它允许使用更少的选项更轻松地配置主要升级 - “自动魔术”。我没有验证WIX_UPGRADE_DETECTED 是否仍然使用这种“老派”主要升级配置进行设置。
您还可以使用 Upgrade table 中的 ActionProperty 来检测“即将发生”重大升级 (see this answer for a sample)。这甚至适用于非 WiX MSI 设置 - 因此应该是 WIX_UPGRADE_DETECTED 的替代品(我相信此属性是在 FindRelatedProducts 运行后设置的)。
WIX_UPGRADE_DETECTED 与 UPGRADINGPRODUCTCODE
在主要升级期间卸载的 MSI 软件包将设置特殊属性 UPGRADINGPRODUCTCODE(不会在升级期间安装的 MSI 中设置)。这是一个内置的 MSI 属性,而不是特定于 WiX 的构造。换句话说,在重大升级期间 - 卸载旧版本并安装新版本 - 正在卸载的 MSI 将设置属性 UPGRADINGPRODUCTCODE,而正在安装的 MSI 将设置属性 WIX_UPGRADE_DETECTED (我将很快验证这一点)。在标准操作FindRelatedProducts 运行后,它还将具有来自升级表设置的 ActionProperty。
如果这听起来很复杂,那么恐怕就是这样。这是 Windows Installer 的一个关键问题 (despite the technology's major corporate benefits) -
基本的、关键的操作——比如升级——有时很难正确处理。 the principle of least astonishment 可能存在一些违规行为。所有技术都有好有坏 - 很明显。
特别注意事项
请注意,无论ScheduleReboot action 是否被抑制,都可能会启动重新启动(例如,如果存在无法替换的文件 - 或更糟糕的是:自定义操作通过代码强制重新启动 - 这总是错误的,应该安排重启而不是通过代码强制)。
您可以使用REBOOT property(您已经阅读过的内容)来禁止某些系统重启提示。 More on System Reboots.
MSI 条件
要正确处理 MSI 条件可能非常棘手。弄错了,您的操作会在错误的安装模式下意外运行 - 或者它在应该运行的时候根本没有运行。这比你想象的更容易出错——即使有经验。证据就在这里,现实生活中的测试。以下是一些复杂条件的示例:Wix Tools update uses old custom actions(以防万一)。
当您尝试使用复杂条件(或任何与此相关的条件)时,您应该测试多种安装模式:1. fresh install、2. repair、3. modify、4. self-repair、5. patching、@987654360 @、7. major upgrade invoked uninstall 等...还有一些奇怪的模式,例如以RESUME property 为特色的恢复暂停安装,以及与ForceReboot action 相关的AFTERREBOOT property 等...人们应该记住的事情是很少测试。
这里有两个用于调节的“备忘单”:
我没有时间检查所有这些条件并对其进行测试,但后一张表从表面上看是合理的。但是:我相信REMOVE 有时可以在安装期间(和更改期间)设置。由于 MSI 的命令行界面和属性配置非常灵活,因此处理所有可能性排列非常复杂。 Installed 也没有为作为主要升级的一部分安装的新 MSI 版本设置,但它将为正在卸载的 MSI 版本设置 - 非常混乱。
Installshield 备忘单 我从未积极使用或检查过,但我发现他们对repair 的建议至少可以说很有趣 - 根据调用修复的方式,有不同的条目。
请记住还要检查自我修复 - 只需删除主应用程序 EXE 并通过调用应用程序的广告快捷方式(如果有)来触发自我修复。我检查已经有好几年了,但自我修复可能只在 InstallInitialize 和 InstallFinalize 之间运行操作。您不想在自我修复期间安排重启。