Passo a passo: criar um aplicativo de serviço WindowsWalkthrough: Create a Windows service app

Este artigo demonstra como criar um aplicativo de serviço Windows simples no Visual Studio que escreve mensagens em um log de eventos.This article demonstrates how to create a simple Windows service app in Visual Studio that writes messages to an event log.

Criar um serviçoCreate a service

Para começar, crie o projeto e defina os valores necessários para o serviço funcionar corretamente.To begin, create the project and set values that are required for the service to function correctly.

  1. No Visual Studio, na barra de menus, escolha Arquivo > Novo > Projeto (ou pressione Ctrl+Shift+N) para abrir a caixa de diálogo Novo projeto.In Visual Studio, on the menu bar, choose File > New > Project (or press Ctrl+Shift+N) to open the New Project dialog.

  2. Navegue e selecione o modelo de projeto Serviço Windows.Navigate to and select the Windows Service project template. Expanda Instalado > [Visual C# ou Visual Basic] > Área de Trabalho do Windows ou digite Serviço Windows na caixa de pesquisa no canto superior direito.Expand Installed > [Visual C# or Visual Basic] > Windows Desktop, or type Windows Service in the search box on the upper right.

    Modelo de Serviço Windows na caixa de diálogo Novo Projeto no Visual Studio

    Observação

    Se você não vir o modelo Serviço Windows, talvez seja necessário instalar a carga de trabalho Desenvolvimento de área de trabalho do .NET.If you don't see the Windows Service template, you may need to install the .NET desktop development workload. Na caixa de diálogo Novo Projeto, clique no link que diz Abrir o Instalador do Visual Studio à esquerda.In the New Project dialog, click the link that says Open Visual Studio Installer on the lower left. No Instalador do Visual Studio, selecione a carga de trabalho desenvolvimento para área de trabalho do .NET e, em seguida, escolha Modificar.In Visual Studio Installer, select the .NET desktop development workload and then choose Modify.

  3. Dê ao projeto o nome MyNewService e, em seguida, escolha OK.Name the project MyNewService, and then choose OK.

    O modelo de projeto inclui uma classe de componente denominada Service1 herdada de System.ServiceProcess.ServiceBase.The project template includes a component class named Service1 that inherits from System.ServiceProcess.ServiceBase. Isso inclui grande parte do código de serviço básico, como o código para iniciar o serviço.It includes much of the basic service code, such as the code to start the service.

Renomear o serviçoRename the service

Renomeie o serviço de Service1 para MyNewService.Rename the service from Service1 to MyNewService.

  1. No modo de exibição de Design para Service1.cs (ou Service1.vb), clique no link para alternar para o modo de exibição de código.In the Design view for Service1.cs (or Service1.vb), click the link to switch to code view. Clique com o botão direito do mouse em Service1 e selecione Renomear no menu de contexto.Right-click on Service1 and select Rename from the context menu. Insira MyNewService e, em seguida, pressione Inserir ou clique em Aplicar.Enter MyNewService and then press Enter or click Apply.

  2. Na janela Propriedades para Service1.cs [Design] ou Service1.vb [Design], altere o valor ServiceName para MyNewService.In the Properties window for Service1.cs [Design] or Service1.vb [Design], change the ServiceName value to MyNewService.

  3. 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 rename Service1.vb to MyNewService.vb.

Adicionar recursos ao serviçosAdd 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. O componente EventLog é usado aqui como um exemplo do tipo de componente que pode ser adicionado a um serviço Windows.The EventLog component is used here as an example of the type of component you can add to a Windows service.

Adicionar a funcionalidade de log de eventos personalizadoAdd custom event log functionality

  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. Edite o construtor para definir um log de eventos personalizado: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
    

Definir o que ocorre quando o serviço é iniciadoDefine 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.In the code editor, locate the OnStart method that was automatically overridden when you created the project. Adicione uma linha de código que escreve uma entrada no log de eventos quando o serviço é iniciado:Add a line of code that writes an entry to the event log when the service starts:

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 that triggers 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 that triggers 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 contém o identificador do próximo evento a ser gravado no log de eventos.It contains the identifier of the next event to write into the event log.

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

Adicione um novo método para manipular o evento do temporizador:Add a new method 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 mais informações, consulte System.ComponentModel.BackgroundWorker.For more information, see System.ComponentModel.BackgroundWorker.

Definir o que ocorre quando o serviço é interrompidoDefine what occurs when the service is stopped

Adicione uma linha de código ao método OnStop que adiciona uma entrada ao log de eventos quando o serviço é interrompido:Add a line of code to the OnStop method that adds an entry to the event log when the service is stopped:

eventLog1.WriteEntry("In OnStop.");
Protected Overrides Sub OnStop()
  EventLog1.WriteEntry("In OnStop.")
End Sub

Definir outras ações para o serviçoDefine other actions for the service

Também é possível substituir os métodos OnPause, OnContinue e OnShutdown para definir o processamento adicional para seu componente.You can override the OnPause, OnContinue, and OnShutdown methods to define additional processing for your component. 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.

Definir status do serviçoSet 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ço:To implement service pending status:

  1. Adicione uma instrução using ou declaração Imports para o namespace System.Runtime.InteropServices no arquivo MyNewService.cs ou MyNewService.vb:Add a using statement or Imports declaration for 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(System.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.

Observação

O Gerenciador de Controle de Serviço usa os membros dwWaitHint e dwCheckpoint da estrutura SERVICE_STATUS para determinar quanto tempo esperar 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.

Adicionar instaladores ao serviçoAdd 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.

  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 para 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 faz o serviço ser instalado e executado usando a conta do sistema local.This causes the service to be installed and to run using the local system 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 ao aplicativo de serviço.For more information about installers, see How to: Add Installers to Your service Application.

(Opcional) Defina os parâmetros de inicialização(Optional) Set 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. É possível usar arquivos de configuração de aplicativo para um serviço Windows da mesma forma que faz 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.

Para adicionar parâmetros de inicialização:To add startup parameters:

  1. No método Main no Program.cs ou MyNewService.Designer.vb, adicione um parâmetro de entrada para passar para o construtor do serviço:In the Main method in Program.cs or in MyNewService.Designer.vb, add an input parameter to pass to the service constructor:

    static void Main(string[] args)
    {
        ServiceBase[] ServicesToRun;
        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
    
  2. 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.Length > 0)
         {
             eventSourceName = args[0];
         }
    
         if (args.Length > 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.

  3. 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).

Compilar o serviçoBuild the service

  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 seu projeto aparecem.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 seu projeto e, em seguida, escolha Criar para criar o projeto (ou pressione Ctrl+Shift+B).In Solution Explorer, open the context menu for your project, and then choose Build to build the project (or press Ctrl+Shift+B).

Instalar o serviçoInstall 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, é necessário ter credenciais de administrador no computador no qual está sendo instalado.To install a Windows service, you must have administrator credentials on the computer on which you're installing it.

  1. Abra o Prompt de Comando do Desenvolvedor para Visual Studio com credenciais administrativas.Open Developer Command Prompt for Visual Studio with administrative credentials. Se você estiver usando um mouse, clique com o botão direito dele em Prompt de Comando do Desenvolvedor para VS 2017 no menu Iniciar do Windows e, em seguida, escolha Mais > Executar como administrador.If you’re using a mouse, right-click on Developer Command Prompt for VS 2017 in the Windows Start menu, and then choose More > Run as Administrator.

  2. Na janela Prompt de Comando do Desenvolvedor, navegue até a pasta que contém a saída do seu projeto (por padrão, é o subdiretório \bin\Debug do seu projeto).In the Developer Command Prompt window, navigate to the folder that contains your project's output (by default, it's the \bin\Debug subdirectory of your project).

  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 reports success. Se o sistema não puder localizar InstallUtil.exe, certifique-se de que ele existe 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]\[versão do framework].This tool is installed with the .NET Framework to the folder %windir%\Microsoft.NET\Framework[64]\[framework version]. Por exemplo, o caminho padrão da versão de 32 bits é %windir%\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe.For example, the default path for the 32-bit version is %windir%\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 marcada pública.The installation can fail if the RunInstallerAttribute Class is not present on the ProjectInstaller class, if the attribute is not set to true, or if the ProjectInstaller class is not marked public.

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

Iniciar e executar o serviçoStart and run the service

  1. No Windows, abra o aplicativo da área de trabalho Serviços.In Windows, open the Services desktop app. Pressione Windows+R para abrir a caixa Executar e, em seguida, insira services.msc e pressione Enter ou clique em OK.Press Windows+R to open the Run box, and then enter services.msc and press Enter or click OK.

    Você deve ver o serviço listado em Serviços, exibido em ordem alfabética pelo nome de exibição definido para ele.You should see your service listed in Services, displayed alphabetically by the display name that you set for it.

    MyNewService na janela Serviços.

  2. Em Serviços, abra o menu de atalho para seu serviço e, em seguida, escolha Iniciar.In Services, open the shortcut menu for your service, and then choose Start.

  3. Para interromper o serviço, abra o menu de atalho do serviço e, em seguida, escolha Interromper.To stop the service, 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.

Verificar a saída do log de eventos do seu serviçoVerify the event log output of your service

  1. Abra o Visualizador de Eventos começando a digitar Visualizador de Eventos na caixa de pesquisa na barra de tarefas do Windows e, em seguida, selecionando Visualizador de Eventos nos resultados da pesquisa.Open Event Viewer by starting to type Event Viewer in the search box on the Windows task bar, and then selecting Event Viewer from the search results.

    Dica

    No Visual Studio, é possível acessar logs de eventos abrindo Gerenciador de Servidores (Teclado: Ctrl+Alt+S) e expandindo o nó Logs de Eventos no computador local.In Visual Studio, you can access event logs by opening Server Explorer (Keyboard: Ctrl+Alt+S) and expanding the Event Logs node for the local computer.

  2. No Visualizador de Eventos, expanda Logs de Aplicativos e Serviços.In Event Viewer, expand Applications and Services Logs.

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

    Use o Visualizador de Eventos para ver as entradas do log de eventos

Desinstalar o serviçoUninstall the service

  1. Abra o Prompt de Comando do Desenvolvedor para Visual Studio com credenciais administrativas.Open Developer Command Prompt for Visual Studio 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.

  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 reports 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

Agora que você criou o serviço, crie um programa de instalação autônomo que outras pessoas possam usar para instalar seu serviço Windows.Now that you've created the service, you might want to create a standalone setup program that others can use to install your Windows service. O ClickOnce não dá suporte a serviços Windows, mas é possível usar o WiX Toolset para criar um instalador para um serviço Windows.ClickOnce doesn't support Windows services, but you can use the WiX Toolset to create an installer for a Windows service. Para ver outras ideias, confira Create an installer package (Criar um pacote do instalador).For other ideas, see Create an installer package.

Você pode explorar o uso de um componente ServiceController, que permite 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've 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