it-swarm.com.de

Wie starte ich meinen Dienst nach der Installation automatisch?

Wie starte ich automatisch einen Dienst, nachdem ich eine Installation über ein Visual Studio-Setup-Projekt ausgeführt habe?

Ich habe es gerade herausgefunden und dachte, ich würde die Antwort für das Allgemeinwohl teilen. Antwort folgen. Ich bin offen für andere und bessere Wege, dies zu tun.

51
Jason Z

Fügen Sie Ihrem Projekt die folgende Klasse hinzu.

using System.ServiceProcess;  

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

Das Setup-Projekt holt die Klasse ab und führt Ihren Dienst aus, nachdem das Installationsprogramm abgeschlossen ist.

55
Jason Z

Kleiner Zusatz zur akzeptierten Antwort:

Sie können den Dienstnamen auch wie folgt abrufen - um Probleme zu vermeiden, wenn der Dienstname in der Zukunft geändert wird:

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

(Jedes Installationsprogramm verfügt über einen ServiceProcessInstaller und einen ServiceInstaller. Hier wird der ServiceInstaller als serviceInstaller1 bezeichnet.)

40
andnil

Dieser Ansatz verwendet die Installer-Klasse und die geringste Menge an Code.

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();
        }
    }
}

Definieren Sie serviceInstaller1 (Typ ServiceInstaller) im Installer-Klassendesigner und legen Sie auch seine ServiceName-Eigenschaft im Designer fest.

21
Keith

danke, es läuft OK ...

private System.ServiceProcess.ServiceInstaller serviceInstaller1;

private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
{
    ServiceController sc = new ServiceController("YourServiceName");
    sc.Start();
}
10
visionnguyen

Anstatt eine eigene Klasse zu erstellen, wählen Sie das Dienstinstallationsprogramm im Projektinstallationsprogramm aus, und fügen Sie dem Comitted-Ereignis einen Ereignishandler hinzu:

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();
    }
}

Der Dienst wird nur gestartet, wenn der Starttyp auf automatisch gesetzt ist.

7
HeWillem

Basierend auf den obigen Ausschnitten, sah meine ProjectInstaller.cs-Datei für einen Dienst mit dem Namen FSWServiceMgr.exe so aus. Der Dienst wurde nach der Installation gestartet. Denken Sie als Nebenbemerkung daran, auf die Registerkarte Eigenschaften (nicht Rechtsklick) zu klicken, wenn das Setup-Projekt im Projektmappen-Explorer ausgewählt ist, um die Firma festzulegen usw.


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();
        }
    }
}
3

Es gibt auch einen anderen Weg, der keinen Code beinhaltet. Sie können die Service Control Table verwenden. Bearbeiten Sie die generierte msi-Datei mit orca.exe und fügen Sie der ServiceControl Table einen Eintrag hinzu.

Nur die Spalten ServiceControl, Name, Event und Component_ sind obligatorisch. Die Component_-Spalte enthält die ComponentId aus der Dateitabelle. (Wählen Sie die Datei in der Dateitabelle aus, und kopieren Sie den Component_value in die ServiceControl-Tabelle.)

Der letzte Schritt besteht darin, den Wert von StartServices in der Tabelle InstallExecutesequence auf 6575 zu aktualisieren. Dies reicht aus, um den Dienst zu starten.

In der Dienstinstallationstabelle können Sie das Installationsprogramm für die Installation des Windows-Dienstes konfigurieren.

0
Sagar Kapadia