我有安装产品的MSI安装程序,这个产品有几个广泛使用的API dll。 这些DLL可以加载到升级期间无法控制的进程中(例如,我不能要求用户关闭explorer.exe或svchost)。 因此,在MSI升级期间,这些dll将被锁定,无法重新启动而无法升级。我需要让它升级而不需要重启。 这些API dll非常稳定,当新版本的这些dll将被加载到新的运行进程中时,可以将旧副本保留在旧进程中。 因此,当我们不使用MSI时,我们只使用标准技巧 - 重命名文件,将其标记为在重启时删除,写入新文件。
在MSI中如何做到这一点的最佳方法是什么? 我应该创建自定义操作来执行此标准操作吗? 或者也许MSI有更好的方法来做到这一点?
谢谢!
答案 0 :(得分:1)
进程被“锁定”,因为它们正在使用中,并且您无法在运行时更改可执行文件;没有“解锁”但停止使用该文件。所以要么你现在杀死进程,要么在重启后使用PendingFileRename键来改变文件......
你可能试图杀死explorer.exe等人必须保留你的DLL(使用自定义动作)的句柄/线程,这可能会工作一分钟......但这将确保(a)你的新升级的DLL在重启之后才能工作,并且(b)你可能使用户的计算机不稳定,资源管理器可能随时崩溃。无论哪种方式,最终用户都不会对您的软件感到满意......必须比他们不得不重新启动时更加烦恼。