Olá pessoal, neste artigo mostrarei como criar um serviço do Windows, de forma simples e rápida, que irá gravar em um arquivo de log quando o serviço for iniciado e quando ele for parado.
Faço este artigo com base na videoaula de Luiz Maia, do Portal Linha de Código, mediante autorização do mesmo. Acompanhem o passo-a-passo:
Para criarmos este serviço, usaremos a linguagem C#, o .NET Framework 3.5, o namespace System.IO e o utilitário de instalação InstallUtil. Usaremos também os métodos OnStart e OnStop para criarmos nosso arquivo de log.
Como o Windows Service, como o próprio nome diz, é um serviço do Windows, ele não tem interface e roda em segundo plano em nossa máquina. Uma observação a se fazer é que o Windows Service não roda nos sistemas operacionais Windows 95, 98 e ME. Roda a partir do NT e 2000.
O Windows Service é essencial quando desejarmos monitorar o teclado, arquivos e pastas ou mesmo criar arquivos de log (que é o que faremos) quando determinados eventos ocorrerem. Ele roda em perfeita harmonia com o sistema operacional e usa um gerenciador de serviços. Para acessarmos este gerenciador no Windows XP, abra o menu Iniciar e clique em Executar ou tecle Windows + R e digite services.msc para que o gerenciador se abra:
Aqui vemos todos os serviços do sistema operacional, perceba que nem todos estão com o status Iniciado.
Abra o Visual Studio, vá em File > New Project (CTRL + SHIFT + N), escolha o template Windows Service, dê o nome de ExemploWindowsService e clique em OK.
Na tela que aparece, clique em cima da mensagem click here to switch to code view para ir à tela de códigos. Nela você verá os métodos OnStart e OnStop, são neles que iremos codificar. Antes disso, declare o namespace System.IO:
using System.IO;
Agora crie uma variável global, fora de qualquer método, do tipo da classe StreamWriter, que será nosso arquivo de log:
StreamWriter arquivoLog;
Agora no método OnStart, digite o seguinte código:
protected override void OnStart(string[] args)
{
//Instancie a variável criada, que receberá como parâmetro o caminho de meu arquivo de texto,
//que será o log destes eventos do meu serviço, e o parâmetro encoding com o valor true.
arquivoLog = new StreamWriter(@"C:\testeLog.txt", true);
//Escrevo no arquivo texto no momento que o arquivo for iniciado
arquivoLog.WriteLine("Serviço iniciado em: " + DateTime.Now);
//Limpo o buffer com o método Flush
arquivoLog.Flush();
}
Assim, quando eu iniciar meu serviço pelo gerenciador de serviços (ou quando o sistema operacional for iniciado) será criado o arquivo testeLog.txt e escrito uma linha com a hora exata em que o serviço foi iniciado. Perceba que não fechamos o arquivo para que o mesmo torne-se acessível ao método OnStop, que codificaremos a seguir.
Agora no método OnStop, digite o seguinte código:
protected override void OnStop()
{
//Escrevo no arquivo texto no momento exato que o arquivo for encerrado
arquivoLog.WriteLine("Serviço encerrado em: " + DateTime.Now);
//Fecho o arquivo com o método Close
arquivoLog.Close();
}
Agora sim, neste método escrevo uma linha no momento que o serviço for finalizado e chamo o método Close() para fechar o arquivo.
Se mandarmos executar o projeto não será suficiente para vermos nosso serviço rodando, já que ele é um serviço, ou seja, não tem interface alguma. Precisamos instalá-lo e iniciá-lo para que o mesmo entre em ação.
Vamos então criar um instalador. Para isso, volte ao modo Design, clique com o botão direito em qualquer parte cinza da tela e clique em Add Installer. Será gerado dois componentes, um que é o instalador de processos de serviços e outro que é o instalador de serviços:
Na próxima parte iremos ver os conceitos e a explicação sobre os tipos de contas de sistema em que podemos vincular ao nosso Windows Service, e veremos a conclusão deste exemplo.
Aguardem!