Iniciar automaticamente um serviço quando o instalador terminar

Possível duplicar:
   Como iniciar automaticamente seu serviço após a instalação?

Eu tenho um projeto de instalador de serviço do Visual Studio 2008 translation from VPE for Csharp .NET 3.5 (MSI) em execução no Windows 7 x 64.

Assino a notificação ServiceInstaller.OnAfterInstall para iniciar meu serviço quando a instalação for concluída.

[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
        }
    }
}

Embora a função seja bem-sucedida sem exceção, meu serviço nunca é executado quando o instalador é concluído.

O log de eventos não mostra falhas relacionadas à inicialização do serviço e, se eu for ao gerenciador de serviços, posso iniciar o serviço manualmente (ou reiniciá-lo e ele será iniciado automaticamente).

O que preciso fazer para iniciar automaticamente meu serviço quando o processo de instalação terminar?

1
Parece que o que você fez deve funcionar. Possível truque para depurar isto: Tente inserir um Thread.Sleep com um valor de 30 segundos ou mais. Ele pode permitir que você conecte um depurador ao processo do serviço e pode definir um ponto de interrupção logo após o Thread.Sleep . Uma vez que você está em pausa no depurador, se você ainda receber erros no currículo, então não é uma coisa de sincronismo. Nesse ponto, você pode consultar seu estado de serviço como quiser e determinar qual etapa está causando o problema. Se o Thread.Sleep faz com que ele comece a funcionar, é claro que é uma coisa de timing ...
adicionado o autor Merlyn Morgan-Graham, fonte
Você também pode adicionar "System.Diagnostics.Debugger.Launch ();" no início do seu método start para forçar o depurador a ser anexado, para que você possa verificar o que está errado. É possível que exista uma exceção em algum lugar e seu serviço simplesmente pare automaticamente.
adicionado o autor user276648, fonte

2 Respostas

Usando o evento AfterInstall

Crie o evento AfterInstall em sua classe do Service Installer e inicie o serviço usando o 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();
}

Usando o evento confirmado

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

Além do que acima, por favor, verifique o seguinte

  • Tipo de início do instalador: automático
  • Conta: sistema local

Além do instalador de serviços, você precisa ter um projeto de instalação que seja criado fornecendo a saída principal do instalador de serviços acima.

enter image description here

na configuração, crie uma ação personalizada, pelo menos na instalação, fornecendo a saída do projeto do instalador de serviço.

enter image description here

Mais informações em here . Espero que isso ajude você.

1
adicionado
Não foi isso que eu fiz?
adicionado o autor PaulH, fonte
@PaulH Por favor, verifique minha resposta atualizada. Está funcionando bem para mim com configurações acima.
adicionado o autor Damith, fonte

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
adicionado
Sim, tenho certeza que sim. Isso não explica por que o serviço não foi iniciado ou como iniciá-lo corretamente.
adicionado o autor PaulH, fonte
A espera não resolveu o problema - o instalador permaneceu nessa espera. O serviço tentaria iniciar e falhar. Eu tinha base.Install (savedState); no topo da minha substituição do Installer.Install . Então, o instalador estava tentando iniciar o serviço antes de terminar de instalar todas as dependências. Ao mover a chamada de base para a parte inferior da minha substituição, corrigi o problema. Não é algo que alguém poderia ter visto do que eu postei, então você ganha os pontos porque você me leva à solução.
adicionado o autor PaulH, fonte
Você já tentou esperar até que seja iniciado? Há um exemplo no link que eu postei
adicionado o autor Andreas, fonte