为什么 Windows Installer 一次只能安装一个程序?

为什么 Windows Installer 一次只能安装一个程序?

我一直想知道为什么 Windows Installer 只允许您一次安装一个程序。无法启动多个安装非常令人沮丧,尤其是在设置新 Windows 安装时。这是什么原因呢?

答案1

当同时进行安装时,保证正确性将非常复杂 - 假设它们共享一些文件。这将需要某种形式的交易。

  • 您需要锁定文件
  • 如果安装失败,应该可以撤消中间更改(不确定现在可以吗?)

这些概念来自事务数据库 - 但这个话题并不简单,而且您通常无法在文件系统中找到完全事务性的基础结构(即使日志文件系统提供了其中的一部分)。一个问题是,多个锁可能导致死锁 - 那么您需要死锁检测(否则两个安装程序都会永远挂起),以及一种处理它的方法。可以避免死锁(例如,通过始终以相同的顺序锁定文件),但还有其他问题:

如果您预先锁定所有必需的文件,那么您实际上得到的结果是:一个安装程序必须等待另一个安装程序完成。如果您不预先锁定所有必需的文件并继续进行,则“事务”可能会失败。这意味着,其中一个安装程序必须重新启动。

然后你可能不得不考虑事务隔离级别——要完全正确,你的事务必须是“可序列化”- 但这并不容易,即使对于许多数据库来说也是如此。

甚至可能存在解决这些问题的替代策略,从而绕过完全隔离,但证明其正确性通常更加困难。

我相信,如果使用并发安装,我们将面临更多棘手的安装后问题 - 尤其是因为我不认为操作系统供应商(或发行版)会不遗余力地确保其 100% 清洁。因此,即使操作系统提供了并发安装,我也宁愿不使用它。

笔记

但也许您真正想要的甚至不是“同时”安装。如果您可以将安装排队,然后一个接一个地执行(理想情况下,中间不会询问任何问题),那么这也许就足够了。这确实是一件好事,其他一些操作系统(发行版)处理得更好。

答案2

这是设计使然,为了避免两个安装操作相同的文件/文件夹/注册表项/等等;它可能可以通过不同的方式完成,但微软做出了这个选择。

答案3

并发:您可以使用批处理文件快速依次启动多个 MSI 文件进行安装。您不能同时运行两个 MSI 文件,因为它们会同时写入磁盘。

交易与回滚:原因是 MSI 安装的一部分是作为“事务”运行的 - 一系列更改,这些更改要么提交,要么回滚,具体取决于事务列表中的操作是否无错误完成。所有操作都必须无错误完成,然后事务才会提交,否则将完全回滚所有更改。因此,在任何给定时间只能有一个这样的事务处于活动状态。

技术序列:在技术 MSI 级别,只有标准操作之间的操作InstallInitializeInstallFinalize在里面InstallExecuteSequence作为事务运行。除了这些操作之外,不应发生任何系统更改,但有时 MSI 文件被错误地设计为在其他序列中进行更改。


链接

相关内容