首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BeforeInstall安装程序方法之前的钩子- Windows

BeforeInstall安装程序方法之前的钩子- Windows
EN

Stack Overflow用户
提问于 2013-10-24 10:06:31
回答 1查看 1.1K关注 0票数 0

我已经创建了一个安装程序来安装windows服务。我在VS 2010中使用了Visual默认安装程序。

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

在服务停止或运行时卸载期间,服务将卸载,不会出现任何错误。

但是,如果安装程序从版本1迁移到2,并且以前版本的服务正在运行,那么“文件正被某个应用程序访问。请重试”错误已经显示,因为之前的安装服务访问了DB文件。

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

ServiceController service =新ServiceController("SERVICE_NAME"); 如果是(!(service.Status.Equals(ServiceControllerStatus.Stopped))) { service.Stop();service.WaitForStatus }

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

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

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

任何想法都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2013-10-24 11:36:39

Windows安装程序没有“安装前”的概念。这是一个Visual设置和部署项目抽象。此项目类型未能公开许多基本的Windows特性,这就是微软在VS2012中删除它的原因。

另一个未公开的概念是ServiceInstall和ServiceControl表。这就是您被迫编写自定义操作的原因。以这种方式承载的自定义操作(超出您的控制范围)可以在MSIEXEC进程中添加CLR版本,并在出现问题时抛出模式1001异常(甚至在无声安装期间)。

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

使用IsWiX构建和部署Windows

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19562929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档