2

我有一个 Windows 服务和一个 MSI 安装程序(安装项目)。安装项目具有用于安装和卸载的自定义操作,参数分别为 /install 和 /uninstall。

我希望服务在安装后立即启动。我的服务所做的只是启动一个进程。当服务停止时,它会process.Close();.

我试过做

var sc = new ServiceController( "MyProcess" );
sc.Start();

进程启动,但未显示表明服务已启动的事件日志消息。停止时出现错误Error stopping process: System.InvalidOperationException: No process is associated with this object.

如果我不使用服务控制器来启动和使用 Services.msc,它会在停止时按预期工作。

有没有办法让流程立即启动并让我的启动/停止方法按预期工作?

4

3 回答 3

1

你没有说你使用的是什么操作系统,但我记得去年在开发安装应用程序时遇到了这个问题。我相信这是 Windows 7、Server 2003/2008 和可能的 Vista 中的安全限制,因为安装程序无法启动它安装的任何应用程序。如果您将服务设置为自动启动,那么它应该在下次系统重新启动时启动。

于 2010-02-11T21:36:18.177 回答
0

我认为你的意思是这里有两个问题。第一个问题是服务在安装时没有启动。二是服务无法启动进程。我对吗?

当我通过安装项目安装服务时,我总是从安装程序类的 Commit 方法启动服务,这样我就知道一切都安装正确了。我不能 100% 确定这一点,但在安装完成之前您可能无法启动该服务。看起来您的自定义操作设置正确,因此调用 Commit 方法应该没有任何问题(您确实在自定义操作中包含了 Commit,对吗?)这是一个 Commit 方法的示例我的项目:

public override void Commit(IDictionary savedState)
{
    base.Commit(savedState);

    try
    {
        var serviceController = new ServiceController("<Insert Service Name>");
        serviceController.Start();
    }
    catch
    {
        MessageBox.Show(
            "There was an error starting the <Insert Service Name> Service. Please manually start it, or restart the computer.");
    }
}

通过向用户显示消息框,如果服务启动出现问题,至少会通知用户应该手动启动服务。在调试安装问题时,您可以在消息框中包含异常,以获取有关具体情况的更多详细信息。

我很好奇 - 您在 ServiceProcessInstaller 中使用什么帐户?该用户是否有权在计算机上启动该进程?该流程是否有任何特定的 UAC 要求?我怀疑访问控制是阻止您的流程启动的原因。

于 2010-02-11T23:36:28.340 回答
0

我最终采取了一种不同的方法,只是让正在运行的进程而不是试图保持之前启动的进程。然后停止进程就可以正常工作,并且 OnStart/OnStop 方法是否“正常”运行并不重要,因为我的内部进程正在启动/停止,就像我需要的那样。

于 2010-02-12T20:03:26.280 回答