【问题标题】:Deployment: How to access a windows service name so the (un)installer can uninstall it?部署:如何访问 Windows 服务名称以便(卸载)安装程序可以卸载它?
【发布时间】:2012-06-25 21:18:57
【问题描述】:
安装 Windows 服务后,应用程序使用自定义操作根据用户在安装对话框文本框中输入的内容设置该服务的 ServiceName 和 DisplayName。
在测试此应用程序时,它可以正常安装,但是当我尝试卸载服务时,我收到错误 1001。服务不存在。
这最终不是真的,因为我可以运行它。所以我现在的想法是我需要以某种方式访问服务的自定义名称并将其提供给卸载程序。我原以为这都是基于 GUID 的,并且名称在很大程度上与 re:uninstall 无关,但似乎并非如此。
那么我该如何解决这个问题呢?
【问题讨论】:
标签:
c#
.net
deployment
windows-services
uninstallation
【解决方案1】:
我假设您正在使用Installer 派生类和ServiceInstaller 实例。
我在一个项目中做类似的事情。服务名称存储在一个文本文件中(这只是一个选项,但对我来说它是为了自动部署目的)。您可以将其存储在任何地方(注册表等)。
因此,您应该将在安装阶段配置的自定义服务名称保存在某个地方。
所以,我有我的Installer 课程:
[RunInstaller(true)]
public partial class ProjectInstaller : System.Configuration.Install.Installer
在它的构造函数中,我这样做:
_process = new ServiceProcessInstaller { Account = ServiceAccount.LocalSystem };
_service = new ServiceInstaller { ServiceName = ServiceNameReader.GetServiceName(), StartType = ServiceStartMode.Automatic };
Installers.Add(_process);
Installers.Add(_service);
注意ServiceNameReader.GetServiceName() 函数。此自定义函数从文件中获取服务名称。
Installer 类也在卸载期间被实例化和调用。所以如果你这样做,从某个地方动态加载实际的服务名称,你将能够成功卸载它。