52

从 Visual Studio 安装项目运行安装后如何自动启动服务?

我只是想出了这个问题,并认为我会为了普遍的利益而分享答案。回答跟随。我对其他更好的方法持开放态度。

4

7 回答 7

56

将以下类添加到您的项目中。

using System.ServiceProcess;  

class ServInstaller : ServiceInstaller
{
    protected override void OnCommitted(System.Collections.IDictionary savedState)
    {
        ServiceController sc = new ServiceController("YourServiceNameGoesHere");
        sc.Start();
    }
}

安装程序完成后,安装项目将选择课程并运行您的服务。

于 2008-10-17T15:52:35.703 回答
42

已接受答案的小补充:

您还可以像这样获取服务名称 - 避免将来更改服务名称时出现任何问题:

protected override void OnCommitted(System.Collections.IDictionary savedState)
{
    new ServiceController(serviceInstaller1.ServiceName).Start();
}

(每个 Installer 都有一个 ServiceProcessInstaller 和一个 ServiceInstaller。这里的 ServiceInstaller 称为 serviceInstaller1。)

于 2009-04-20T18:10:41.140 回答
25

这种方法使用 Installer 类和最少的代码。

using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;

namespace MyProject
{
    [RunInstaller(true)]
    public partial class ProjectInstaller : Installer
    {
        public ProjectInstaller()
        {
            InitializeComponent();
            serviceInstaller1.AfterInstall += (sender, args) => new ServiceController(serviceInstaller1.ServiceName).Start();
        }
    }
}

在 Installer 类设计器中定义serviceInstaller1(键入 ServiceInstaller),并在ServiceName设计器中设置其属性。

于 2012-05-26T01:02:33.307 回答
10

谢谢运行正常...

private System.ServiceProcess.ServiceInstaller serviceInstaller1;

private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
{
    ServiceController sc = new ServiceController("YourServiceName");
    sc.Start();
}
于 2009-04-09T04:06:08.047 回答
7

不要创建自己的类,而是在项目安装程序中选择服务安装程序并将事件处理程序添加到 Comitted 事件:

private void serviceInstallerService1_Committed(object sender, InstallEventArgs e)
{
    var serviceInstaller = sender as ServiceInstaller;
    // Start the service after it is installed.
    if (serviceInstaller != null && serviceInstaller.StartType == ServiceStartMode.Automatic)
    {
        var serviceController = new ServiceController(serviceInstaller.ServiceName);
        serviceController.Start();
    }
}

只有当启动类型设置为自动时,它才会启动您的服务。

于 2012-05-10T09:37:43.577 回答
3

根据上面的片段,我的 ProjectInstaller.cs 文件对于名为 FSWServiceMgr.exe 的服务看起来像这样。该服务确实在安装后启动。附带说明一下,当在解决方案资源管理器中选择设置项目以设置公司等时,请记住单击属性选项卡(不是右键单击)。


using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;

namespace FSWManager {
    [RunInstaller(true)]
    public partial class ProjectInstaller : Installer {
        public ProjectInstaller() {
            InitializeComponent();
            this.FSWServiceMgr.AfterInstall += FSWServiceMgr_AfterInstall;
        }

        static void FSWServiceMgr_AfterInstall(object sender, InstallEventArgs e) {
            new ServiceController("FSWServiceMgr").Start();
        }
    }
}
于 2012-05-19T00:17:05.917 回答
0

还有另一种不涉及代码的方式。您可以使用服务控制表。使用 orca.exe 编辑生成的 msi 文件,并将条目添加到ServiceControl Table

只有 ServiceControl、Name、Event 和 Component_ 列是必需的。Component_ 列包含来自文件表的 ComponentId。(选择文件表中的文件,并将 Component_value 复制到 ServiceControl 表中。)

最后一步是在表 InstallExecutesequence 中将 StartServices 的值更新为 6575。这足以启动服务。

顺便说一句,服务安装表允许您配置安装程序以安装 Windows 服务。

于 2018-05-07T02:17:46.980 回答