我已经创建了一个安装程序来安装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文件之前停止服务。
任何想法都将不胜感激。
发布于 2013-10-24 11:36:39
Windows安装程序没有“安装前”的概念。这是一个Visual设置和部署项目抽象。此项目类型未能公开许多基本的Windows特性,这就是微软在VS2012中删除它的原因。
另一个未公开的概念是ServiceInstall和ServiceControl表。这就是您被迫编写自定义操作的原因。以这种方式承载的自定义操作(超出您的控制范围)可以在MSIEXEC进程中添加CLR版本,并在出现问题时抛出模式1001异常(甚至在无声安装期间)。
但有一个解决办法。切换到更好的工具,如免费和开放源码(WiX)和工业强度(IsWiX)。使用这些工具,您可以创建一个windows服务,为它创建安装程序,并在10分钟内测试VM上的安装/卸载。观看我的无声演示:
使用IsWiX构建和部署Windows
https://stackoverflow.com/questions/19562929
复制相似问题