Instruções passo a passo: criando um aplicativo de Serviço Windows no Designer de ComponenteWalkthrough: Creating a Windows Service Application in the Component Designer

Este artigo demonstra como criar um aplicativo simples de serviço Windows no Visual Studio que grava mensagens em um log de eventos.This article demonstrates how to create a simple Windows Service application in Visual Studio that writes messages to an event log. Aqui estão as etapas básicas que podem ser executadas para criar e usar o serviço:Here are the basic steps that you perform to create and use your service:

  1. Criando um serviço usando o modelo de projeto de Serviço do Windows e configurando-o.Creating a Service by using the Windows Service project template, and configure it. Esse modelo cria uma classe para você que é herdada de System.ServiceProcess.ServiceBase e grava grande parte do código de serviço básico, como o código para iniciar o serviço.This template creates a class for you that inherits from System.ServiceProcess.ServiceBase and writes much of the basic service code, such as the code to start the service.

  2. Adicionando recursos ao serviço para os procedimentos OnStart e OnStop e substituindo todos os outros métodos que você deseje redefinir.Adding Features to the Service for the OnStart and OnStop procedures, and override any other methods that you want to redefine.

  3. Configurando o status do serviço.Setting Service Status. Por padrão, serviços criados com System.ServiceProcess.ServiceBase implementam apenas um subconjunto dos sinalizadores de status disponíveis.By default, services created with System.ServiceProcess.ServiceBase implement only a subset of the available status flags. Se o serviço levar muito tempo para iniciar, pausar ou interromper, você pode implementar os valores de status como Iniciar pendente ou Parar pendente para indicar que está funcionando em uma operação.If your service takes a long time to start up, pause, or stop, you can implement status values such as Start Pending or Stop Pending to indicate that it's working on an operation.

  4. Adicionando instaladores ao serviço para seu aplicativo de serviço.Adding Installers to the Service for your service application.

  5. (Opcional) Definir parâmetros de inicialização, especifique os argumentos de inicialização padrão e permita que os usuários substituam as configurações padrão ao iniciarem o serviço manualmente.(Optional) Set Startup Parameters, specify default startup arguments, and enable users to override default settings when they start your service manually.

  6. Criando o serviço.Building the Service.

  7. Instalando o serviço no computador local.Installing the Service on the local machine.

  8. Acesse o Gerenciador de Controle de Serviço do Windows e Inicie e execute o serviço.Access the Windows Service Control Manager and Starting and Running the Service.

  9. Desinstalando um Serviço Windows.Uninstalling a Windows Service.

Aviso

O modelo de projeto dos Windows Services que é exigido para este passo a passo não está disponível na edição Express do Visual Studio.The Windows Services project template that is required for this walkthrough is not available in the Express edition of Visual Studio.

Observação

Seu computador pode mostrar diferentes nomes ou locais para alguns dos elementos de interface do usuário do Visual Studio nas instruções a seguir.Your computer might show different names or locations for some of the Visual Studio user interface elements in the following instructions. A edição do Visual Studio que você possui e as configurações que você usa determinam esses elementos.The Visual Studio edition that you have and the settings that you use determine these elements. Para obter mais informações, consulte Personalizando o IDE.For more information, see Personalizing the IDE.

Criando um serviçoCreating a Service

Para começar, você cria o projeto e define valores que são exigidos para que o serviço funcione corretamente.To begin, you create the project and set values that are required for the service to function correctly.

Para criar e configurar o serviçoTo create and configure your service

  1. No Visual Studio, na barra de menus, escolha Arquivo, Novo, Projeto.In Visual Studio, on the menu bar, choose File, New, Project.

    A caixa de diálogo Novo Projeto é aberta.The New Project dialog box opens.

  2. Na lista de modelos de projeto Visual Basic ou Visual C#, escolha Serviço Windows e nomeie o projeto como MyNewService.In the list of Visual Basic or Visual C# project templates, choose Windows Service, and name the project MyNewService. Escolha OK.Choose OK.

    O modelo de projeto adiciona automaticamente uma classe de componente denominada Service1 que é herdada de System.ServiceProcess.ServiceBase.The project template automatically adds a component class named Service1 that inherits from System.ServiceProcess.ServiceBase.

  3. Sobre o menu Editar, escolha Localizar e Substituir, Localizar nos Arquivos (teclado: Ctrl + Shift + F).On the Edit menu, choose Find and Replace, Find in Files (Keyboard: Ctrl+Shift+F). Alterar todas as ocorrências de Service1 para MyNewService.Change all occurrences of Service1 to MyNewService. Você encontrará instâncias no Service1.cs, Program.cs e Service1.Designer.cs (ou seus equivalentes .vb).You’ll find instances in Service1.cs, Program.cs, and Service1.Designer.cs (or their .vb equivalents).

  4. Na janela Propriedades de Service1.cs [Design] ou de Service1.vb [Design], defina o ServiceName e a propriedade (Nome) de Service1 para MyNewService, se ela ainda não estiver definida.In the Properties window for Service1.cs [Design] or Service1.vb [Design], set the ServiceName and the (Name) property for Service1 to MyNewService, if it's not already set.

  5. No Gerenciador de Soluções, renomeie Service1.cs para MyNewService.cs, ou Service1.vb para MyNewService.vb.In Solution Explorer, rename Service1.cs to MyNewService.cs, or Service1.vb to MyNewService.vb.

Adicionando recursos ao serviçoAdding Features to the Service

Na próxima seção, adicione um log de eventos personalizado ao serviço Windows.In this section, you add a custom event log to the Windows service. Os logs de eventos não são associados de forma alguma aos Windows Services.Event logs are not associated in any way with Windows services. Aqui o componente EventLog é usado como um exemplo do tipo de componente que você poderia adicionar a um Windows Service.Here the EventLog component is used as an example of the type of component you could add to a Windows service.

Para adicionar a funcionalidade de log de eventos personalizado ao seu serviçoTo add custom event log functionality to your service

  1. No Gerenciador de Soluções, abra o menu de contexto de MyNewService.cs ou MyNewService.vb e, em seguida, escolha Designer de Exibição.In Solution Explorer, open the context menu for MyNewService.cs or MyNewService.vb, and then choose View Designer.

  2. Na seção Componentes da Caixa de Ferramentas, arraste um componente EventLog para o designer.From the Components section of the Toolbox, drag an EventLog component to the designer.

  3. No Gerenciador de Soluções, abra o menu de contexto de MyNewService.cs ou MyNewService.vb e escolha Exibir Código.In Solution Explorer, open the context menu for MyNewService.cs or MyNewService.vb, and then choose View Code.

  4. Adicione uma declaração para o objeto eventLog na classe MyNewService, logo após a linha que declara a variável components:Add a declaration for the eventLog object in the MyNewService class, right after the line that declares the components variable:

    private System.ComponentModel.IContainer components;
    private System.Diagnostics.EventLog eventLog1;
    
    Private components As System.ComponentModel.IContainer
    Private EventLog1 As System.Diagnostics.EventLog
    
  5. Adicione ou edite o construtor para definir um log de eventos personalizado:Add or edit the constructor to define a custom event log:

    public MyNewService()
    {
    	InitializeComponent();
    	eventLog1 = new System.Diagnostics.EventLog();
    	if (!System.Diagnostics.EventLog.SourceExists("MySource")) 
    	{         
    			System.Diagnostics.EventLog.CreateEventSource(
    				"MySource","MyNewLog");
    	}
    	eventLog1.Source = "MySource";
    	eventLog1.Log = "MyNewLog";
    }
    
    ' To access the constructor in Visual Basic, select New from the
    ' method name drop-down list. 
    Public Sub New()
      MyBase.New()
      InitializeComponent()
      Me.EventLog1 = New System.Diagnostics.EventLog
      If Not System.Diagnostics.EventLog.SourceExists("MySource") Then
          System.Diagnostics.EventLog.CreateEventSource("MySource",
          "MyNewLog")
      End If
      EventLog1.Source = "MySource"
      EventLog1.Log = "MyNewLog"
    End Sub
    

Para definir o que ocorre quando o serviço é iniciadoTo define what occurs when the service starts

  • No Editor do Código, localize o método OnStart que foi substituído automaticamente quando você criou o projeto e substitua o código a seguir.In the Code Editor, locate the OnStart method that was automatically overridden when you created the project, and replace the code with the following. Isso adiciona uma entrada no log de eventos quando o serviço começa a ser executado:This adds an entry to the event log when the service starts running:

    protected override void OnStart(string[] args)
    {
    	eventLog1.WriteEntry("In OnStart");
    }
    
    ' To access the OnStart in Visual Basic, select OnStart from the
    ' method name drop-down list. 
    Protected Overrides Sub OnStart(ByVal args() As String)
      EventLog1.WriteEntry("In OnStart")
    End Sub
    

    Um aplicativo de serviço foi projetado para executado a longo prazo, por isso ele geralmente controla ou monitora algo no sistema.A service application is designed to be long-running, so it usually polls or monitors something in the system. O monitoramento é configurado no método OnStart.The monitoring is set up in the OnStart method. No entanto, o OnStart não realiza, de fato, o monitoramento.However, OnStart doesn’t actually do the monitoring. O método OnStart deve ser retornado ao sistema operacional depois que a operação do serviço tiver começado.The OnStart method must return to the operating system after the service's operation has begun. Ele não deve fazer loop para sempre nem bloqueios.It must not loop forever or block. Para configurar um mecanismo de pesquisa simples, você pode usar o componente System.Timers.Timer da seguinte forma: no método OnStart, defina os parâmetros no componente e, em seguida, defina a propriedade Enabled como true.To set up a simple polling mechanism, you can use the System.Timers.Timer component as follows: In the OnStart method, set parameters on the component, and then set the Enabled property to true. O temporizador gera eventos no seu código periodicamente, no tempo em que seu serviço faria o monitoramento.The timer raises events in your code periodically, at which time your service could do its monitoring. Você pode usar o código a seguir para fazer isso:You can use the following code to do this:

    // Set up a timer to trigger every minute.  
    System.Timers.Timer timer = new System.Timers.Timer();  
    timer.Interval = 60000; // 60 seconds  
    timer.Elapsed += new System.Timers.ElapsedEventHandler(this.OnTimer);  
    timer.Start();  
    
    ' Set up a timer to trigger every minute.  
    Dim timer As System.Timers.Timer = New System.Timers.Timer()  
    timer.Interval = 60000 ' 60 seconds  
    AddHandler timer.Elapsed, AddressOf Me.OnTimer  
    timer.Start()  
    

    Adicione uma variável de membro à classe.Add a member variable to the class. Ela conterá o identificador do próximo evento a ser gravado no log de eventos.It will contain the identifier of the next event to write into the event log.

    private int eventId = 1;
    
    Private eventId As Integer = 1
    

    Adicione o código para manipular o evento do temporizador:Add code to handle the timer event:

    public void OnTimer(object sender, System.Timers.ElapsedEventArgs args)  
    {  
        // TODO: Insert monitoring activities here.  
        eventLog1.WriteEntry("Monitoring the System", EventLogEntryType.Information, eventId++);  
    }  
    
    Private Sub OnTimer(sender As Object, e As Timers.ElapsedEventArgs)  
        ' TODO: Insert monitoring activities here.  
        eventLog1.WriteEntry("Monitoring the System", EventLogEntryType.Information, eventId)  
        eventId = eventId + 1  
    End Sub  
    

    Você pode desejar executar tarefas usando segmentos de trabalho em segundo plano em vez de executar todo o seu trabalho no thread principal.You might want to perform tasks by using background worker threads instead of running all your work on the main thread. Para obter um exemplo disso, consulte a página de referência System.ServiceProcess.ServiceBase.For an example of this, see the System.ServiceProcess.ServiceBase reference page.

Para definir o que ocorre quando o serviço é interrompidoTo define what occurs when the service is stopped

  • Substitua o código para o método OnStop pelo seguinte.Replace the code for the OnStop method with the following. Isso adiciona uma entrada no log de eventos quando o serviço é interrompido:This adds an entry to the event log when the service is stopped:

    protected override void OnStop()
    {
    	eventLog1.WriteEntry("In onStop.");
    }
    
    Protected Overrides Sub OnStop()
      EventLog1.WriteEntry("In OnStop.")
    End Sub
    

Na próxima seção, você pode substituir os métodos OnPause, OnContinue e OnShutdown para definir o processamento adicional para o componente.In the next section, you can override the OnPause, OnContinue, and OnShutdown methods to define additional processing for your component.

Para definir outras ações para o serviçoTo define other actions for the service

  • Localize o método que deseja manipular, e substitua-o para definir o que você quer que aconteça.Locate the method that you want to handle, and override it to define what you want to occur.

    O código a seguir mostra como você pode substituir o método OnContinue:The following code shows how you can override the OnContinue method:

    protected override void OnContinue()
    {
    	eventLog1.WriteEntry("In OnContinue.");
    }  
    
    Protected Overrides Sub OnContinue()
      EventLog1.WriteEntry("In OnContinue.")
    End Sub
    

Algumas ações personalizadas precisam ocorrer quando um serviço Windows é instalado pela classe Installer.Some custom actions have to occur when a Windows service is installed by the Installer class. O Visual Studio pode criar esses instaladores especificamente para um Windows Service e adicioná-los ao seu projeto.Visual Studio can create these installers specifically for a Windows service and add them to your project.

Definindo o status de serviçoSetting Service Status

Serviços relatam seu status para o Gerenciador de Controle de Serviço, para que os usuários possam determinar se um serviço está funcionando corretamente.Services report their status to the Service Control Manager, so that users can tell whether a service is functioning correctly. Por padrão, os serviços herdados de ServiceBase relatam um conjunto limitado de configurações de status, inclusive Interrompido, Pausado e Em execução.By default, services that inherit from ServiceBase report a limited set of status settings, including Stopped, Paused, and Running. Se um serviço demora um pouco para inicializar, ele pode ser útil relatar um status Iniciar pendente.If a service takes a little while to start up, it might be helpful to report a Start Pending status. Você também pode implementar as configurações de status Iniciar Pendente e Parar Pendente, adicionando o código que chama a função SetServiceStatus do Windows.You can also implement the Start Pending and Stop Pending status settings by adding code that calls into the Windows SetServiceStatus function.

Para implementar o status pendente do serviçoTo implement service pending status

  1. Adicione uma instrução using ou declaração Imports ao namespace System.Runtime.InteropServices no arquivo MyNewService.cs ou MyNewService.vb:Add a using statement or Imports declaration to the System.Runtime.InteropServices namespace in the MyNewService.cs or MyNewService.vb file:

    using System.Runtime.InteropServices;  
    
    Imports System.Runtime.InteropServices  
    
  2. Adicione o seguinte código ao MyNewService.cs declarar os valores de ServiceState e para adicionar uma estrutura ao status, que você usará em uma chamada de invocação de plataforma:Add the following code to MyNewService.cs to declare the ServiceState values and to add a structure for the status, which you'll use in a platform invoke call:

    public enum ServiceState  
      {  
          SERVICE_STOPPED = 0x00000001,  
          SERVICE_START_PENDING = 0x00000002,  
          SERVICE_STOP_PENDING = 0x00000003,  
          SERVICE_RUNNING = 0x00000004,  
          SERVICE_CONTINUE_PENDING = 0x00000005,  
          SERVICE_PAUSE_PENDING = 0x00000006,  
          SERVICE_PAUSED = 0x00000007,  
      }  
    
      [StructLayout(LayoutKind.Sequential)]  
      public struct ServiceStatus  
      {  
          public int dwServiceType;  
          public ServiceState dwCurrentState;  
          public int dwControlsAccepted;  
          public int dwWin32ExitCode;  
          public int dwServiceSpecificExitCode;  
          public int dwCheckPoint;  
          public int dwWaitHint;  
      };  
    
    Public Enum ServiceState  
        SERVICE_STOPPED = 1  
        SERVICE_START_PENDING = 2  
        SERVICE_STOP_PENDING = 3  
        SERVICE_RUNNING = 4  
        SERVICE_CONTINUE_PENDING = 5  
        SERVICE_PAUSE_PENDING = 6  
        SERVICE_PAUSED = 7  
    End Enum  
    
    <StructLayout(LayoutKind.Sequential)>  
    Public Structure ServiceStatus  
        Public dwServiceType As Long  
        Public dwCurrentState As ServiceState  
        Public dwControlsAccepted As Long  
        Public dwWin32ExitCode As Long  
        Public dwServiceSpecificExitCode As Long  
        Public dwCheckPoint As Long  
        Public dwWaitHint As Long  
    End Structure  
    
  3. Agora, na classe MyNewService, declare a função SetServiceStatus usando a inovação de plataforma:Now, in the MyNewService class, declare the SetServiceStatus function by using platform invoke:

    [DllImport("advapi32.dll", SetLastError=true)]  
            private static extern bool SetServiceStatus(IntPtr handle, ref ServiceStatus serviceStatus);  
    
    Declare Auto Function SetServiceStatus Lib "advapi32.dll" (ByVal handle As IntPtr, ByRef serviceStatus As ServiceStatus) As Boolean  
    
  4. Para implementar o status Iniciar pendente, adicione o seguinte código ao início do método OnStart:To implement the Start Pending status, add the following code to the beginning of the OnStart method:

    // Update the service state to Start Pending.  
    ServiceStatus serviceStatus = new ServiceStatus();  
    serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING;  
    serviceStatus.dwWaitHint = 100000;  
    SetServiceStatus(this.ServiceHandle, ref serviceStatus);  
    
    ' Update the service state to Start Pending.  
    Dim serviceStatus As ServiceStatus = New ServiceStatus()  
    serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING  
    serviceStatus.dwWaitHint = 100000  
    SetServiceStatus(Me.ServiceHandle, serviceStatus)  
    
  5. Adicione o código para definir o status Em execução no final do método OnStart.Add code to set the status to Running at the end of the OnStart method.

    // Update the service state to Running.  
    serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING;  
    SetServiceStatus(this.ServiceHandle, ref serviceStatus);  
    
    ' Update the service state to Running.  
    serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING  
    SetServiceStatus(Me.ServiceHandle, serviceStatus)  
    
  6. (Opcional) Repita esse procedimento para o método OnStop.(Optional) Repeat this procedure for the OnStop method.

Cuidado

O Gerenciador de Controle de Serviço usa os membros dwWaitHint e dwCheckpoint da estrutura SERVICE_STATUS para determinar o tempo de espera para que um Serviço Windows seja iniciado ou desligado.The Service Control Manager uses the dwWaitHint and dwCheckpoint members of the SERVICE_STATUS structure to determine how much time to wait for a Windows Service to start or shut down. Se os métodos OnStart e OnStop tiverem uma execução longa, o serviço poderá solicitar mais tempo chamando SetServiceStatus novamente com um valor de dwCheckPoint incrementado.If your OnStart and OnStop methods run long, your service can request more time by calling SetServiceStatus again with an incremented dwCheckPoint value.

Adicionando instaladores ao serviçoAdding Installers to the Service

Antes de executar um serviço Windows, é necessário instalá-lo, o que o registra com o Gerenciador de Controle de Serviço.Before you can run a Windows Service, you need to install it, which registers it with the Service Control Manager. Você pode adicionar instaladores ao seu projeto que lida com os detalhes de registro.You can add installers to your project that handle the registration details.

Para criar os instaladores para seu serviçoTo create the installers for your service

  1. No Gerenciador de Soluções, abra o menu de contexto de MyNewService.cs ou MyNewService.vb e, em seguida, escolha Designer de Exibição.In Solution Explorer, open the context menu for MyNewService.cs or MyNewService.vb, and then choose View Designer.

  2. Clique no plano de fundo do designer para selecionar o próprio serviço, e não um de seus conteúdos.Click the background of the designer to select the service itself, instead of any of its contents.

  3. Abra o menu de contexto da janela do designer (se você estiver usando um dispositivo apontador, clique com o botão direito do mouse dentro da janela) e, em seguida, escolha Adicionar Instalador.Open the context menu for the designer window (if you’re using a pointing device, right-click inside the window), and then choose Add Installer.

    Por padrão, uma classe de componente que contém dois instaladores é adicionada ao projeto.By default, a component class that contains two installers is added to your project. O componente é chamado ProjectInstaller e os instaladores que ele contém são o instalador do serviço e o instalador do processo associado ao serviço.The component is named ProjectInstaller, and the installers it contains are the installer for your service and the installer for the service's associated process.

  4. Na exibição Design de ProjectInstaller, escolha serviceInstaller1 para um projeto Visual C# ou ServiceInstaller1 para um projeto Visual Basic.In Design view for ProjectInstaller, choose serviceInstaller1 for a Visual C# project, or ServiceInstaller1 for a Visual Basic project.

  5. Na janela Propriedades, verifique se a propriedade ServiceName está definida como MyNewService.In the Properties window, make sure the ServiceName property is set to MyNewService.

  6. Defina a propriedade Descrição para um texto, como "Um exemplo de serviço".Set the Description property to some text, such as "A sample service". Este texto é exibido na janela Serviços e ajuda o usuário a identificar o serviço e entender para que ele é usado.This text appears in the Services window and helps the user identify the service and understand what it’s used for.

  7. Defina a propriedade DisplayName para o texto que você deseja exibir na janela Serviços na coluna Nome.Set the DisplayName property to the text that you want to appear in the Services window in the Name column. Por exemplo, você pode inserir "Nome de exibição do MyNewService".For example, you can enter "MyNewService Display Name". Esse nome pode ser diferente da propriedade ServiceName, que é o nome usado pelo sistema (por exemplo, quando você usa o comando net start para iniciar o serviço).This name can be different from the ServiceName property, which is the name used by the system (for example, when you use the net start command to start your service).

  8. Defina a propriedade StartType como Automatic.Set the StartType property to Automatic.

    Propriedades do instalador de um Serviço WindowsInstaller Properties for a Windows Service

  9. No designer, escolha serviceProcessInstaller1 para um projeto Visual C# ou ServiceProcessInstaller1 para um projeto Visual Basic.In the designer, choose serviceProcessInstaller1 for a Visual C# project, or ServiceProcessInstaller1 for a Visual Basic project. Defina a propriedade Account como LocalSystem.Set the Account property to LocalSystem. Isso fará com que o serviço seja instalado e executado em uma conta de serviço local.This will cause the service to be installed and to run on a local service account.

    Importante

    A conta LocalSystem tem amplas permissões, incluindo a capacidade de gravar no log de eventos.The LocalSystem account has broad permissions, including the ability to write to the event log. Use essa conta com cuidado, pois ela pode aumentar o risco de ataques de software mal-intencionado.Use this account with caution, because it might increase your risk of attacks from malicious software. Para outras tarefas, pense em usar a conta LocalService, que atua como um usuário não privilegiado no computador local e apresenta credenciais anônimas a qualquer servidor remoto.For other tasks, consider using the LocalService account, which acts as a non-privileged user on the local computer and presents anonymous credentials to any remote server. Este exemplo falhará se você tentar usar a conta LocalService, pois ele precisa de permissão para gravar no log de eventos.This example fails if you try to use the LocalService account, because it needs permission to write to the event log.

    Para obter mais informações sobre instaladores, confira Como adicionar instaladores no seu aplicativo de serviço.For more information about installers, see How to: Add Installers to Your Service Application.

Defina os parâmetros de inicializaçãoSet Startup Parameters

Um serviço Windows, como qualquer outro executável, pode aceitar argumentos de linha de comando ou parâmetros de inicialização.A Windows Service, like any other executable, can accept command-line arguments, or startup parameters. Quando você adiciona o código aos parâmetros de inicialização do processo, os usuários podem iniciar o serviço com seus próprios parâmetros de inicialização personalizada usando a janela de Serviços no Painel de Controle do Windows.When you add code to process startup parameters, users can start your service with their own custom startup parameters by using the Services window in the Windows Control Panel. No entanto, esses parâmetros de inicialização não são persistentes na próxima vez em que o serviço é iniciado.However, these startup parameters are not persisted the next time the service starts. Para definir os parâmetros de inicialização permanentemente, você pode defini-las no registro, conforme mostrado neste procedimento.To set startup parameters permanently, you can set them in the registry, as shown in this procedure.

Observação

Antes de decidir adicionar parâmetros de inicialização, considere se esta é a melhor maneira de passar informações para o serviço.Before you decide to add startup parameters, consider whether that is the best way to pass information to your service. Embora os parâmetros de inicialização sejam fáceis de usar e analisar, e os usuários possam substituí-los facilmente, eles podem ser mais difíceis para os usuários descobrem e usarem sem a documentação.Although startup parameters are easy to use and to parse, and users can easily override them, they might be harder for users to discover and use without documentation. Em geral, se o serviço exigir mais do que apenas alguns parâmetros de inicialização, você deve considerar usar o registro ou um arquivo de configuração.Generally, if your service requires more than just a few startup parameters, you should consider using the registry or a configuration file instead. Cada serviço Windows tem uma entrada no registro em HKLM\System\CurrentControlSet\services.Every Windows Service has an entry in the registry under HKLM\System\CurrentControlSet\services. Na chave do serviço, você pode usar a subchave de Parâmetros para armazenar as informações que o serviço pode acessar.Under the service's key, you can use the Parameters subkey to store information that your service can access. Você pode usar arquivos de configuração do aplicativo para um serviço Windows da mesma forma que faria para outros tipos de programas.You can use application configuration files for a Windows Service the same way you do for other types of programs. Para obter um exemplo de código, consulte AppSettings.For example code, see AppSettings.

Adicionando parâmetros de inicializaçãoAdding startup parameters

  1. No método Main no Program.cs ou MyNewService.Designer.vb, adicione um argumento da linha de comando:In the Main method in Program.cs or in MyNewService.Designer.vb, add an argument for the command line:
static void Main(string[] args)
{
    ServiceBase[] ServicesToRun = new ServiceBase[] { new MyNewService(args) };
    ServiceBase.Run(ServicesToRun);
}
Shared Sub Main(ByVal cmdArgs() As String)
    Dim ServicesToRun() As System.ServiceProcess.ServiceBase = New System.ServiceProcess.ServiceBase() {New MyNewServiceVB(cmdArgs)}
    System.ServiceProcess.ServiceBase.Run(ServicesToRun)
End Sub
  1. Altere o construtor MyNewService da seguinte maneira:Change the MyNewService constructor as follows:
public MyNewService(string[] args)
{
    InitializeComponent();
    string eventSourceName = "MySource";
    string logName = "MyNewLog";
    if (args.Count() > 0) 
    {
        eventSourceName = args[0];
    }
    if (args.Count() > 1)
    {
        logName = args[1];
    }
    eventLog1 = new System.Diagnostics.EventLog();
    if (!System.Diagnostics.EventLog.SourceExists(eventSourceName))
    {
        System.Diagnostics.EventLog.CreateEventSource(eventSourceName, logName);
    }
    eventLog1.Source = eventSourceName;
    eventLog1.Log = logName;        
}
Public Sub New(ByVal cmdArgs() As String)
    InitializeComponent()
    Dim eventSourceName As String = "MySource"
    Dim logName As String = "MyNewLog"
    If (cmdArgs.Count() > 0) Then
        eventSourceName = cmdArgs(0)
    End If
    If (cmdArgs.Count() > 1) Then
        logName = cmdArgs(1)
    End If
    eventLog1 = New System.Diagnostics.EventLog()
    If (Not System.Diagnostics.EventLog.SourceExists(eventSourceName)) Then
        System.Diagnostics.EventLog.CreateEventSource(eventSourceName, logName)
    End If
    eventLog1.Source = eventSourceName
    eventLog1.Log = logName
End Sub  

Esse código define o nome de origem e de log de eventos de acordo com os parâmetros de inicialização fornecidos ou usa os valores padrão se nenhum argumento for especificado.This code sets the event source and log name according to the supplied startup parameters, or uses default values if no arguments are supplied.

  1. Para especificar os argumentos de linha de comando, adicione o seguinte código à classe ProjectInstaller em ProjectInstaller.cs ou ProjectInstaller.vb:To specify the command-line arguments, add the following code to the ProjectInstaller class in ProjectInstaller.cs or ProjectInstaller.vb:
protected override void OnBeforeInstall(IDictionary savedState)
{
    string parameter = "MySource1\" \"MyLogFile1";
    Context.Parameters["assemblypath"] = "\"" + Context.Parameters["assemblypath"] + "\" \"" + parameter + "\"";
    base.OnBeforeInstall(savedState);
}
Protected Overrides Sub OnBeforeInstall(ByVal savedState As IDictionary)
    Dim parameter As String = "MySource1"" ""MyLogFile1"
    Context.Parameters("assemblypath") = """" + Context.Parameters("assemblypath") + """ """ + parameter + """"
    MyBase.OnBeforeInstall(savedState)
End Sub  

Esse código modifica a chave do Registro ImagePath, que normalmente contém o caminho completo para o executável do Serviço Windows, adicionando os valores de parâmetro padrão.This code modifies the ImagePath registry key, which typically contains the full path to the executable for the Windows Service, by adding the default parameter values. As aspas em torno do caminho (e em torno de cada parâmetro individual) são necessárias para o serviço ser inicializado corretamente.The quotation marks around the path (and around each individual parameter) are required for the service to start up correctly. Para alterar os parâmetros de inicialização desse Serviço Windows, os usuários podem alterar os parâmetros fornecidos na chave do Registro ImagePath, embora seja melhor alterá-los de forma programática e expor a funcionalidade aos usuários de uma maneira amigável (por exemplo, em um utilitário de gerenciamento ou de configuração).To change the startup parameters for this Windows Service, users can change the parameters given in the ImagePath registry key, although the better way is to change it programmatically and expose the functionality to users in a friendly way (for example, in a management or configuration utility).

Criando o serviçoBuilding the Service

Para criar o projeto de serviçoTo build your service project

  1. No Gerenciador de Soluções, abra o menu de contexto do projeto e selecione Propriedades.In Solution Explorer, open the context menu for your project, and then choose Properties. As páginas de propriedades do projeto são exibidas.The property pages for your project appear.

  2. Na guia Aplicativo, na lista Objeto de inicialização, escolha MyNewService.Program.On the Application tab, in the Startup object list, choose MyNewService.Program.

  3. No Gerenciador de Soluções, abra o menu de contexto do projeto e escolha Compilar para compilar o projeto (teclado: Ctrl + Shift + B).In Solution Explorer, open the context menu for your project, and then choose Build to build the project (Keyboard: Ctrl+Shift+B).

Instalando o serviçoInstalling the Service

Agora que você criou o serviço Windows, poderá instalá-lo.Now that you've built the Windows service, you can install it. Para instalar um serviço Windows, você deve ter credenciais administrativas no computador no qual está sendo instalado.To install a Windows service, you must have administrative credentials on the computer on which you're installing it.

Para instalar um serviço WindowsTo install a Windows Service

  1. No Windows 7 e no Windows Server, abra o Prompt de Comando do Desenvolvedor nas Ferramentas do Visual Studio no menu Iniciar.In Windows 7 and Windows Server, open the Developer Command Prompt under Visual Studio Tools in the Start menu. No Windows 8 ou no Windows 8.1, escolha o bloco Ferramentas do Visual Studio na tela Iniciar e, em seguida, execute o Prompt de Comando do Desenvolvedor com credenciais administrativas.In Windows 8 or Windows 8.1, choose the Visual Studio Tools tile on the Start screen, and then run Developer Command Prompt with administrative credentials. (Se você estiver usando um mouse, clique com o botão direito do mouse em Prompt de Comando do Desenvolvedor e, em seguida, escolha Executar como Administrador.)(If you’re using a mouse, right-click on Developer Command Prompt, and then choose Run as Administrator.)

  2. Na janela do Prompt de comando, navegue até a pasta que contém a saída do projeto.In the Command Prompt window, navigate to the folder that contains your project's output. Por exemplo, na pasta Meus Documentos, navegue até Visual Studio 2013\Projects\MyNewService\bin\Debug.For example, under your My Documents folder, navigate to Visual Studio 2013\Projects\MyNewService\bin\Debug.

  3. Insira o seguinte comando:Enter the following command:

    installutil.exe MyNewService.exe  
    

    Se o serviço for instalado com êxito, installutil.exe relatará o sucesso.If the service installs successfully, installutil.exe will report success. Se o sistema não puder localizar o InstallUtil.exe, certifique-se de que ela exista no seu computador.If the system could not find InstallUtil.exe, make sure that it exists on your computer. Essa ferramenta é instalada com o .NET Framework na pasta %WINDIR%\Microsoft.NET\Framework[64]\framework_version.This tool is installed with the .NET Framework to the folder %WINDIR%\Microsoft.NET\Framework[64]\framework_version. Por exemplo, é o caminho padrão para a versão de 32 bits do .NET Framework 4, 4.5, 4.5.1 e 4.5.2 é C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe.For example, the default path for the 32-bit version of the .NET Framework 4, 4.5, 4.5.1, and 4.5.2 is C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe.

    Se o processo de installutil.exe relatar falha, verifique o log de instalação para saber o motivo.If the installutil.exe process reports failure, check the install log to find out why. Por padrão o log está na mesma pasta que o executável do serviço.By default the log is in the same folder as the service executable. A instalação poderá falhar se a classe RunInstallerAttribute não estiver presente na classe ProjectInstaller, se o atributo não estiver definido como true ou se a classe ProjectInstaller não for public.The installation can fail if the RunInstallerAttribute Class is not present on the ProjectInstaller class, or else the attribute is not set to true, or else the ProjectInstaller class is not public.

    Para obter mais informações, confira Como instalar e desinstalar serviços.For more information, see How to: Install and Uninstall Services.

Iniciando e executando o serviçoStarting and Running the Service

Para iniciar e interromper o serviçoTo start and stop your service

  1. No Windows, abra a tela Iniciar ou o menu Iniciar e digite services.msc.In Windows, open the Start screen or Start menu, and type services.msc.

    Agora você deverá ver MyNewService listado na janela Serviços.You should now see MyNewService listed in the Services window.

    MyNewService na janela Serviços.MyNewService in the Services window.

  2. Na janela Serviços, abra o menu de atalho do serviço e escolha Iniciar.In the Services window, open the shortcut menu for your service, and then choose Start.

  3. Abra o menu de atalho do serviço e, em seguida, escolha Parar.Open the shortcut menu for the service, and then choose Stop.

  4. (Opcional) Na linha de comando, você pode usar os comandos net start``ServiceName e net stop``ServiceName para iniciar e parar o serviço.(Optional) From the command line, you can use the commands net start``ServiceName and net stop``ServiceName to start and stop your service.

Para verificar a saído do log de eventos do seu serviçoTo verify the event log output of your service

  1. No Visual Studio, abra o Gerenciador de Servidores (teclado: Ctrl + Alt + S) e acesse o nó Logs de Eventos do computador local.In Visual Studio, open Server Explorer (Keyboard: Ctrl+Alt+S), and access the Event Logs node for the local computer.

  2. Localize a listagem de MyNewLog (ou MyLogFile1, se você usou o procedimento opcional para adicionar argumentos de linha de comando) e expanda-a.Locate the listing for MyNewLog (or MyLogFile1, if you used the optional procedure to add command-line arguments) and expand it. Você deverá ver entradas para as duas ações (iniciar e parar) que seu serviço executou.You should see entries for the two actions (start and stop) your service has performed.

    Use o Visualizador de Eventos para ver as entradas no log de eventos.Use the Event Viewer to see the event log entries.

Desinstalando um serviço WindowsUninstalling a Windows Service

Para desinstalar o serviçoTo uninstall your service

  1. Abra um prompt de comando do desenvolvedor com credenciais administrativas.Open a developer command prompt with administrative credentials.

  2. Na janela do Prompt de comando, navegue até a pasta que contém a saída do projeto.In the Command Prompt window, navigate to the folder that contains your project's output. Por exemplo, na pasta Meus Documentos, navegue até Visual Studio 2013\Projects\MyNewService\bin\Debug.For example, under your My Documents folder, navigate to Visual Studio 2013\Projects\MyNewService\bin\Debug.

  3. Insira o seguinte comando:Enter the following command:

    installutil.exe /u MyNewService.exe  
    

    Se o serviço for desinstalado com êxito, installutil.exe relatará que seu serviço foi removido com sucesso.If the service uninstalls successfully, installutil.exe will report that your service was successfully removed. Para obter mais informações, confira Como instalar e desinstalar serviços.For more information, see How to: Install and Uninstall Services.

Próximas etapasNext Steps

Você pode criar um programa de instalação autônomo que outras pessoas podem usar para instalar o serviço Windows, mas ele necessita de etapas adicionais.You can create a standalone setup program that others can use to install your Windows service, but it requires additional steps. O ClickOnce não oferece suporte aos Windows Services, de modo que não é possível usar o Assistente de Publicação.ClickOnce doesn't support Windows services, so you can't use the Publish Wizard. Você pode usar a edição completa do InstallShield, que não é fornecido pela Microsoft.You can use a full edition of InstallShield, which Microsoft doesn't provide. Para obter mais informações sobre o InstallShield, confira InstallShield Limited Edition.For more information about InstallShield, see InstallShield Limited Edition. Você também pode usar o Conjunto de ferramentas XML do Windows Installer para criar um instalador para um serviço Windows.You can also use the Windows Installer XML Toolset to create an installer for a Windows service.

Você pode explorar o uso de um componente ServiceController para permitir que você envie comandos ao serviço que instalou.You might explore the use of a ServiceController component, which enables you to send commands to the service you have installed.

É possível usar um instalador para criar um log de eventos quando o aplicativo é instalado, em vez de criá-lo quando o aplicativo é executado.You can use an installer to create an event log when the application is installed instead of creating the event log when the application runs. Além disso, o log de eventos será excluído pelo instalador quando o aplicativo for desinstalado.Additionally, the event log will be deleted by the installer when the application is uninstalled. Para obter mais informações, consulte a página de referência EventLogInstaller.For more information, see the EventLogInstaller reference page.

Consulte tambémSee Also

Aplicativos do Serviço WindowsWindows Service Applications
Introdução aos Aplicativos de Serviço WindowsIntroduction to Windows Service Applications
Como depurar aplicativos de Serviço WindowsHow to: Debug Windows Service Applications
Serviços (Windows)Services (Windows)