Automatisch een service starten wanneer het installatieprogramma is voltooid

Mogelijk duplicaat:
   Hoe kunt u uw service automatisch starten na de installatie?

Ik heb een Visual Studio 2008 C# .NET 3.5 service-installatieprogramma (MSI) op Windows 7 x64.

Ik abonneer me op de melding ServiceInstaller.OnAfterInstall om mijn service te starten wanneer de installatie is voltooid.

[RunInstaller(true)]
public partial class MyInstaller : Installer
{
    private System.ServiceProcess.ServiceInstaller my_installer_;

    private void InitializeComponent()
    {
       //...
        this.my_installer_.AfterInstall += new System.Configuration.Install.InstallEventHandler(this.OnAfterInstall);
       //...
    }

    private void OnAfterInstall(object sender, InstallEventArgs e)
    {
        using (System.ServiceProcess.ServiceController svc =
            new System.ServiceProcess.ServiceController("MyService"))
        {
            svc.Start();//completes successfully
        }
    }
}

Hoewel de functie zonder uitzondering slaagt, wordt mijn service nooit uitgevoerd wanneer het installatieprogramma is voltooid.

Het gebeurtenislogboek laat geen fouten zien met betrekking tot het opstarten van de service en als ik naar de servicemanager ga, kan ik de service handmatig starten (of de pc opnieuw opstarten en deze wordt automatisch gestart).

Wat moet ik doen om automatisch mijn service te starten wanneer het installatieproces is voltooid?

1
Het lijkt erop dat wat je hebt gedaan zou moeten werken. Mogelijke truc om dit te debuggen: Probeer een Thread.Sleep in te voegen met een waarde van ongeveer 30 seconden. Mogelijk kunt u een foutopsporingsprogramma koppelen aan het serviceproces en kunt u een breekpunt instellen direct na de Thread.Sleep . Als je eenmaal bent onderbroken in de foutopsporing, als je nog steeds fouten krijgt bij het hervatten, dan is het geen timing-probleem. Op dat moment kunt u op uw gemak uw servicestatus opvragen en bepalen wat met die stap het probleem veroorzaakt. Als de Thread.Sleep ervoor zorgt dat deze begint te werken, is het natuurlijk een kwestie van timing ...
toegevoegd de auteur Merlyn Morgan-Graham, de bron
U kunt ook "System.Diagnostics.Debugger.Launch ();" toevoegen. aan het begin van uw startmethode om te zorgen dat de debugger wordt bevestigd, zodat u kunt controleren wat er fout gaat. Het is mogelijk dat er ergens een uitzondering is en uw service stopt gewoon automatisch.
toegevoegd de auteur user276648, de bron

2 antwoord

AfterInstall-gebeurtenis gebruiken

Maak een AfterInstall -gebeurtenis in uw Service Installer-klasse en start de service met behulp van ServiceController .

public ServiceInstaller()
{
    InitializeComponent();
    this.AfterInstall += new InstallEventHandler(ServiceInstaller_AfterInstall);
}

void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
    ServiceController sc = new ServiceController(serviceInstaller1.ServiceName);
    sc.Start();
}

Betrokken evenement gebruiken

public ServiceInstaller()
{
    InitializeComponent();
    this.Committed += new InstallEventHandler(ProjectInstaller_Committed);
}

void ProjectInstaller_Committed(object sender, InstallEventArgs e)
{
    ServiceController sc = new ServiceController(serviceInstaller1.ServiceName);
    sc.Start();
}

Or you can override OnCommitted event

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

Controleer het volgende, behalve hierboven

  • Installateurstarttype: Automatisch
  • Account: lokaal systeem

Behalve het service-installatieprogramma moet u een setup-project hebben dat is gemaakt door de primaire uitvoer van het bovenstaande service-installatieprogramma te geven.

enter image description here

maak in de setup Custom-actie, ten minste bij de installatie door uitvoer van het service-installatieprogramma te geven.

enter image description here

Meer informatie van hier . Ik hoop dat dit je zal helpen.

1
toegevoegd
Is dat niet wat ik heb gedaan?
toegevoegd de auteur PaulH, de bron
@PaulH Controleer mijn bijgewerkte antwoord. Het werkt prima voor mij met bovenstaande instellingen.
toegevoegd de auteur Damith, de bron

I assume that Start returns immediatly, and Starts the Service in the background. Check the Docs: http://msdn.microsoft.com/en-us/library/yb9w7ytd.aspx

0
toegevoegd
Ja, dat weet ik zeker. Dat verklaart niet waarom de service niet is gestart of hoe u deze correct kunt starten.
toegevoegd de auteur PaulH, de bron
Wachten loste het probleem niet op - het installatieprogramma hing aan die wachttijd. De service zou proberen te starten en mislukken. Ik had base.Install (savedState); aan de bovenkant van mijn Installer.Install negeren. Dus het installatieprogramma probeerde de service te starten voordat het klaar was met het installeren van alle afhankelijkheden. Door het basisgesprek naar de onderzijde van mijn override te verplaatsen, heb ik het probleem verholpen. Niet iets dat iemand had kunnen zien van wat ik heb gepost, dus je krijgt de punten omdat je me naar de oplossing leidt.
toegevoegd de auteur PaulH, de bron
Heb je geprobeerd te wachten totdat het is begonnen? Er is een voorbeeld in de link die ik heb gepost
toegevoegd de auteur Andreas, de bron