MSI-installer未更新的正在使用的文件(Visual Studio Installer项目)

我正在使用Visual Studio Installer Projects扩展来为我的应用程序构建MSI安装程序。 但是,我的应用程序应该始终在运行,如果在用户安装我的软件的新版本时它是打开的,那么打开的文件不会被覆盖,并且几乎没有实际更新(尽管没有安装程序) -errors)。

我发现使用安装程序项目的“自定义操作”来运行关闭应用程序的脚本没有帮助,因为替换文件之前没有调用任何操作。

是否有一种好方法可以确保在文件被覆盖之前终止打开/锁定文件?

了解有关您的应用程序以及如何进行升级的更多信息会很有用,因为:

  1. 您通常会看到一个FilesInUse对话框,说明文件正在使用中,提示用户关闭它们,但如果安装是静默则不会。

  2. Visual Studio安装程序没有内置支持关闭和重新启动服务,因此如果您的应用程序是服务,则需要额外的工作。

  3. 实际需要更换的文件将提示用户重新启动(如果之前没有关闭),以便在重启时替换它们。

因此,如果您没有在UI安装中看到重新启动请求或FilesInUse对话框,那么还会发生其他事情。 所以你需要确保:

一个。 您正在进行升级,其中安装项目的版本已增加,UpgradeCode是相同的(当您增加安装项目的版本时,ProductCode会更改)。 您的症状可能是升级不起作用的结果,您只是看到了修复。

湾 “新版本”的定义是您在。,AND中进行了升级,并且二进制文件的文件版本已经增加。 安装的默认覆盖规则需要增加的文件版本,因此如果它们没有增加,您将看不到更新,Windows将不会尝试显示FilesInUse对话框或重新启动,因为没有需要替换的文件。

这不是问题的解决方案,而是另一种解决方案; 最后需要最少工作的人。

我最终没有为我的安装程序使用“Visual Studio Installer Projects”。 相反,我查看了Advanced Installer ,它只是没有问题。 这样的事情被考虑在内,自定义操作允许更多选项。

如果您的项目是开源的,您可以写信给他们一个免费的开源“专业”许可证 ,相当于他们的“专业”计划,通常是399美元 (一次性购买)。

重新启动 :你是如何安装这个MSI的? 什么命令行? 如果在命令行上设置REBOOT=ReallySuppress ,即使需要完成产品的安装,也不会提示您重新启动。

 msiexec.exe /i MySetup.msi /QN REBOOT=ReallySuppress 

如果您使用的是分发系统,我认为抑制重启提示可能是标准行为。 然后,您的产品文件应在重新启动后放置( PendingFileRenameOperations或者某些更新的机制)。

Visual Studio Installer项目也可能做一些我不知道的奇怪事情。


日志 :我会尝试为安装创建一个好的日志文件 ,以确定发生了什么:

 msiexec.exe /i C:\Path\Your.msi /L*v C:\Your.log 

记录所有MSI :我个人喜欢为所有MSI安装启用日志记录 – 如上面链接中“ Globally for all setups on a machine ”部分所述。

解释MSI日志 :解释日志文件有时可能具有挑战性。 这是一个答案,有一些链接可以帮助解决这个问题


重新启动管理器 :重新启动管理是一个非常复杂的主题,Windowsfunction – 以重新启动管理器function的forms – 尝试最小化重新启动的需要,而不是关闭和重新启动应用程序作为“自动”安装的一部分-magical“fashion(应用程序侦听消息并在被告知时正常关闭自身,系统可能会在安装后重新启动应用程序 – 如果配置为这样做)。

更新您的应用程序以符合重新启动管理器是您在我的意见中看到的此类问题的唯一真正解决方案

  • The section "Restart Manager" in this question tries to summarize how to implement such support (可能只是阅读页面下方的黄色部分)。
  • 高级安装程序人员有一篇非常好的技术文章: How do I add support for Windows Restart Manager to my application? 还链接到上面的链接 – 我认为仍然值得直接链接。