在安装之前挂钩安装程序方法 - Windows 安装程序

本文关键字:安装 程序 方法 Windows | 更新日期: 2023-09-27 18:36:38

我创建了一个安装Windows服务的安装程序。我在VS 2010中使用了Visual studio默认安装程序。

该服务将访问并写入安装文件夹中存在的数据库文件 (SQLite)。

在卸载期间,当服务停止或运行时,服务将卸载,没有任何错误。

但是,如果安装程序从版本 1 迁移到版本 2,并且以前版本的服务正在运行,则"某个应用程序正在访问该文件。重试"错误已显示,因为以前的安装服务访问了数据库文件。

所以我需要在安装新版本之前停止以前的版本服务。我有一个用于管理安装和卸载的自定义操作脚本。在BeforeInstall方法中,我编写了代码来使用 ServiceController 停止服务。这可能会停止服务。

服务控制器服务 = 新的服务控制器("SERVICE_NAME");

如果 (!

(服务。Status.Equals(ServiceControllerStatus.Stop)))

    {
        service.Stop();
        service.WaitForStatus   (System.ServiceProcess.ServiceControllerStatus.Stopped);
    }

但即使在BeforeInstall方法之前,安装程序也在复制新版本文件,替换我以前的版本文件。

我总是有相同的安装文件夹。因此,如果我编写代码以在BeforeInstall自定义操作中停止服务,它仍然会抛出错误,因为新版本试图删除以前版本服务访问的数据库文件。所以我得到"该文件正在被某个应用程序访问。再试一次"。

因此,即使在安装程序将文件复制到安装文件夹之前,我就需要一些钩子。这样我就可以在安装程序尝试更新 Db 文件之前停止该服务。

任何想法将不胜感激。

在安装之前挂钩安装程序方法 - Windows 安装程序

Windows Installer没有"安装前"的概念。 这是一个Visual Studio 安装和部署项目抽象。 此项目类型未能公开许多底层Windows安装程序功能,这就是Microsoft在VS2012中将其删除的原因。

另一个未公开的概念是 ServiceInstall 和 ServiceControl 表。 这就是您被迫编写自定义操作的原因。 以这种方式(超出您的控制范围)托管的自定义操作,以使用 CLR 版本标记 MSIEXEC 进程,并在出现问题时引发模式 1001 异常(即使在静默安装期间)。

但是有一个解决方案。 切换到更好的工具,例如免费和开源的Windows Installer XML(WiX)和工业强度的Windows Installer XML(IsWiX)。 使用这些工具,您可以创建 Windows 服务,为其创建安装程序,并在 10 分钟内在 VM 上测试安装/卸载。 观看我的无声演示:

使用 IsWiX 构建和部署 Windows 服务