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

Ryt*_*tis 10 windows-installer

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

Mas*_*imo 7

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


Chr*_*her 6

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

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

这些概念是从事务数据库中得知的 - 但这个主题并不是微不足道的,你通常不会在文件系统中找到一个完整的事务基础设施(即使日志文件系统提供了其中的一部分)。一个问题是,多个锁可能导致死锁——那么您需要检测死锁(或者两个安装程序都将永远挂起),以及一种处理这种情况的方法。可以避免死锁(例如,始终以相同的顺序锁定文件),但还有其他问题:

如果您预先锁定所有必需的文件,您就可以有效地获得所拥有的:一个安装程序必须等待另一个安装程序完成。如果您不预先锁定所有必需的文件,并继续前进,则“交易”将面临失败的风险。这意味着必须重新启动其中一个安装程序。

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

甚至可能有其他策略来处理这些问题,这些策略可以绕过完全隔离,但通常更难证明它们的正确性。

我相信,通过并发安装,我们会遇到更多棘手的安装后问题——尤其是因为我不认为操作系统供应商(或发行版)会经历所有麻烦以使其 100% 干净。所以我宁愿不使用它,即使它是由操作系统提供的。

笔记

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

  • 虽然正确,但在我看来这个答案太冗长了。有人问为什么安装程序服务以这种方式工作,他不太可能理解这个答案。 (2认同)
  • @gWaldo:好吧,也许你是对的......再说一次,我不想说“这很复杂,相信我(句号)。反正你也不会理解它”。也许 OP(或其他在这个问题上磕磕绊绊的人)真的很感兴趣,深入问题的答案将帮助他估计,如果解决看起来如此简单的事情确实涉及很多复杂性在它的表面上。谁知道? (2认同)
  • @Rytis:我希望我也有同样的运气:-) - 即使没有同时运行它们,我也有安装程序随机中断。关于多核:还有另一种利用它们的方法:在一个安装过程中使用多个核。这仍然不总是可能或容易,但可以更好地协调。总的来说,我认为,最大的节省时间还是,如果整个安装过程(队列)只在开始和结束时问问题。然后你可以喝杯咖啡,或者在安装运行时做其他事情(并利用剩余的内核做任何你想做的事情。)。 (2认同)