Megosztás a következőn keresztül:


Oktatóanyag: Windows-szolgáltatásalkalmazás létrehozása

Figyelmeztetés

Ez a dokumentáció nem a Windows Szolgáltatás legújabb verziójához készült. A Windows Services legújabb, a munkavégző szolgáltatás sablont használó BackgroundService tartalmaiért lásd:

Ez a cikk bemutatja, hogyan hozhat létre windowsos szolgáltatásalkalmazást a Visual Studióban, amely üzeneteket ír egy eseménynaplóba.

Szolgáltatás létrehozása

Először hozza létre a projektet, és állítsa be a szolgáltatás megfelelő működéséhez szükséges értékeket.

  1. A Visual Studio Fájl menüjében válassza az Új>projekt lehetőséget (vagy nyomja le aCtrl Shift+Nbillentyűkombinációt+) az Új projekt ablak megnyitásához.

  2. Keresse meg és válassza ki a Windows Szolgáltatás (.NET-keretrendszer) projektsablont.

    Megjegyzés

    Ha nem látja a Windows Szolgáltatás sablont, előfordulhat, hogy telepítenie kell a .NET asztali fejlesztési számítási feladatát a Visual Studio Installer használatával.

  3. A Név mezőbe írja be a MyNewService kifejezést, majd válassza az OK gombot.

    Megjelenik a Tervezés lap (Service1.cs [Tervezés] vagy Service1.vb [Tervezés]).

    A projektsablon tartalmaz egy nevű Service1 összetevőosztályt, amely a következőtől System.ServiceProcess.ServiceBaseöröklődik: . Az alapszintű szolgáltatáskód nagy részét tartalmazza, például a szolgáltatás indítására vonatkozó kódot.

A szolgáltatás átnevezése

Nevezze át a szolgáltatást Service1-rőlMyNewService névre.

  1. A Megoldáskezelőben válassza a Service1.cs vagy a Service1.vb elemet, majd válassza az Átnevezés lehetőséget a helyi menüből. Nevezze át a fájlt MyNewService.cs vagy MyNewService.vb névre, majd nyomja le az Enter billentyűt

    Megjelenik egy előugró ablak, amely megkérdezi, hogy szeretné-e átnevezni a Service1 kódelemre mutató összes hivatkozást.

  2. Az előugró ablakban válassza az Igen lehetőséget.

    A windowsos

  3. A Tervezés lapon válassza a Helyi menü Tulajdonságok elemét . A Tulajdonságok ablakban módosítsa a ServiceName értéket MyNewService értékre.

    Szolgáltatás tulajdonságai

  4. Válassza az Összes mentése lehetőséget a Fájl menüben.

Szolgáltatások hozzáadása a szolgáltatáshoz

Ebben a szakaszban egy egyéni eseménynaplót ad hozzá a Windows szolgáltatáshoz. Az EventLog összetevő egy példa arra, hogy milyen típusú összetevőt adhat hozzá egy Windows-szolgáltatáshoz.

Egyéni eseménynapló-funkciók hozzáadása

  1. A Megoldáskezelőben a MyNewService.cs vagy a MyNewService.vb helyi menüjében válassza a Nézet Tervező lehetőséget.

  2. Az Eszközkészletbenbontsa ki az Összetevők elemet, majd húzza az EventLog összetevőt a Service1.cs [Tervezés] vagy a Service1.vb [Tervezés] lapra.

  3. A Megoldáskezelőben a MyNewService.cs vagy a MyNewService.vb helyi menüjében válassza a Kód megtekintése lehetőséget.

  4. Egyéni eseménynapló definiálása.

    C# esetén szerkessze a meglévő MyNewService() konstruktort az alábbi kódrészletben látható módon. Visual Basic esetén adja hozzá a New() konstruktort az alábbi kódrészletben látható módon.

    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. Adjon hozzá egy utasítást using a MyNewService.cs fájlhoz (ha még nem létezik), vagy egy utasítást Imports a MyNewService.vb fájlba a System.Diagnostics névtérhez:

    using System.Diagnostics;
    
    Imports System.Diagnostics
    
  6. Válassza az Összes mentése lehetőséget a Fájl menüben.

Annak meghatározása, hogy mi történik a szolgáltatás indításakor

Keresse meg a metódust a MyNewService.cs vagy aOnStart MyNewService.vb kódszerkesztőjében. A Visual Studio automatikusan létrehozott egy üres metódusdefiníciót a projekt létrehozásakor. Adjon hozzá egy kódot, amely bejegyzést ír az eseménynaplóba a szolgáltatás indításakor:

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

Ciklikus lekérdezés

Mivel egy szolgáltatásalkalmazás hosszú ideig futó, általában lekérdezi vagy figyeli a metódusban OnStart beállított rendszert. A OnStart metódusnak vissza kell térnie az operációs rendszerhez a szolgáltatás működésének megkezdése után, hogy a rendszer ne legyen blokkolva.

Egyszerű lekérdezési mechanizmus beállításához használja az összetevőt System.Timers.Timer . Az időzítő rendszeres időközönként előhoz egy Elapsed eseményt, amely során a szolgáltatás elvégezheti annak monitorozását. Az összetevőt az Timer alábbiak szerint használhatja:

  • Adja meg az Timer összetevő tulajdonságait a MyNewService.OnStart metódusban.
  • Indítsa el az időzítőt a Start metódus meghívásával.
A lekérdezési mechanizmus beállítása
  1. Adjon hozzá egy utasítást using a MyNewService.cs fájlhoz vagy egy utasítást Imports a MyNewService.vb fájlhoz a System.Timers névtérhez:

    using System.Timers;
    
    Imports System.Timers
    
  2. Adja hozzá a következő kódot az MyNewService.OnStart eseményhez a lekérdezési mechanizmus beállításához:

    // 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()
    
  3. Az osztályban MyNewService adjon hozzá egy tagváltozót. A következő esemény azonosítóját tartalmazza, amely az eseménynaplóba írható:

    private int eventId = 1;
    
    Private eventId As Integer = 1
    
  4. A osztályban MyNewService adja hozzá az OnTimer esemény kezelésére használt metódust Timer.Elapsed :

    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
    

Ahelyett, hogy az összes munkáját a fő szálon futtatja, háttérmunkaláncok használatával is futtathat feladatokat. További információ: System.ComponentModel.BackgroundWorker.

Annak meghatározása, hogy mi történik a szolgáltatás leállításakor

Szúrjon be egy kódsort a OnStop metódusba, amely a szolgáltatás leállításakor hozzáad egy bejegyzést az eseménynaplóhoz:

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

A szolgáltatás egyéb műveleteinek definiálása

Felülbírálhatja a OnPause, OnContinueés OnShutdown metódusokat, hogy további feldolgozást definiáljon az összetevőhöz.

Az alábbi kód bemutatja, hogyan bírálhatja felül a metódust OnContinue az MyNewService osztályban:

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

Szolgáltatás állapotának beállítása

A szolgáltatások jelentik az állapotukat a Service Control Managernek , hogy a felhasználó megállapíthassa, hogy egy szolgáltatás megfelelően működik-e. Alapértelmezés szerint egy olyan szolgáltatás, amely a jelentésekből ServiceBase örökli az állapotbeállítások korlátozott készletét, beleértve a SERVICE_STOPPED, a SERVICE_PAUSED és a SERVICE_RUNNING. Ha egy szolgáltatás indítása eltarthat egy ideig, érdemes SERVICE_START_PENDING állapotot jelenteni.

A SERVICE_START_PENDING és SERVICE_STOP_PENDING állapotbeállításokat a Windows SetServiceStatus függvényt meghívó kód hozzáadásával implementálhatja.

Függőben lévő szolgáltatás állapotának implementálása

  1. Adjon hozzá egy utasítást using a MyNewService.cs fájlhoz vagy egy utasítást Imports a MyNewService.vb fájlhoz a System.Runtime.InteropServices névtérhez:

    using System.Runtime.InteropServices;
    
    Imports System.Runtime.InteropServices
    
  2. Adja hozzá a következő kódot a MyNewService.cs vagy a MyNewService.vb fájlhoz az ServiceState értékek deklarálásához és az állapot struktúrájának hozzáadásához, amelyet platformhívási hívásban fog használni:

    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
    

    Megjegyzés

    A Service Control Manager a dwWaitHintSERVICE_STATUS struktúrájának és dwCheckpoint tagjainak használatával határozza meg, hogy mennyi időt kell várnia egy Windows-szolgáltatás elindítására vagy leállítására. Ha a és OnStop a OnStart metódusok hosszú ideig futnak, a szolgáltatás több időt kérhet, ha egy növekményes dwCheckPoint értékkel újra meghívjaSetServiceStatus.

  3. A osztályban MyNewService deklarálja a SetServiceStatus függvényt platformhívás használatával:

    [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. A SERVICE_START_PENDING állapotának implementálásához adja hozzá a következő kódot a OnStart metódus elejéhez:

    // 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. Adjon hozzá kódot a OnStart metódus végéhez, és állítsa az állapotot 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. (Nem kötelező) Ha OnStop hosszú ideig futó metódus, ismételje meg ezt az eljárást a OnStop metódusban. Implementálja a SERVICE_STOP_PENDING állapotot, és adja vissza a SERVICE_STOPPED állapotot, mielőtt a OnStop metódus kilép.

    Például:

    // 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)
    

Telepítők hozzáadása a szolgáltatáshoz

Windows-szolgáltatás futtatása előtt telepítenie kell azt, amely regisztrálja azt a Service Control Managerrel. Adja hozzá a telepítőket a projekthez a regisztrációs adatok kezeléséhez.

  1. A Megoldáskezelőben a MyNewService.cs vagy a MyNewService.vb helyi menüjében válassza a Nézet Tervező lehetőséget.

  2. Tervező nézetben válassza ki a háttérterületet, majd a helyi menüBen válassza a Telepítő hozzáadása lehetőséget.

    A Visual Studio alapértelmezés szerint hozzáad egy nevű összetevőosztályt ProjectInstaller, amely két telepítőt tartalmaz a projekthez. Ezek a telepítők az Ön szolgáltatásához és a szolgáltatáshoz társított folyamathoz tartoznak.

  3. A ProjectInstallerTervező nézetében válassza a serviceInstaller1 elemet egy Visual C#-projekthez, vagy a ServiceInstaller1 elemet egy Visual Basic-projekthez, majd válassza a helyi menü Tulajdonságok elemét.

  4. A Tulajdonságok ablakban ellenőrizze, hogy a ServiceName tulajdonság MyNewService értékre van-e állítva.

  5. Adjon hozzá szöveget a Description tulajdonsághoz, például az A mintaszolgáltatáshoz.

    Ez a szöveg a Szolgáltatások ablak Leírás oszlopában jelenik meg, és leírja a szolgáltatást a felhasználónak.

    Szolgáltatás leírása a Szolgáltatások ablakban.

  6. Szöveg hozzáadása a DisplayName tulajdonsághoz. Például a MyNewService megjelenítendő neve.

    Ez a szöveg a Szolgáltatások ablak Megjelenítendő neve oszlopában jelenik meg. Ez a név eltérhet a ServiceName tulajdonságtól, amely a rendszer által használt név (például a szolgáltatás elindításához használt net start név).

  7. Állítsa be a StartType tulajdonságot Automatic a legördülő listából.

  8. Ha végzett, a Tulajdonságok ablaknak a következő ábrához hasonlóan kell kinéznie:

    A Windows-szolgáltatás telepítőjének tulajdonságai

  9. A ProjectInstallerTervező nézetében válassza a serviceProcessInstaller1 elemet egy Visual C#-projekthez, vagy a ServiceProcessInstaller1 elemet egy Visual Basic-projekthez, majd válassza a helyi menü Tulajdonságok elemét. Állítsa be a Account tulajdonságot LocalSystem a legördülő listából.

    Ez a beállítás telepíti a szolgáltatást, és a helyi rendszerfiók használatával futtatja.

    Fontos

    A LocalSystem fiók széles körű engedélyekkel rendelkezik, beleértve az eseménynaplóba való írás lehetőségét is. Óvatosan használja ezt a fiókot, mert növelheti a kártékony szoftverek támadásainak kockázatát. Egyéb feladatok esetén fontolja meg a LocalService fiók használatát, amely nem kiemelt felhasználóként működik a helyi számítógépen, és névtelen hitelesítő adatokat jelenít meg bármely távoli kiszolgálónak. Ez a példa meghiúsul, ha megpróbálja használni a LocalService fiókot, mert engedélyre van szüksége az eseménynaplóba való íráshoz.

A telepítőkkel kapcsolatos további információkért lásd : Telepítők hozzáadása a szolgáltatásalkalmazáshoz.

(Nem kötelező) Indítási paraméterek beállítása

Megjegyzés

Mielőtt úgy dönt, hogy indítási paramétereket ad hozzá, fontolja meg, hogy ez-e a legjobb módja az információk szolgáltatásnak való átadásának. Bár könnyen használhatók és elemezhetők, és a felhasználók könnyen felülbírálhatják őket, előfordulhat, hogy a felhasználó nehezebben derítheti fel és használhatja őket dokumentáció nélkül. Általában, ha a szolgáltatáshoz több indítási paraméterre van szükség, inkább a beállításjegyzéket vagy egy konfigurációs fájlt kell használnia.

A Windows-szolgáltatások elfogadhatnak parancssori argumentumokat vagy indítási paramétereket. Amikor kódot ad hozzá az indítási paraméterek feldolgozásához, a felhasználó saját egyéni indítási paraméterekkel indíthatja el a szolgáltatást a szolgáltatás tulajdonságainak ablakában. Ezek az indítási paraméterek azonban nem maradnak meg a szolgáltatás következő indításakor. Az indítási paraméterek végleges beállításához állítsa be őket a beállításjegyzékben.

Minden Windows-szolgáltatás rendelkezik egy beállításjegyzék-bejegyzéssel a HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services alkulcs alatt. Az egyes szolgáltatások alkulcsában a Paraméterek alkulcs használatával tárolhatja a szolgáltatás által elérhető információkat. A Windows-szolgáltatások alkalmazáskonfigurációs fájljai ugyanúgy használhatók, mint más típusú programok esetében. A mintakódért lásd: ConfigurationManager.AppSettings.

Indítási paraméterek hozzáadása

  1. Válassza a Program.cs vagy a MyNewService.Tervező lehetőséget. vb, majd a helyi menüben válassza a Kód megtekintése lehetőséget. A metódusban módosítsa a Main kódot úgy, hogy adjon hozzá egy bemeneti paramétert, és adja át a szolgáltatáskonstruktornak:

    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. A MyNewService.cs vagy a MyNewService.vb fájlban módosítsa a MyNewService konstruktort a bemeneti paraméter feldolgozására az alábbiak szerint:

    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
    

    Ez a kód a felhasználó által megadott indítási paramétereknek megfelelően állítja be az eseményforrást és a naplónevet. Ha nem ad meg argumentumokat, az alapértelmezett értékeket használja.

  3. A parancssori argumentumok megadásához adja hozzá a következő kódot a ProjectInstaller.cs vagy a ProjectInstallerProjectInstaller.vb osztályhoz:

    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
    

    Ez az érték általában a Windows szolgáltatás végrehajtható fájljának teljes elérési útját tartalmazza. Ahhoz, hogy a szolgáltatás megfelelően elinduljon, a felhasználónak idézőjeleket kell megadnia az elérési úthoz és az egyes paraméterekhez. A felhasználók módosíthatják az ImagePath beállításjegyzék-bejegyzés paramétereit a Windows-szolgáltatás indítási paramétereinek módosításához. A jobb módszer azonban az érték programozott módosítása és a funkciók felhasználóbarát módon történő elérhetővé tétele, például felügyeleti vagy konfigurációs segédprogram használatával.

A szolgáltatás létrehozása

  1. A Megoldáskezelőben válassza a Tulajdonságok lehetőséget a MyNewService projekt helyi menüjében.

    Megjelennek a projekt tulajdonságlapjai.

  2. Az Alkalmazás lap Indítási objektum listájában válassza a MyNewService.Program vagy a Visual Basic-projektek alhálózata lehetőséget.

  3. A projekt létrehozásához a Megoldáskezelőben válassza a Build lehetőséget a projekt helyi menüjében (vagy nyomja le a Ctrl ShiftBbillentyűkombinációt++).

A szolgáltatás telepítése

Most, hogy elkészítette a Windows szolgáltatást, telepítheti. Windows-szolgáltatás telepítéséhez rendszergazdai hitelesítő adatokkal kell rendelkeznie azon a számítógépen, amelyen telepítve van.

  1. Nyissa meg a Visual Studio fejlesztői parancssorát rendszergazdai hitelesítő adatokkal.

  2. A Visual Studio fejlesztői parancssorában keresse meg a projekt kimenetét tartalmazó mappát (alapértelmezés szerint a projekt \bin\Debug alkönyvtárát).

  3. Írja be a következő parancsot:

    installutil MyNewService.exe
    

    Ha a szolgáltatás telepítése sikeres, a parancs sikeresnek számít.

    Ha a rendszer nem találja ainstallutil.exe, győződjön meg arról, hogy létezik a számítógépen. Ez az eszköz a %windir%\Microsoft.NET\Framework[64]\<framework verzió> mappába .NET-keretrendszer van telepítve. A 64 bites verzió alapértelmezett elérési útja például %windir%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe.

    Ha a installutil.exe folyamat meghiúsul, a telepítési naplóból megtudhatja, hogy miért. Alapértelmezés szerint a napló ugyanabban a mappában van, mint a szolgáltatás végrehajtható. A telepítés meghiúsulhat, ha:

    • Az RunInstallerAttribute osztály nincs jelen az ProjectInstaller osztályban.
    • Az attribútum nincs beállítva .true
    • Az ProjectInstaller osztály nincs definiálva a következőként: public.

További információ : Szolgáltatások telepítése és eltávolítása.

A szolgáltatás elindítása és futtatása

  1. A Windowsban nyissa meg az asztali Szolgáltatások alkalmazást. A Windows+R billentyű lenyomásával nyissa meg a Futtatás mezőt, írja be a services.msc kifejezést, majd nyomja le az Enter billentyűt , vagy válassza az OK gombot.

    A szolgáltatásnak a Szolgáltatások listában kell megjelennie, betűrendben a hozzá beállított megjelenítendő név alapján.

    MyNewService a Szolgáltatások ablakban.

  2. A szolgáltatás elindításához válassza a Start lehetőséget a szolgáltatás helyi menüjében.

  3. A szolgáltatás leállításához válassza a Leállítás lehetőséget a szolgáltatás helyi menüjében.

  4. (Nem kötelező) A parancssorból a net start <szolgáltatásnév> és a net stop <szolgáltatásnév> parancsokkal indítsa el és állítsa le a szolgáltatást.

A szolgáltatás eseménynapló-kimenetének ellenőrzése

  1. Windows rendszerben nyissa meg az asztali Eseménynapló alkalmazást. Írja be a Eseménynapló a Windows keresősávjára, majd válassza Eseménynapló a keresési eredmények közül.

    Tipp

    A Visual Studióban az eseménynaplók eléréséhez nyissa meg a Kiszolgálókezelőt a Nézet menüből (vagy nyomja le a CtrlAlt+Sbillentyűkombinációt+), és bontsa ki a helyi számítógép Eseménynaplók csomópontját.

  2. A Eseménynapló bontsa ki az Alkalmazások és szolgáltatások naplói elemet.

  3. Keresse meg a MyNewLog (vagy MyLogFile1 ) listáját, ha követte a parancssori argumentumok hozzáadására vonatkozó eljárást, és bontsa ki. Látnia kell a szolgáltatás által végrehajtott két művelet (indítás és leállítás) bejegyzéseit.

    Az Eseménynapló használatával megtekintheti az eseménynapló bejegyzéseit

Az erőforrások eltávolítása

Ha már nincs szüksége a Windows szolgáltatásalkalmazásra, eltávolíthatja.

  1. Nyissa meg a Visual Studio fejlesztői parancssorát rendszergazdai hitelesítő adatokkal.

  2. A Visual Studio fejlesztői parancssorában keresse meg a projekt kimenetét tartalmazó mappát.

  3. Írja be a következő parancsot:

    installutil.exe /u MyNewService.exe
    

    Ha a szolgáltatás sikeresen eltávolítja a szolgáltatást, a parancs azt jelenti, hogy a szolgáltatás sikeresen el lett távolítva. További információ : Szolgáltatások telepítése és eltávolítása.

Következő lépések

Most, hogy létrehozta a szolgáltatást, a következőt teheti:

  • Hozzon létre egy különálló telepítőprogramot másoknak a Windows-szolgáltatás telepítéséhez. A WiX Toolset használatával hozzon létre egy telepítőt egy Windows-szolgáltatáshoz. További ötletekért lásd: Telepítőcsomag létrehozása.

  • Ismerkedjen meg az ServiceController összetevővel, amellyel parancsokat küldhet a telepített szolgáltatásnak.

  • Az alkalmazás futtatásakor az eseménynapló létrehozása helyett hozzon létre egy eseménynaplót egy telepítő használatával az alkalmazás telepítésekor. Az alkalmazás eltávolításakor a telepítő törli az eseménynaplót. További információ: EventLogInstaller.

Lásd még