Esta tem sido uma semana forte com os desenvolvimentos em .NET, principalmente utilizando Windows Services. Seu uso é muito útil quanto ao auto-gerenciamento proporcionado pelo sistema operacional windows, além da gestão de eventos. Só tem um ponto que me incomoda no desenvolvimento de Serviços: DEBUG! A forma indicada pela própria Microsoft para isso é utilizar a função de Attach, porém isso requer que o serviço seja instalado e esteja em execução na máquina. Venhamos e convenhamos, imagina fazer isso a cada linha de código que você altere e queira ver o resultado.
Outra solução seria fazer comentar na classe Program a o processo de execução do de Service, criar uma instancia da classe Service e chamar o seu método principal, que inicie seu processo. Mas também não é muito prático, pois no momento de distribuir e instalar seu serviço, é preciso “lembrar” de descomentar seu código.
Então decidi pesquisar algumas outras alternativas. Após uma busca incessante na internet encontrei algumas alternativas, algumas delas bastante complexas, até que encontrei no blog Ardalis uma solução bastante simples e funcional. Basicamente as soluções encontradas se baseiam em identificar via código se a aplicação está sendo realizada em modo Debug (UserInteractive) ou não, e caso esteja a classe não deve ser executada como serviço, mas como application (no caso, Console Application).
Passo 1: Criar um novo projeto como Windows Service
Passo 2: Apagar a classe Program.cs
Passo 3: Inserir na classe Service1.cs o seguinte método Main:
/// /// Pode ser executado como Serviço ou Console /// /// private static void Main(string[] args) { var service = new Service1(); if (Environment.UserInteractive) { service.OnStart(args); Console.WriteLine("Pressione qualquer tecla para encerrar o programa..."); Console.Read(); service.OnStop(); } else { Run(service); } }
Passo 4: Configurar o projeto para ser executado como Console Application. Acessar o menu Project, …Properties…. Na janela de Propriedades, alterar Output type para Console Application.
Pronto! Desta forma ao executar a aplicação em modo Debug será aberta uma janela de Console do MS-DOS, mantendo assim a aplicação aberta e executando enquanto não seja teclado nada. Assim você pode utilizar breakpoint e as ferramentas de análise de variáveis para debugar sua aplicação, e após a mesma ser instalada como serviço, será executada da forma tradicional. Inclusive você pode utilizar os comandos Console.Write para escrever na janela de Console, ou Debug.Write para escrever na janela Output do Visual Studio.