我正在使用Visual Studio Installer Projects扩展名来为我的应用程序构建MSI安装程序。但是,我的应用程序打算一直运行,并且如果在用户安装我的软件的新版本时打开该应用程序,则打开的文件不会被覆盖,实际上几乎没有更新(尽管没有安装程序) -错误)。
我发现使用安装程序项目的“自定义操作”运行关闭应用程序的脚本无济于事,因为在替换文件之前,没有一个操作被称为 。< / p>
是否有一种好的方法来确保打开/锁定的文件在应该被覆盖之前 被终止?
答案 0 :(得分:1)
我们遇到了这个问题,我们想出的解决方案是创建两个应用程序。用户应用程序和更新程序应用程序。 MSI会同时安装两者。每个应用程序检查另一个是否需要更新,如果需要,则关闭另一个应用程序,下载另一个应用程序的更新程序,运行该更新程序,然后重新启动另一个应用程序。此外,每个应用程序都会监视另一个应用程序是否正在运行,如果没有运行,则将其启动。
答案 1 :(得分:1)
了解有关您的应用程序以及升级方式的信息将很有用,因为:
通常,您会看到一个FilesInUse对话框,指出正在使用文件,提示用户将其关闭,但如果安装为静默则不会。
Visual Studio设置不具有关闭和重新启动服务的内置支持,因此,如果您的应用程序是一项服务,则需要额外的工作。
实际上确实需要替换的文件将提示用户重新引导(如果以前未关闭它们),以便在重新引导时进行替换。
因此,如果在UI安装中没有看到重新启动请求或FilesInUse对话框,则说明发生了其他情况。因此,您需要确保:
a。您实际上是在进行升级,其中安装项目的版本已增加,UpgradeCode是相同的(当您增加安装项目的版本时,ProductCode也会更改)。您的症状可能是升级无法正常进行的结果,而您只是在进行维修。
b。 “新版本”的定义是,您具有。,AND中的升级功能,二进制文件的文件版本已增加。安装的默认覆盖规则要求文件版本增加,因此,如果未增加文件版本,您将看不到更新,并且Windows不会尝试显示FilesInUse对话框或重新启动,因为没有文件需要替换。
答案 2 :(得分:1)
这不是解决问题的方法,而是另一种解决方法。最后需要最少的工作。
我最终使用安装程序的“ Visual Studio安装程序项目” 不是。相反,我查看了Advanced Installer,它只是有效而没有问题。这样的事情已考虑在内,自定义操作允许更多选项。
如果您的项目是开源的,则可以向他们写有关free open source "professional" license的信息,这等同于他们的“专业”计划,该计划通常是$399(一次性购买)。
答案 3 :(得分:0)
重新启动 :如何安装此MSI?什么命令行?如果您在命令行上设置了REBOOT=ReallySuppress
,即使完成产品的安装是必需的,也不会提示您重新启动。
msiexec.exe /i MySetup.msi /QN REBOOT=ReallySuppress
如果您使用的是分发系统,我想禁止重新启动提示可能是标准行为。然后,您的产品文件应在重新引导(PendingFileRenameOperations
或某些更新的机制)之后放置到位。
Visual Studio Installer项目也有可能做一些我不知道的奇怪事情。
日志 :我将尝试create a good log file for the install,以确定发生了什么事情:
msiexec.exe /i C:\Path\Your.msi /L*v C:\Your.log
记录所有MSI :我个人希望启用所有MSI安装的日志记录-如“ Globally for all setups on a machine
”中所述上面链接中的“”部分。
解释MSI日志 :有时候,解释日志文件可能很困难。 Here is an answer with some links to help with this。
重新启动管理器 :重新启动管理是一个非常复杂的主题,并且Windows功能以the restart manager feature的形式提供,以尽量减少对通过以“自动魔术”的方式关闭并重新启动应用程序作为安装的一部分来重新启动(应用程序侦听消息并在被告知时正常关闭自身,并且安装后系统可以重新启动应用程序-如果配置为这样做)。
更新您的应用程序以使其符合重启管理器是解决您在我的观点中看到的此类问题的唯一真正的方法 。
The section "Restart Manager" in this question tries to summarize how to implement such support
(也许只是在页面下方阅读黄色部分)。- Advanced Installer 的家伙们有一篇非常不错的技术文章:
How do I add support for Windows Restart Manager to my application?
也在上面的链接中链接-我认为这里仍然值得直接链接。
答案 4 :(得分:0)
根据下面的链接
“ VS安装中没有很好的支持来停止和启动服务。在安装过程中,问题在于自定义操作在安装所有组件之后运行,因此停止升级或替换的服务为时已晚。是的,它们的名称类似于“ BeforeInstall”,但实际上并非在安装之前。”