1

我有安装产品的 MSI 安装程序,该产品有几个广泛使用的 API dll。这些 dll 可能会加载到我在升级期间无法控制的进程中(例如,我不能要求用户关闭 explorer.exe 或 svchost)。因此,在 MSI 升级期间,这些 dll 被锁定,并且无法在不重新启动的情况下升级。我需要让它无需重新启动即可升级。这些 API dll 非常稳定,当这些 dll 的新版本将被加载到新运行的进程中时,让旧副本在旧进程中工作是可以接受的。因此,当我们不使用 MSI 时,我们只是使用标准技巧 - 重命名文件,将其标记为在重新启动时删除,写入新文件。

在 MSI 中最好的方法是什么?我应该创建将执行此标准技巧的自定义操作吗?或者也许 MSI 有更好的方法来做到这一点?

谢谢!

4

1 回答 1

2

这些进程被“锁定”,因为它们正在使用中,并且您无法在运行时更改可执行文件;没有“解锁”,而是停止使用该文件。因此,要么立即终止进程,要么在重启后使用 PendingFileRename 键更改文件...

您也许可以尝试杀死 explorer.exe 等人必须保留在您的 DLL 上的句柄/线程(使用自定义操作),这可能会工作一分钟......但这将确保 (a) 您新升级的 DLL直到重新启动后才能工作,并且(b)您可能使用户的计算机不稳定,并且资源管理器可能随时崩溃。无论哪种方式,最终用户都不会对您的软件感到满意……肯定比他们因不得不重新启动而烦恼的情况更糟。

于 2010-09-07T21:30:30.950 回答