使用AssemblyInstaller安装后找不到服务

时间:2012-09-13 08:03:22

标签: .net service install servicecontroller

上下文

Windows 2008 64位。
我安装了一个.NET服务,作为安装程序。

背景

我正在使用此代码(credit:Marc Gravell)来安装服务:

using (var inst = new AssemblyInstaller(typeof(MyNamespace.Program).Assembly, new string[] { })) {
    IDictionary state = new Hashtable();
    inst.UseNewContext = true;
    try {
    if (uninstall) {
        inst.Uninstall(state);
    } else {
        inst.Install(state);
        inst.Commit(state);
    }
    } catch {
    try {
        inst.Rollback(state);
    } catch { }
    throw;
    }
}

问题

一切正常,没有例外,但在此之后,我尝试运行以下代码来启动刚刚安装的服务:

using (var sc = new ServiceController("the service's name"))
{
    sc.Start();
    sc.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(20));
}

我得到一个例外:

System.InvalidOperationException: Service [service name goes here] was not found on computer '.'. ---> System.ComponentModel.Win32Exception: The specified service does not exist as an installed service
   --- End of inner exception stack trace ---
   at System.ServiceProcess.ServiceController.GenerateNames()
   at System.ServiceProcess.ServiceController.get_ServiceName()
   at System.ServiceProcess.ServiceController.Start(String[] args)
   at System.ServiceProcess.ServiceController.Start()
   at ... (my code details)

我不明白为什么,因为:

  1. 服务的名称与ServiceInstaller中的名称完全相同(in ServiceName属性)
  2. 代码在不同的服务中执行,该服务在其下运行 本地系统帐户。

2 个答案:

答案 0 :(得分:0)

可能是服务处于等待状态且尚未完成完整注册,因此无法将其识别为已安装的服务。
在设置UseNewContext属性时 - 安装日志文件(“{Assembly name} .InstallLog”)是否包含任何有意义的信息?
另外,要检查这是否是权限问题,您是否可以尝试使用

验证服务是否存在
sc query <ServiceName>

来自管理命令窗口?

答案 1 :(得分:0)

有一个可能有用的安装日志。在服务的文件夹中查找YouServiceName.InstallLog文件。

为服务添加安装程序就足够了(这对我而言)。你应该:

  • 在设计器中打开Service.cs文件,
  • 右键单击它,
  • 选择菜单选项&#34;添加安装程序&#34;。

它不会立即安装......你需要先创建安装程序类。

供参考,另请参阅this question