日期:2014-05-18  浏览次数:20907 次

安装程序安装和卸载Windows服务的问题
最近在vs2003环境写了一个Windows服务,想通过打包成安装程序的方式实现自动安装和卸载。
利用VS2003的安装程序向导,加上我的一些自定义操作,实现了服务的自动安装,方法如下:
在自定义操作的“安装”项中,自定义一个安装类重载Installer类的AfterInstall方法,在此方法中,执行“Installutil MyService.exe”安装服务。

为了实现服务的自动卸载,我又在自定义操作的“卸载”项中,自定义了一个新的安装类重载Installer类的BeforeUnInstall方法,想通过在此方法中执行“Installutil /u MyService.exe”来卸载服务。

但是,实际执行的时候,我发现,安装程序安装服务没有问题,但是卸载的时候,总是提示“文件不存在,卸载失败“。找了一些资料后才发现,VS2003的安装向导中,所谓的自定义操作,不管是“AfterInstall”还是“BeforeUnInstall”,其实都是Windows执行完默认的操作后才会被真正执行,也就是说,“BeforeUnInstall”实际上是在系统完成“UnInstall”之后而非之前执行。这样,卸载程序时,当执行到我自定义的“BeforeUnInstall”时,系统实际上已经完成了程序文件的删除工作,但是我自定义执行的服务卸载工作,必须依赖于这些程序文件的存在,所以才出现了“文件不存在,卸载失败”这样的错误。

不知大家有没有遇到过着类问题。我自己设想了两种解决办法:
1.找一种新的Windows服务卸载方法,这种方法是不依赖于服务程序可执行文件的存在的;
2.真正在Windows安装程序执行默认操作之前执行自定义操作;
但是都没有找到可行的实现途径。

我想,肯定还会有其他的办法,希望大家不吝赐教,谢谢!

------解决方案--------------------
http://www.cnblogs.com/pcjim/archive/2007/11/14/959669.html
------解决方案--------------------
visual studio 2003不记得什么样子了,不过在visual studio的安装程序里有个Custom Actions,
如果visual studio 2003也有这个功能,可以在Unstall项里添加可执行文件来执行删除文件前的操作