Samouczek: Tworzenie aplikacji usługi systemu WindowsTutorial: Create a Windows service app

W tym artykule pokazano, jak utworzyć aplikację usługi systemu Windows w programie Visual Studio, która zapisuje komunikaty w dzienniku zdarzeń.This article demonstrates how to create a Windows service app in Visual Studio that writes messages to an event log.

Tworzenie usługiCreate a service

Aby rozpocząć, Utwórz projekt i ustaw wartości, które są wymagane do poprawnego działania usługi.To begin, create the project and set the values that are required for the service to function correctly.

  1. Z menu plik programu Visual Studio wybierz pozycję Nowy > projekt (lub naciśnij klawisze CTRL+SHIFT+N), aby otworzyć okno Nowy projekt .From the Visual Studio File menu, select New > Project (or press Ctrl+Shift+N) to open the New Project window.

  2. Przejdź do i wybierz szablon projektu usługi systemu Windows (.NET Framework) .Navigate to and select the Windows Service (.NET Framework) project template. Aby go znaleźć, rozwiń węzeł zainstalowane i Wizualizacja C# lub Visual Basic, a następnie wybierz pozycję Windows Desktop.To find it, expand Installed and Visual C# or Visual Basic, then select Windows Desktop. Lub wprowadź usługę systemu Windows w polu wyszukiwania w prawym górnym rogu, a następnie naciśnij klawisz Enter.Or, enter Windows Service in the search box on the upper right and press Enter.

    Szablon usługi systemu Windows w oknie dialogowym Nowy projekt w programie Visual Studio

    Uwaga

    Jeśli szablon usługi systemu Windows nie jest widoczny, może być konieczne zainstalowanie obciążeń programistycznych programu .NET Desktop :If you don't see the Windows Service template, you may need to install the .NET desktop development workload:

    W oknie dialogowym Nowy projekt wybierz pozycję Otwórz Instalator programu Visual Studio w lewym dolnym rogu.In the New Project dialog, select Open Visual Studio Installer on the lower left. Wybierz obciążenie Programowanie aplikacji klasycznych platformy .NET , a następnie wybierz pozycję Modyfikuj.Select the .NET desktop development workload, and then select Modify.

  3. W obszarze Nazwawpisz MyNewService, a następnie wybierz przycisk OK.For Name, enter MyNewService, and then select OK.

    Zostanie wyświetlona karta projektowanie (Service1.cs [projekt] lub Service1. vb [projekt] ).The Design tab appears (Service1.cs [Design] or Service1.vb [Design]).

    Szablon projektu zawiera klasę składnika o nazwie Service1 , która dziedziczy z. System.ServiceProcess.ServiceBaseThe project template includes a component class named Service1 that inherits from System.ServiceProcess.ServiceBase. Zawiera on wiele podstawowych kodów usług, takich jak kod do uruchomienia usługi.It includes much of the basic service code, such as the code to start the service.

Zmień nazwę usługiRename the service

Zmień nazwę usługi z Service1 na MyNewService.Rename the service from Service1 to MyNewService.

  1. W Eksplorator rozwiązańwybierz pozycję Service1.cslub Service1. vbi wybierz polecenie Zmień nazwę z menu skrótów.In Solution Explorer, select Service1.cs, or Service1.vb, and choose Rename from the shortcut menu. Zmień nazwę pliku na MyNewService.cslub MyNewService. vb, a następnie naciśnij klawisz Enter .Rename the file to MyNewService.cs, or MyNewService.vb, and then press Enter

    Zostanie wyświetlone okno podręczne z pytaniem, czy chcesz zmienić nazwy wszystkich odwołań do elementu kodu Service1.A pop-up window appears asking whether you would like to rename all references to the code element Service1.

  2. W oknie podręcznym wybierz pozycję tak.In the pop-up window, select Yes.

    Zmień nazwę monituRename prompt

  3. Na karcie projektowanie wybierz pozycję Właściwości z menu skrótów.In the Design tab, select Properties from the shortcut menu. W oknie Właściwości Zmień wartość właściwości ServiceName na MyNewService.From the Properties window, change the ServiceName value to MyNewService.

    Właściwości usługiService properties

  4. Wybierz pozycję Zapisz wszystko w menu plik .Select Save All from the File menu.

Dodawanie funkcji do usługiAdd features to the service

W tej sekcji dodasz niestandardowy dziennik zdarzeń do usługi systemu Windows.In this section, you add a custom event log to the Windows service. EventLog Składnik jest przykładem typu składnika, który można dodać do usługi systemu Windows.The EventLog component is an example of the type of component you can add to a Windows service.

Dodaj niestandardową funkcję dziennika zdarzeńAdd custom event log functionality

  1. W Eksplorator rozwiązańz menu skrótów dla MyNewService.cslub MyNewService. vbwybierz polecenie Projektant widoków.In Solution Explorer, from the shortcut menu for MyNewService.cs, or MyNewService.vb, choose View Designer.

  2. W przybornikurozwiń węzeł składniki, a następnie przeciągnij składnik EventLog do karty Service1.cs [Design] lub Service1. vb [Design] .In Toolbox, expand Components, and then drag the EventLog component to the Service1.cs [Design], or Service1.vb [Design] tab.

  3. W Eksplorator rozwiązańz menu skrótów dla MyNewService.cslub MyNewService. vbwybierz polecenie Wyświetl kod.In Solution Explorer, from the shortcut menu for MyNewService.cs, or MyNewService.vb, choose View Code.

  4. Zdefiniuj niestandardowy dziennik zdarzeń.Define a custom event log. W C#przypadku, Edytuj istniejący MyNewService() Konstruktor; dla New() Visual Basic Dodaj Konstruktor:For C#, edit the existing MyNewService() constructor; for Visual Basic, add the New() constructor:

    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
    
  5. Imports System.DiagnosticsDodaj instrukcję do MyNewService.cs (jeśli jeszcze nie istnieje) lub instrukcji MyNewService. vb dla przestrzeni nazw: usingAdd a using statement to MyNewService.cs (if it doesn't already exist), or an Imports statement MyNewService.vb, for the System.Diagnostics namespace:

    using System.Diagnostics;
    
    Imports System.Diagnostics
    
  6. Wybierz pozycję Zapisz wszystko w menu plik .Select Save All from the File menu.

Zdefiniuj, co ma miejsce w przypadku uruchomienia usługiDefine what occurs when the service starts

W edytorze kodu dla MyNewService.cs lub MyNewService. vbZnajdź OnStart metodę; Program Visual Studio automatycznie utworzył pustą definicję metody podczas tworzenia projektu.In the code editor for MyNewService.cs or MyNewService.vb, locate the OnStart method; Visual Studio automatically created an empty method definition when you created the project. Dodaj kod, który zapisuje wpis w dzienniku zdarzeń po uruchomieniu usługi:Add 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

SondowaniaPolling

Ponieważ aplikacja usługi jest zaprojektowana tak, aby była długotrwała, zwykle sonduje lub monitoruje system, który został skonfigurowany w OnStart metodzie.Because a service application is designed to be long-running, it usually polls or monitors the system, which you set up in the OnStart method. OnStart Metoda musi powrócić do systemu operacyjnego po rozpoczęciu operacji usługi, aby system nie został zablokowany.The OnStart method must return to the operating system after the service's operation has begun so that the system isn't blocked.

Aby skonfigurować prosty mechanizm sondowania, użyj System.Timers.Timer składnika.To set up a simple polling mechanism, use the System.Timers.Timer component. Czasomierz zgłasza Elapsed zdarzenie w regularnych odstępach czasu, w którym usługa może przeprowadzić monitorowanie.The timer raises an Elapsed event at regular intervals, at which time your service can do its monitoring. Timer Składnik jest używany w następujący sposób:You use the Timer component as follows:

  • Ustaw właściwości Timer składnika MyNewService.OnStart w metodzie.Set the properties of the Timer component in the MyNewService.OnStart method.
  • Uruchom czasomierz, wywołując Start metodę.Start the timer by calling the Start method.
Skonfiguruj mechanizm sondowania.Set up the polling mechanism.
  1. Dodaj następujący kod w MyNewService.OnStart zdarzeniu, aby skonfigurować mechanizm sondowania:Add the following code in the MyNewService.OnStart event to set up the polling mechanism:

    // Set up a timer that triggers every minute.
    Timer timer = new Timer();
    timer.Interval = 60000; // 60 seconds
    timer.Elapsed += new ElapsedEventHandler(this.OnTimer);
    timer.Start();
    
    ' Set up a timer that triggers every minute.
    Dim timer As Timer = New Timer()
    timer.Interval = 60000 ' 60 seconds
    AddHandler timer.Elapsed, AddressOf Me.OnTimer
    timer.Start()
    
  2. Imports DodajinstrukcjędoSystem.Timers MyNewService.cs lub instrukcję do MyNewService. vbdla przestrzeni nazw: usingAdd a using statement to MyNewService.cs, or an Imports statement to MyNewService.vb, for the System.Timers namespace:

    using System.Timers;
    
    Imports System.Timers
    
  3. W klasie Dodaj metodę, aby obsłużyć Timer.Elapsed zdarzenie: OnTimer MyNewServiceIn the MyNewService class, add the OnTimer method to handle the Timer.Elapsed event:

    public void OnTimer(object sender, 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
    
  4. MyNewService W klasie Dodaj zmienną członkowską.In the MyNewService class, add a member variable. Zawiera identyfikator następnego zdarzenia do zapisu w dzienniku zdarzeń:It contains the identifier of the next event to write into the event log:

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

Zamiast uruchamiać wszystkie prace w głównym wątku, można uruchamiać zadania przy użyciu wątków roboczych w tle.Instead of running all your work on the main thread, you can run tasks by using background worker threads. Aby uzyskać więcej informacji, zobacz System.ComponentModel.BackgroundWorker.For more information, see System.ComponentModel.BackgroundWorker.

Określ, co ma miejsce w przypadku zatrzymania usługiDefine what occurs when the service is stopped

Wstaw wiersz kodu w OnStop metodzie, która dodaje wpis do dziennika zdarzeń po zatrzymaniu usługi:Insert a line of code in the OnStop method that 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

Zdefiniuj inne akcje dla usługiDefine other actions for the service

Można zastąpić OnPausemetody, OnContinuei OnShutdown , aby zdefiniować dodatkowe przetwarzanie dla składnika.You can override the OnPause, OnContinue, and OnShutdown methods to define additional processing for your component.

Poniższy kod pokazuje, OnContinue jak zastąpić metodę MyNewService w klasie:The following code shows how you to override the OnContinue method in the MyNewService class:

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

Ustawianie stanu usługiSet service status

Usługi raportują swój stan do Menedżera kontroli usług , aby użytkownik mógł stwierdzić, czy usługa działa poprawnie.Services report their status to the Service Control Manager so that a user can tell whether a service is functioning correctly. Domyślnie usługa, która dziedziczy z ServiceBase raportów, zawiera ograniczony zestaw ustawień stanu, takich jak SERVICE_STOPPED, SERVICE_PAUSED i SERVICE_RUNNING.By default, a service that inherits from ServiceBase reports a limited set of status settings, which include SERVICE_STOPPED, SERVICE_PAUSED, and SERVICE_RUNNING. Jeśli uruchomienie usługi trwa dłużej, warto zgłosić status SERVICE_START_PENDING.If a service takes a while to start up, it's useful to report a SERVICE_START_PENDING status.

Ustawienia stanu SERVICE_START_PENDING i SERVICE_STOP_PENDING można zaimplementować, dodając kod, który wywołuje funkcję SetServiceStatus systemu Windows.You can implement the SERVICE_START_PENDING and SERVICE_STOP_PENDING status settings by adding code that calls the Windows SetServiceStatus function.

Zaimplementuj stan oczekiwania usługiImplement service pending status

  1. Imports DodajinstrukcjędoSystem.Runtime.InteropServices MyNewService.cs lub instrukcję do MyNewService. vbdla przestrzeni nazw: usingAdd a using statement to MyNewService.cs, or an Imports statement to MyNewService.vb, for the System.Runtime.InteropServices namespace:

    using System.Runtime.InteropServices;
    
    Imports System.Runtime.InteropServices
    
  2. Dodaj następujący kod do MyNewService.cslub MyNewService. vb, ServiceState aby zadeklarować wartości i dodać strukturę dla stanu, który będzie używany w wywołaniu wywołania platformy:Add the following code to MyNewService.cs, or MyNewService.vb, 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
    

    Uwaga

    Menedżer sterowania usługami używa dwWaitHint i dwCheckpoint składowych struktury SERVICE_STATUS , aby określić czas oczekiwania na uruchomienie lub wyłączenie usługi systemu Windows.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. Jeśli metody OnStop dwCheckPoint i są wykonywane długo, usługa może zażądać więcej czasu, wywołując SetServiceStatus ponownie z wartością przyrostową. OnStartIf your OnStart and OnStop methods run long, your service can request more time by calling SetServiceStatus again with an incremented dwCheckPoint value.

  3. W klasie deklaruj funkcję SetServiceStatus przy użyciu wywołania platformy: MyNewServiceIn 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. Aby zaimplementować stan SERVICE_START_PENDING, Dodaj następujący kod na początku OnStart metody:To implement the SERVICE_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. Dodaj kod na końcu OnStart metody, aby ustawić stan na SERVICE_RUNNING:Add code to the end of the OnStart method to set the status to SERVICE_RUNNING:

    // 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. Obowiązkowe Jeśli OnStop jest metodą długotrwałą, powtórz tę procedurę OnStop w metodzie.(Optional) If OnStop is a long-running method, repeat this procedure in the OnStop method. Zaimplementuj stan SERVICE_STOP_PENDING i zwróć stan SERVICE_STOPPED przed wyjściem OnStop z metody.Implement the SERVICE_STOP_PENDING status and return the SERVICE_STOPPED status before the OnStop method exits.

    Na przykład:For example:

    // Update the service state to Stop Pending.
    ServiceStatus serviceStatus = new ServiceStatus();
    serviceStatus.dwCurrentState = ServiceState.SERVICE_STOP_PENDING;
    serviceStatus.dwWaitHint = 100000;
    SetServiceStatus(this.ServiceHandle, ref serviceStatus);
    
    // Update the service state to Stopped.
    serviceStatus.dwCurrentState = ServiceState.SERVICE_STOPPED;
    SetServiceStatus(this.ServiceHandle, ref serviceStatus);
    
    ' Update the service state to Stop Pending.
    Dim serviceStatus As ServiceStatus = New ServiceStatus()
    serviceStatus.dwCurrentState = ServiceState.SERVICE_STOP_PENDING
    serviceStatus.dwWaitHint = 100000
    SetServiceStatus(Me.ServiceHandle, serviceStatus)
    
    ' Update the service state to Stopped.
    serviceStatus.dwCurrentState = ServiceState.SERVICE_STOPPED
    SetServiceStatus(Me.ServiceHandle, serviceStatus)
    

Dodawanie instalatorów do usługiAdd installers to the service

Przed uruchomieniem usługi systemu Windows należy ją zainstalować, co spowoduje zarejestrowanie jej w Menedżerze kontroli usług.Before you run a Windows service, you need to install it, which registers it with the Service Control Manager. Dodaj Instalatory do projektu, aby obsłużyć szczegóły rejestracji.Add installers to your project to handle the registration details.

  1. W Eksplorator rozwiązańz menu skrótów dla MyNewService.cslub MyNewService. vbwybierz polecenie Projektant widoków.In Solution Explorer, from the shortcut menu for MyNewService.cs, or MyNewService.vb, choose View Designer.

  2. W widoku projekt wybierz obszar tła, a następnie wybierz polecenie Dodaj Instalatora z menu skrótów.In the Design view, select the background area, then choose Add Installer from the shortcut menu.

    Domyślnie program Visual Studio dodaje klasę składnika o nazwie ProjectInstaller, która zawiera dwóch instalatorów do projektu.By default, Visual Studio adds a component class named ProjectInstaller, which contains two installers, to your project. Te Instalatory są przeznaczone dla usługi i dla procesu związanego z usługą.These installers are for your service and for the service's associated process.

  3. W widoku projekt dla ProjectInstallerwybierz pozycję serviceInstaller1 dla projektu wizualnego C# lub serviceInstaller1 dla projektu Visual Basic, a następnie wybierz Właściwości z menu skrótów.In the Design view for ProjectInstaller, select serviceInstaller1 for a Visual C# project, or ServiceInstaller1 for a Visual Basic project, then choose Properties from the shortcut menu.

  4. W oknie Właściwości Sprawdź, czy ServiceName właściwość jest ustawiona na MyNewService.In the Properties window, verify the ServiceName property is set to MyNewService.

  5. Dodaj tekst do Description właściwości, takiej jak Przykładowa usługa.Add text to the Description property, such as A sample service.

    Ten tekst jest wyświetlany w kolumnie Opis okna usługi i zawiera opis usługi dla użytkownika.This text appears in the Description column of the Services window and describes the service to the user.

    Opis usługi w oknie usługi.Service description in the Services window.

  6. Dodaj tekst do DisplayName właściwości.Add text to the DisplayName property. Na przykład MyNewService nazwa wyświetlana.For example, MyNewService Display Name.

    Ten tekst jest wyświetlany w kolumnie Nazwa wyświetlana okna usługi .This text appears in the Display Name column of the Services window. Ta nazwa może się różnić od ServiceName właściwości, która jest nazwą używaną przez system (na przykład nazwę używaną net start przez polecenie w celu uruchomienia usługi).This name can be different from the ServiceName property, which is the name the system uses (for example, the name you use for the net start command to start your service).

  7. Ustaw właściwość na Automatic wartość z listy rozwijanej. StartTypeSet the StartType property to Automatic from the drop-down list.

  8. Po zakończeniu okna Właściwości powinny wyglądać tak, jak na poniższej ilustracji:When you're finished, the Properties windows should look like the following figure:

    Właściwości Instalatora dla usługi systemu WindowsInstaller Properties for a Windows service

  9. W widoku projekt dla ProjectInstallerwybierz pozycję ServiceProcessInstaller1 dla projektu wizualnego C# lub ServiceProcessInstaller1 dla projektu Visual Basic, a następnie wybierz Właściwości z menu skrótów. .In the Design view for ProjectInstaller, choose serviceProcessInstaller1 for a Visual C# project, or ServiceProcessInstaller1 for a Visual Basic project, then choose Properties from the shortcut menu. Ustaw właściwość na LocalSystem wartość z listy rozwijanej. AccountSet the Account property to LocalSystem from the drop-down list.

    To ustawienie powoduje zainstalowanie usługi i uruchomienie jej przy użyciu lokalnego konta systemowego.This setting installs the service and runs it by using the local system account.

    Ważne

    LocalSystem Konto ma szerokie uprawnienia, w tym możliwość zapisu w dzienniku zdarzeń.The LocalSystem account has broad permissions, including the ability to write to the event log. Należy go używać ostrożnie, ponieważ może zwiększyć ryzyko ataku przez złośliwe oprogramowanie.Use this account with caution, because it might increase your risk of attacks from malicious software. W przypadku innych zadań należy rozważyć użycie LocalService konta, które działa jako użytkownik nieuprzywilejowany na komputerze lokalnym i prezentuje anonimowe poświadczenia na dowolnym serwerze zdalnym.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. Ten przykład kończy się niepowodzeniem, jeśli spróbujesz użyć LocalService konta, ponieważ wymaga ono uprawnienia do zapisu w dzienniku zdarzeń.This example fails if you try to use the LocalService account, because it needs permission to write to the event log.

Aby uzyskać więcej informacji na temat instalatorów , zobacz How to: Dodaj Instalatory do aplikacjiusługi.For more information about installers, see How to: Add installers to your service application.

Obowiązkowe Ustaw parametry uruchamiania(Optional) Set startup parameters

Uwaga

Przed podjęciem decyzji o dodaniu parametrów uruchamiania należy rozważyć, czy jest to najlepszy sposób przekazywania informacji do usługi.Before you decide to add startup parameters, consider whether it's the best way to pass information to your service. Mimo że jest to łatwe w użyciu i przeanalizowanie, a użytkownik może je łatwo przesłonić, może być trudniejsze dla użytkownika do odnalezienia i użycia bez dokumentacji.Although they're easy to use and parse, and a user can easily override them, they might be harder for a user to discover and use without documentation. Ogólnie rzecz biorąc, jeśli usługa wymaga więcej niż kilku parametrów uruchamiania, zamiast tego należy użyć rejestru lub pliku konfiguracji.Generally, if your service requires more than just a few startup parameters, you should use the registry or a configuration file instead.

Usługa systemu Windows może akceptować argumenty wiersza polecenia lub parametry uruchamiania.A Windows service can accept command-line arguments, or startup parameters. Po dodaniu kodu do przetwarzania parametrów uruchamiania, użytkownik może uruchomić usługę z własnymi własnymi parametrami uruchamiania w oknie właściwości usługi.When you add code to process startup parameters, a user can start your service with their own custom startup parameters in the service properties window. Jednak te Parametry uruchomieniowe nie są zachowywane podczas następnego uruchomienia usługi.However, these startup parameters aren't persisted the next time the service starts. Aby trwale ustawić parametry uruchamiania, ustaw je w rejestrze.To set startup parameters permanently, set them in the registry.

Każda usługa systemu Windows ma wpis rejestru w podkluczu HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services .Each Windows service has a registry entry under the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services subkey. W obszarze podklucza każdego usługi Użyj podklucza Parameters do przechowywania informacji, do których usługa może uzyskać dostęp.Under each service's subkey, use the Parameters subkey to store information that your service can access. Można używać plików konfiguracji aplikacji dla usługi systemu Windows w taki sam sposób jak w przypadku innych typów programów.You can use application configuration files for a Windows service the same way you do for other types of programs. Aby zapoznać się z przykładowym kodem, zobacz ConfigurationManager.AppSettings.For sample code, see ConfigurationManager.AppSettings.

Aby dodać parametry uruchamianiaTo add startup parameters

  1. Wybierz pozycję program.cslub MyNewService. Designer. vb, a następnie wybierz pozycję Wyświetl kod z menu skrótów.Select Program.cs, or MyNewService.Designer.vb, then choose View Code from the shortcut menu. Main W metodzie Zmień kod, aby dodać parametr wejściowy i przekazać go do konstruktora usługi:In the Main method, change the code to add an input parameter and pass it 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 MyNewService(cmdArgs)}
        System.ServiceProcess.ServiceBase.Run(ServicesToRun)
    End Sub
    
  2. W MyNewService.cslub MyNewService. vbZmień MyNewService konstruktora, aby przetworzyć parametr wejściowy w następujący sposób:In MyNewService.cs, or MyNewService.vb, change the MyNewService constructor to process the input parameter as follows:

    using System.Diagnostics;
    
    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 EventLog();
    
        if (!EventLog.SourceExists(eventSourceName))
        {
            EventLog.CreateEventSource(eventSourceName, logName);
        }
    
        eventLog1.Source = eventSourceName;
        eventLog1.Log = logName;
    }
    
    Imports System.Diagnostics
    
    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 EventLog()
        If (Not EventLog.SourceExists(eventSourceName)) Then
            EventLog.CreateEventSource(eventSourceName, logName)
        End If
        eventLog1.Source = eventSourceName
        eventLog1.Log = logName
    End Sub
    

    Ten kod ustawia Źródło zdarzenia i nazwę dziennika zgodnie z parametrami uruchamiania dostarczanymi przez użytkownika.This code sets the event source and log name according to the startup parameters that the user supplies. Jeśli nie podano argumentów, używa wartości domyślnych.If no arguments are supplied, it uses default values.

  3. Aby określić argumenty wiersza polecenia, Dodaj następujący kod do ProjectInstaller klasy w ProjectInstaller.cslub 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
    

    Zazwyczaj ta wartość zawiera pełną ścieżkę do pliku wykonywalnego dla usługi systemu Windows.Typically, this value contains the full path to the executable for the Windows service. Aby usługa została prawidłowo uruchomiona, użytkownik musi podać znaki cudzysłowu dla ścieżki i każdego parametru.For the service to start up correctly, the user must supply quotation marks for the path and each individual parameter. Aby zmienić parametry uruchamiania usługi systemu Windows, użytkownik może zmienić parametry w wpisie w rejestrze ImagePath .A user can change the parameters in the ImagePath registry entry to change the startup parameters for the Windows service. Lepszym sposobem jest jednak zmiana wartości programowo i udostępnienie funkcji w sposób przyjazny dla użytkownika, na przykład za pomocą narzędzia do zarządzania lub konfiguracji.However, a better way is to change the value programmatically and expose the functionality in a user-friendly way, such as by using a management or configuration utility.

Tworzenie usługiBuild the service

  1. W Eksplorator rozwiązań, wybierz Właściwości z menu skrótów dla projektu MyNewService .In Solution Explorer, choose Properties from the shortcut menu for the MyNewService project.

    Pojawią się strony właściwości projektu.The property pages for your project appear.

  2. Na karcie aplikacja na liście obiekt początkowy wybierz MyNewService. programlub Sub Main dla projektów Visual Basic.On the Application tab, in the Startup object list, choose MyNewService.Program, or Sub Main for Visual Basic projects.

  3. Aby skompilować projekt, w Eksplorator rozwiązańwybierz opcję Kompiluj z menu skrótów dla projektu (lub naciśnij klawisze CTRL+SHIFT+B).To build the project, in Solution Explorer, choose Build from the shortcut menu for your project (or press Ctrl+Shift+B).

Instalowanie usługiInstall the service

Teraz, gdy została skompilowana usługa systemu Windows, możesz ją zainstalować.Now that you've built the Windows service, you can install it. Aby zainstalować usługę systemu Windows, musisz mieć poświadczenia administratora na komputerze, na którym jest zainstalowany.To install a Windows service, you must have administrator credentials on the computer where it's installed.

  1. Otwórz wiersz polecenia dla deweloperów dla programu Visual Studio z poświadczeniami administracyjnymi.Open Developer Command Prompt for Visual Studio with administrative credentials. Z menu Start systemu Windows wybierz opcję wiersz polecenia dla deweloperów dla programu vs 2017 w folderze Visual Studio, a następnie wybierz pozycję więcej > Uruchom jako administrator z menu skrótów.From the Windows Start menu, select Developer Command Prompt for VS 2017 in the Visual Studio folder, then select More > Run as Administrator from the shortcut menu.

  2. W oknie wiersz polecenia dla deweloperów dla programu Visual Studio przejdź do folderu, który zawiera dane wyjściowe projektu (domyślnie podkatalog \bin\debug projektu).In the Developer Command Prompt for Visual Studio window, navigate to the folder that contains your project's output (by default, the \bin\Debug subdirectory of your project).

  3. Wprowadź następujące polecenie:Enter the following command:

    installutil MyNewService.exe
    

    Jeśli usługa zostanie pomyślnie zainstalowana, polecenie zgłosi powodzenie.If the service installs successfully, the command reports success.

    Jeśli system nie może odnaleźć pliku Installutil. exe, upewnij się, że istnieje on na komputerze.If the system can't find installutil.exe, make sure that it exists on your computer. To narzędzie jest instalowane z .NET Framework do folderu %windir%\Microsoft.NET\Framework [64]\<>Framework wersja.This tool is installed with the .NET Framework to the folder %windir%\Microsoft.NET\Framework[64]\<framework version>. Na przykład domyślną ścieżką dla wersji 64-bitowej jest %windir%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe.For example, the default path for the 64-bit version is %windir%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe.

    Jeśli proces Installutil. exe nie powiedzie się, sprawdź dziennik instalacji, aby dowiedzieć się, dlaczego.If the installutil.exe process fails, check the install log to find out why. Domyślnie dziennik znajduje się w tym samym folderze co plik wykonywalny usługi.By default, the log is in the same folder as the service executable. Instalacja może zakończyć się niepowodzeniem, jeśli:The installation can fail if:

    • Klasa nie jest obecna ProjectInstaller w klasie. RunInstallerAttributeThe RunInstallerAttribute class isn't present on the ProjectInstaller class.
    • Atrybut nie jest ustawiony na true.The attribute isn't set to true.
    • Klasa nie jest zdefiniowana jako public. ProjectInstallerThe ProjectInstaller class isn't defined as public.

Aby uzyskać więcej informacji, zobacz jak: Instalowanie i odinstalowywanieusług.For more information, see How to: Install and uninstall services.

Uruchom i uruchom usługęStart and run the service

  1. W systemie Windows otwórz aplikację Desktop Services .In Windows, open the Services desktop app. Naciśnij pozycję Windows+R , aby otworzyć okno uruchamiania , wpisz Services. msc, a następnie naciśnij klawisz Enter lub wybierz przycisk OK.Press Windows+R to open the Run box, enter services.msc, and then press Enter or select OK.

    Twoja usługa powinna zostać wyświetlona na liście usługi, w kolejności alfabetycznej według nazwy wyświetlanej, która została ustawiona dla tego ustawienia.You should see your service listed in Services, displayed alphabetically by the display name that you set for it.

    MyNewService w oknie usługi.

  2. Aby uruchomić usługę, wybierz pozycję Rozpocznij od menu skrótów usługi.To start the service, choose Start from the service's shortcut menu.

  3. Aby zatrzymać usługę, wybierz pozycję Zatrzymaj w menu skrótów usługi.To stop the service, choose Stop from the service's shortcut menu.

  4. Obowiązkowe W wierszu polecenia Użyj poleceń net start <Service Name> i net stop <Service Name> , aby uruchomić i zatrzymać usługę.(Optional) From the command line, use the commands net start <service name> and net stop <service name> to start and stop your service.

Weryfikowanie danych wyjściowych dziennika zdarzeń usługiVerify the event log output of your service

  1. W systemie Windows otwórz aplikację klasyczną Podgląd zdarzeń .In Windows, open the Event Viewer desktop app. Wprowadź Podgląd zdarzeń na pasku wyszukiwania systemu Windows, a następnie wybierz Podgląd zdarzeń z wyników wyszukiwania.Enter Event Viewer in the Windows search bar, and then select Event Viewer from the search results.

    Porada

    W programie Visual Studio można uzyskać dostęp do dzienników zdarzeń, otwierając Eksplorator serwera z menu Widok (lub naciskając klawisze Ctrl+Alt+S) i rozszerzając węzeł dzienniki zdarzeń dla komputera lokalnego.In Visual Studio, you can access event logs by opening Server Explorer from the View menu (or press Ctrl+Alt+S) and expanding the Event Logs node for the local computer.

  2. W Podgląd zdarzeńrozwiń węzeł Dzienniki aplikacji i usług.In Event Viewer, expand Applications and Services Logs.

  3. Znajdź listę dla myNewLog (lub MyLogFile1 , jeśli wykonano procedurę dodawania argumentów wiersza polecenia) i rozwiń ją.Locate the listing for MyNewLog (or MyLogFile1 if you followed the procedure to add command-line arguments) and expand it. Powinny zostać wyświetlone wpisy dotyczące dwóch akcji (uruchamiania i zatrzymywania) wykonywanych przez usługę.You should see the entries for the two actions (start and stop) that your service performed.

    Użyj Podgląd zdarzeń, aby wyświetlić wpisy dziennika zdarzeń

Oczyszczanie zasobówClean up resources

Jeśli aplikacja usługi systemu Windows nie jest już potrzebna, można ją usunąć.If you no longer need the Windows service app, you can remove it.

  1. Otwórz wiersz polecenia dla deweloperów dla programu Visual Studio z poświadczeniami administracyjnymi.Open Developer Command Prompt for Visual Studio with administrative credentials.

  2. W oknie wiersz polecenia dla deweloperów dla programu Visual Studio przejdź do folderu, który zawiera dane wyjściowe projektu.In the Developer Command Prompt for Visual Studio window, navigate to the folder that contains your project's output.

  3. Wprowadź następujące polecenie:Enter the following command:

    installutil.exe /u MyNewService.exe
    

    Jeśli usługa została pomyślnie odinstalowana, polecenie zgłosi, że usługa została pomyślnie usunięta.If the service uninstalls successfully, the command reports that your service was successfully removed. Aby uzyskać więcej informacji, zobacz jak: Instalowanie i odinstalowywanieusług.For more information, see How to: Install and uninstall services.

Następne krokiNext steps

Teraz, gdy została utworzona usługa, możesz:Now that you've created the service, you can:

  • Utwórz autonomiczny program instalacyjny, który będzie używany przez inne osoby do instalacji usługi systemu Windows.Create a standalone setup program for others to use to install your Windows service. Użyj zestawu narzędzi WIX , aby utworzyć Instalatora dla usługi systemu Windows.Use the WiX Toolset to create an installer for a Windows service. Aby poznać inne pomysły, zobacz Tworzenie pakietu Instalatora.For other ideas, see Create an installer package.

  • ServiceController Eksploruj składnik, który umożliwia wysyłanie poleceń do zainstalowanej usługi.Explore the ServiceController component, which enables you to send commands to the service you've installed.

  • Zamiast tworzyć dziennik zdarzeń, gdy aplikacja jest uruchomiona, użyj Instalatora, aby utworzyć dziennik zdarzeń podczas instalowania aplikacji.Instead of creating the event log when the application runs, use an installer to create an event log when you install the application. Dziennik zdarzeń jest usuwany przez Instalatora podczas odinstalowywania aplikacji.The event log is deleted by the installer when you uninstall the application. Aby uzyskać więcej informacji, zobacz EventLogInstaller.For more information, see EventLogInstaller.

Zobacz takżeSee also