Desenvolvimento - Visual Basic .NET

Desenvolvendo Windows Services no VS 2005 – Parte 1

Neste primeiro artigo da série Desenvolvendo Windows Services no VS 2005, apresentaremos como criar na prática os serviços windows, que poderão ser posteriormente utilizados em máquinas rodando Windows NT, 2000, XP, 2003, Vista e 2007.

por Cláudio Ralha



Desenvolver serviços para o Windows é um sonho antigo de profissionais que desenvolvem em Visual Basic. Até a chegada da plataforma .NET no ano 2000, era necessário recorrer a ferramentas de terceiros para conseguirmos criar projetos deste tipo. Felizmente, a Microsoft resolveu nos atender, incluindo o suporte a criação de windows services nas últimas versões do Visual Basic e de quebra ainda simplificou bastante o processo de implementação.

Neste primeiro artigo da série Desenvolvendo Windows Services no VS 2005, apresentaremos como criar na prática os serviços windows, que poderão ser posteriormente utilizados em máquinas rodando Windows NT, 2000, XP, 2003, Vista e 2007. Não nos alongaremos por páginas e páginas apresentando toda a teoria envolvida para depois mostrarmos um exemplo simples. Se fosse assim, seria melhor que você simplesmente lê-se a documentação presente na MSDN!

O nosso desejo aqui é fazer justamente o contrário! Primeiro você vai criar algo que resume todos os passos básicos e vai aprender a teoria em doses homeopáticas, à medida que ela se faz necessária para compreender cada etapa. Acreditamos que desta forma, você conseguirá aprender temas considerados por muitos como mais chatos, sem dificuldade. Respire fundo e vamos à prática...

Criando o seu primeiro Windows Service

Graças a presença de templates específicos, a criação de um windows service usando o Visual Studio 2005 é uma tarefa bem simples. Basta seguir o roteiro que apresentamos abaixo:

  1. Execute o Visual Studio 2005.
  2. Clique no link Project da linha Create no painel Recent Projects.
  3. A caixa de diálogo New Project será exibida.
  4. Em Project Types , selecione Visual Basic e a seguir Windows.
  5. No painel Templates, será exibida a lista de templates disponíveis. Selecione Windows Service.
  6. No campo Name, digite MeuPrimeiroWindowsService.
  7. Clique no botão OK.

Nota: o template para criação de Windows service não está presente na distribuição Visual Basic Express. Isto não o impede, entretanto, de baixá-lo usando os recursos de busca online disponíveis na ferramenta. Abordaremos este tema, inclusive, em um artigo futuro.



Criando o novo projeto

O Visual Studio irá criar o conjunto de arquivos necessários para servir de ponto de partida na Solution Explorer. Ao final, você verá a tela a seguir:

IDE exibindo a View Designer

Antes de prosseguirmos, vamos alterar o nome do arquivo que irá conter o código principal do nosso Windows Service. Selecione Service1.vb no Solution Explorer e a seguir altere a sua propriedade File Name para MeuPrimeiroWindowsService.vb através da janela de propriedades. Dê um clique simples no painel da esquerda para selecionar o windows service e a seguir altere sua propriedade Service Name de Service1 para MeuPrimeiroWindowsService.

Feito isso, já podemos verificar o que o Visual Studio adicionou automaticamente em termos de código ao nosso projeto. Para tanto, tecle F7 para ir para o editor de código ou clique no link click here to switch to code view.

Perceba que foi inserido o esqueleto de código para os eventos OnStart e OnStop. Confira na imagem a seguir:

Editor de código exibindo o código gerado automaticamente

Para este exemplo que possui fins meramente didáticos, incluiremos mais dois eventos: OnPause e OnContinue. Tenha em mente que no seu dia a dia, haverá casos em que a presença desses eventos não será suportada, dependendo da natureza do serviço que você está construindo e da criticidade na execução do mesmo. Via de regra, o único evento que estará sempre presente é o OnStart.

A definição de que ações serão possíveis, é feita através de propriedades do Windows Service. Para conferi-las, volte ao View Designer, clicando no botão em forma de formulário na barra de botões do Solution Explorer ou teclando Shift + F7.

Observe na janela de propriedades a presença das propriedades CanHandlePowerEvent, CanHandleSessionChangeEvent, CanPauseAndContinue, CanShutdown e CanStop:

Janela de propriedades

Para oferecermos a possibilidade de o usuário pausar e reiniciar o serviço, precisamos marcar a propriedade CanPauseAndContinue como True. Perceba que por default, a propriedade CanStop já vem marcada dessa forma, o que justifica a inserção automática de código para o evento OnStop e nos permite parar o serviço.

Após configurar as propriedades do seu Windows Service, volte ao editor de código teclando F7. Entre com o seguinte código para os quatro eventos que iremos manipular:

Public Class MeuPrimeiroWindowsService

Protected Overrides Sub OnStart(ByVal args() As String)

EventLog.WriteEntry("O serviço MeuPrimeiroWindowsService foi iniciado.", System.Diagnostics.EventLogEntryType.Information)

End Sub

Protected Overrides Sub OnStop()

EventLog.WriteEntry("O serviço MeuPrimeiroWindowsService foi parado.", System.Diagnostics.EventLogEntryType.Error)

End Sub

Protected Overrides Sub OnPause()

MyBase.OnPause()

EventLog.WriteEntry("O serviço MeuPrimeiroWindowsService foi pausado.", System.Diagnostics.EventLogEntryType.Information)

End Sub

Protected Overrides Sub OnContinue()

MyBase.OnContinue()

EventLog.WriteEntry("O serviço MeuPrimeiroWindowsService foi reiniciado.", System.Diagnostics.EventLogEntryType.Information)

End Sub

End Class

Como você deve ter reparado na listagem, a única coisa que iremos fazer é escrever no log de eventos do Windows uma frase específica para cada ação tomada. Isto é o suficiente para demonstrarmos todo o processo em um primeiro contato sem aumentarmos a complexidade. Em um segundo artigo, demonstraremos algumas das possibilidades que podemos explorar utilizando um windows service, como por exemplo a criação de arquivos, monitoramento de uma pasta específica, envio de emails, etc.

Criando as classes de instalação do Serviço

Agora que já criamos o código mínimo de demonstração de um Web Services, no melhor estilo Hello World!, vamos ver como se faz para criar um instalador de um serviço. Isto porque, ao contrário de outros tipos de projetos codificáveis em .NET, um windows service não pode ser simplesmente copiado para uma pasta qualquer e executado através de um duplo clique. É necessário “instalá-lo”, registrando-o no gerenciador de serviços do sistema. Em termos práticos, isso significa fazer uso de classes especiais preparadas para escrever entradas em posições específicas no registro do windows, de modo a permitir o mapeamento e a execução automática ou manual do windows service no próximo logon do usuário.

Vejamos como implementar essa parte. Retornando uma vez mais ao View Designer (Shift +F7), clique com o botão direito do mouse sobre a janela de propriedades e ative a opção Commands do menu de contexto. Isto ativará a exibição do link Add Installer, caso o mesmo esteja oculto.

Janela de propriedades

Ao clicar no link Add Installer, você verá que o Visual Studio irá adicionar mais arquivos a solução, sendo visível apenas o arquivo ProjectInstaller.vb. No painel da esquerda, observe na figura a seguir que foram adicionados automaticamente os componentes ServiceProcessInstaller e ServiceInstaller a esta classe.

View Designer exibindo os dois componentes adicionados pela opção Add Installer

Felizmente, o Visual Studio 2005 esconde parte da complexidade por trás dos Windows Services, a exemplo do que já faziam as duas versões anteriores. Para esse primeiro contato, vamos abordar apenas a maneira mais simples de resolver os próximos passos.

Clique em ServiceProcessInstaller1 para selecioná-lo e a seguir configure a sua propriedade Account como LocalSystem. Isto define sob qual conta o serviço irá executar. Em nosso exemplo, por questões didáticas, escolhemos a opção com mais privilégios na máquina, dentre as quatro disponíveis (User, LocalLevel, LocalSystem e NetworkLevel). Em windows services reais, por outro lado, esta nem sempre será a melhor escolha.

Para terminar de criarmos o instalador, falta apenas setarmos o nome de exibição e a descrição que desejamos para o nosso windows service. Para tanto, selecione o componente ServiceInstaller1. Configure as suas propriedades Display Name, Description e StartType com os seguintes valores:

Propriedade

Valor

Display Name

Meu primeiro Windows Service

Description

Este é um exemplo de windows service codificado em Visual Studio 2005.

StartType

Automatic

Vencida esta etapa, chegou a vez de compilarmos o projeto. Clique com o botão direito do mouse sobre o nome da solution no Solution Explorer e selecione Build.

Instalando o serviço

Depois de seguirmos todos os passos anteriores, já podemos instalar o nosso windows service para testar a sua execução. Você talvez esteja se perguntando sobre a etapa de depuração do código pela qual deveríamos passar antes de uma instalação efetiva, não é verdade? Pois saiba que, ao contrário de outros tipos de aplicações, os serviços windows precisam ser instalados antes que o desenvolvedor possa depurá-los em busca de eventuais erros. É um detalhe chato, mas infelizmente é assim que funciona... O processo de debugar um windows service será mostrado em um artigo posterior, dada a complexidade dos passos envolvidos.

Para instalarmos, usaremos uma ferramenta de linha de comando chamada InstallUtil presente na instalação do próprio framework .NET. Vejamos o jeito mais simples de realizar esta etapa:

  1. Abra o Windows Explorer e navegue até a pasta onde está o executável do windows service que acabamos de gerar (procure dentro da pasta Bin/Release). Mantenha esta janela aberta.
  2. No menu Iniciar, clique em programas e a seguir no submenu Microsoft Visual Studio 2005.
  3. No submenu Visual Studio Tools, selecione a opção Visual Studio 2005 Command Prompt.
  4. Na janela de prompt, digite installutil seguido de um caracter de espaço.
  5. Arraste o arquivo executável do windows service do Windows Explorer até o prompt. O resultado será parecido com o da figura a seguir:

Prompt do Visual Studio 2005

  1. Tecle Enter e aguarde a instalação. A saída gerada será semelhante a da próxima imagem:

Saída gerada pelo utilitário InstallUtil

Nesse ponto, encerramos o processo de instalação. Feche o prompt do Visual Studio e o Windows Explorer. Vamos agora verificar a presença do nosso windows service no gerenciador de serviços do sistema. Para tanto, siga este roteiro:

  1. No menu Iniciar, clique em Painel de Controle.
  2. Na janela do Painel de controle, dê um duplo clique em Ferramentas Administrativas.
  3. Dê um duplo clique em Serviços.
  4. O gerenciador de serviços será carregado. Localize através da coluna Nome o nosso Windows Service de exemplo.

Gerenciador de serviços

  1. Com o botão direito do mouse, clique sobre o nome do Windows service. No menu de contexto que será mostrado, selecione Propriedades.
  2. A caixa de diálogos de propriedades será exibida.

  1. Observe que o status do serviço no momento é Parado e que existe um botão Iniciar. Esta opção também está disponível no menu de contexto que acabamos de acessar.
  2. Olhe para o relógio do seu Windows, confira a hora e a seguir clique no botão Iniciar.
  3. Aguarde até o serviço ser iniciado. Quando este passo estiver concluído, você verá os botões Parar e Pausar habilitados.
  4. Clique no botão Pausar. Aguarde...
  5. Clique no botão Continuar. Novamente aguarde.
  6. Clique no botão Parar.
  7. Clique no botão OK para fechar a caixa de diálogo.
  8. Feche o gerenciador de serviços.

Conferindo as entradas geradas no log de eventos do sistema

Para visualizar as entradas criadas pelo windows service no log de eventos do sistema, execute o aplicativo Visualizador de Eventos na janela de Ferramentas Administrativas do Painel de Controle.

No painel da esquerda, selecione Aplicativo. Observe as várias entradas geradas pelo nosso windows service na listview apresentada na direita. Execute um duplo clique sobre cada uma das linhas para conferir cada entrada.

Você irá reparar que além das entradas que geramos via código, há entradas criadas automaticamente como a mostrada na janela a seguir:

Isto ocorre porque deixamos a propriedade AutoLog do windows service setada como True (valor default). Quando esta propriedade está setada dessa forma, todas as mudanças de status do windows services e exceções geradas pelo mesmo são logadas. Na prática, isto nos poupa o trabalho de fazer exatamente o que codificamos... J

Conclusão

Como você deve ter percebido, neste artigo focamos apenas a “receita de bolo” que deve ser usada para criar qualquer windows service na plataforma .NET. Através dele, apresentamos um overview do processo e definimos os passos mínimos a serem seguidos até a instalação manual do serviço. Na segunda parte, mostraremos como desisntalar e como depurar Windows services, um tema um pouco mais complexo e que é evitado por muitos autores. Nos artigos seguintes, apresentaremos a criação de windows services que façam uso de recursos interessantes do Visual Studio 2005 e que tenham utilidade no dia a dia. Apresentaremos também como instalá-los criando um projeto de instalação de serviços windows.

Até a próxima!

Cláudio Ralha

Cláudio Ralha

Cláudio Ralha - http://linhadecodigo.com.br/cs2/blogs/ClaudioRalha/default.aspx
Autor dos livros Dominando o Second Life e Segredos do Visual Studio.NET, profissional certificado Microsoft (MCP,MCAD,MCTS e MCPD) e palestrante Microsoft Brasil e Culminis. Já atuou como colunista do Informática etc do Jornal O GLOBO, editor da Revista Infomania e colaborador de várias revistas e sites. No mercado corporativo já desenvolveu para grandes clientes como Petrobras, Shell, Esso, Rede Globo, Furnas, Brascan, ONS, Unibanco e Bolsa de Valores pelas consultorias Accenture, Stefanini, Arcon, ATT/PS, Informaker, Relacional, Value Team e Softtek.