Criando um serviço para Windows de forma simples com o TopShelf

Quem precisou criar serviços Windows sabe a complexidade que é usar o Windows Services no desenvolvimento, para resolver isso um grupo criou o TopShelf. Nele é possível utilizar uma aplicação console para transformá-la em serviço.

Os desenvolvedores dizem que a justificativa é que é mais fácil depurar uma aplicação console do que um serviço.

Montando um exemplo no TopShelf

Para usar vamos começar criando um projeto console básico para iniciar nosso projeto com o TopShelf.

O segundo passo é instalar o repositório Nuget do TopShelf, vamos entrar no Manage Nuget Packges e procurar por ele.

 

Show me the code!

Após isto nosso aplicativo console já está preparado para virar um serviço, vamos começar a montar nossa aplicação teste. Abaixo tem um exemplo de implementação para mostrar como usar o TopShelf.

 

public class TownCrier
    {
        readonly Timer _timer;
        public TownCrier()
        {
            _timer = new Timer(1000) { AutoReset = true };
            _timer.Elapsed += (sender, eventArgs) => Console.WriteLine("São {0} e está tudo bem!", DateTime.Now);
        }
        public void Start() { _timer.Start(); }
        public void Stop() { _timer.Stop(); }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var rc = HostFactory.Run(x =>                                   //1
            {
                x.Service<TownCrier>(s =>                                   //2
                {
                    s.ConstructUsing(name => new TownCrier());              //3
                    s.WhenStarted(tc => tc.Start());                        //4
                    s.WhenStopped(tc => tc.Stop());                         //5
                });
                x.RunAsLocalSystem();                                       //6

                x.SetDescription("Exemplo Topshelf Host");                  //7
                x.SetDisplayName("Stuff");                                  //8
                x.SetServiceName("Stuff");                                  //9
            });                                                             //10

            var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());   //11
            Environment.ExitCode = exitCode;
        }
    }

Vamos entender como funciona, abaixo vou descrever cada passo dos comentários:

1 – Aqui é configurando o host usando o HostFactory.Run para executar. Abrimos uma nova expressão lambda onde o ‘x’ neste caso expõe toda a configuração do nível do host. Usando essa abordagem, os argumentos de comando são extraídos das variáveis de ambiente. Também capturamos o código de retorno do serviço que é retornado na linha 11;

2 – Aqui estamos dizendo ao TopShelf que existe um serviço do tipo ‘TownCrier’. A expressão lambda que é aberta aqui expõe as opções de configuração do serviço através do parâmetro ‘s’;

3 – Isso diz ao TopShelf como criar uma instância do serviço. Atualmente, estamos apenas indo para “new”, mas nós poderíamos facilmente puxá-lo de um contêiner IoC com algum código que seria algo como ‘container.GetInstance <TownCrier> ()’;

4 – Aqui é informado ao TopShelf o que ele tem que executar quando iniciar o serviços;

5 – Já aqui é o que o TopShel tem que executar quando parar o serviço;

6 – Aqui está sendo configurado como o serviço vai rodar, no caso do exemplo ele está rodando no sistema local;

7 – Nessa linha é configurada a descrição que vai aparecer no monitor de serviços do Windows;

8 – Nessa linha é configurada o nome do serviço que é exibido no painel de serviços do Windows;

9 – Nessa linha é configurado o nome do serviço para ser usado via linha de comandos;

10 – Aqui acontece o fechamento da expressão lambda;

11 – Nessa linha converte o código no código de saída.

Agora se executar o código ele vai abrir normalmente a aplicação console e vai dar os seguintes retornos:

Instalação como serviço

A grande vantagem aqui é que você utiliza normal a aplicação, consegue de forma simples debugar ela sem problemas, e depois que tiver concluído ai é a hora de instalar ele como um serviço do Windows, para isso vamos até a pasta do executável, no meu caso está em “C:\Users\thiago.borges\source\repos\ConsoleApp1\ConsoleApp1\bin\Debug” mais vai ser no diretório bin do seu projeto. Com o shift do teclado pressionado e clicando com o botão direito do mouse na pasta, você abre as opções avançadas, e então deve clicar em “Abrir janela de comando aqui” conforme abaixo:

Agora vamos executar linhas de comando para instalar a aplicação como serviço, é muito simples, basta chamar o seguinte comando: “ConsoleApp1.exe install” e pronto, o serviço vai ser instalado.

Se abrir o painel de Serviços do Windows, vai visualizar o serviço:

 

E se ao iniciar ele gera log normalmente no visualizador de eventos do Windows:

 

Remoção do serviço

E com o uso do TopShelf a remoção do serviços também acontece de maneira muito fácil, basta dar um “Console1.exe uninstall”, e pronto, serviço removido.

Conclusão

Como podemos ver é fácil utilizar o TopShelf, e como ele roda em cima de uma aplicação console, facilita muito o seu desenvolvimento, principalmente no que diz respeito a depuração.

Espero que tenha sido proveitoso, até a próxima.

 

Referências:

http://docs.topshelf-project.com/en/latest/index.html

https://github.com/Topshelf

Posted in .NET, Blog, C# and tagged .

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *