我正在使用Visual Studio 安装程序项目扩展来为我的应用程序构建 MSI 安装程序。但是,我的应用程序应该一直运行,如果它在用户安装我的软件的新版本时打开,则打开的文件不会被覆盖,实际上几乎没有更新(尽管没有安装程序-错误)。
我发现使用安装程序项目的“自定义操作”来运行关闭应用程序的脚本没有帮助,因为在替换文件之前没有调用任何操作。
有没有一种好方法可以确保在文件应该被覆盖之前终止打开/锁定的文件?
我正在使用Visual Studio 安装程序项目扩展来为我的应用程序构建 MSI 安装程序。但是,我的应用程序应该一直运行,如果它在用户安装我的软件的新版本时打开,则打开的文件不会被覆盖,实际上几乎没有更新(尽管没有安装程序-错误)。
我发现使用安装程序项目的“自定义操作”来运行关闭应用程序的脚本没有帮助,因为在替换文件之前没有调用任何操作。
有没有一种好方法可以确保在文件应该被覆盖之前终止打开/锁定的文件?
了解有关您的应用程序以及如何进行升级的更多信息会很有用,因为:
您通常会看到一个 FilesInUse 对话框,说明文件正在使用中,提示用户关闭它们,但如果安装是静默的,则不会。
Visual Studio 设置没有对关闭和重新启动服务的内置支持,因此如果您的应用是一项服务,您将需要额外的工作。
确实需要替换的文件将提示用户重新启动(如果之前未关闭),以便在重新启动时替换它们。
因此,如果您在 UI 安装中没有看到重新启动请求或 FilesInUse 对话框,那么就会发生其他事情。因此,您需要确保:
一个。您实际上是在进行升级,其中安装项目的版本已经增加,UpgradeCode 是相同的(并且当您增加安装项目的版本时 ProductCode 会发生变化)。您的症状可能是升级无法正常工作的结果,而您看到的只是修复。
湾。“新版本”的定义是您在 a. 中进行了升级,并且二进制文件的文件版本已增加。安装的默认覆盖规则需要递增的文件版本,因此如果它们没有递增,您将看不到任何更新,并且 Windows 不会尝试显示 FilesInUse 对话框或重新启动,因为没有需要替换的文件。
我们遇到了这个问题,我们想出的解决方案是创建两个应用程序;用户应用程序和更新程序应用程序。MSI 安装两者。每个应用程序检查另一个应用程序是否需要更新,如果需要,则关闭另一个应用程序,下载另一个应用程序的更新程序,运行它,然后重新启动另一个应用程序。此外,每个应用程序都会监控其他应用程序是否正在运行,如果没有,则启动它。
这不是问题的解决方案,而是另一种解决方案;最终需要最少工作的那个。
我最终没有为我的安装程序使用“Visual Studio 安装程序项目”。相反,我查看了Advanced Installer,它可以正常工作。考虑到这样的事情,并且自定义操作允许更多选项。
如果你的项目是开源的,你可以写信给他们免费的开源“专业”许可证,相当于他们的“专业”计划,通常是399 美元(一次性购买)。
REBOOT:你是如何安装这个 MSI 的?什么命令行?如果您REBOOT=ReallySuppress
在命令行上设置,即使需要完成产品安装,也不会提示您重新启动。
msiexec.exe /i MySetup.msi /QN REBOOT=ReallySuppress
如果您使用的是分发系统,我想抑制重新启动提示可能是标准行为。然后,您的产品文件应该在重新启动(PendingFileRenameOperations
或者可能是一些更新的机制)后就位。
Visual Studio 安装程序项目也可能会做一些我不知道的奇怪事情。
日志:我会尝试为安装创建一个好的日志文件,以确定发生了什么:
msiexec.exe /i C:\Path\Your.msi /L*v C:\Your.log
记录所有 MSI:我个人喜欢为所有 MSI 安装启用日志记录 - 如Globally for all setups on a machine
上述链接中的“”部分所述。
解释 MSI 日志:解释日志文件有时可能具有挑战性。这是一个答案,其中包含一些帮助解决此问题的链接。
重新启动管理器:重新启动管理是一个非常复杂的主题,Windows 具有功能 - 以重新启动管理器功能的形式- 试图通过关闭和重新启动应用程序作为“自动”安装的一部分来尽量减少重新启动的需要-magical” 方式(应用程序侦听消息并在被告知时优雅地关闭自己,并且系统可能会在安装后重新启动应用程序 - 如果配置为这样做)。
在我看来,更新您的应用程序以符合重启管理器是您看到的此类问题的唯一真正解决方法。
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?
也链接到上面的链接中 - 我认为仍然值得直接链接。
根据下面的链接
“VS 安装中没有很好的支持来停止和启动服务。在安装过程中,问题是自定义操作在安装完所有内容后运行,因此停止升级或替换的服务为时已晚。是的,它们的名称如下“BeforeInstall”,但它们确实不是在安装之前。”