Exemplarische Vorgehensweise: Erstellen einer Windows-Dienstanwendung im Komponenten-Designer

Aktualisiert: November 2007

Hinweis:

Die Vorlage Windows-Dienst und die entsprechenden Funktionen stehen in der Standard Edition von Visual Studio nicht zur Verfügung.

In den Vorgehensweisen in diesem Thema wird beschrieben, wie eine einfache Windows-Dienstanwendung erstellt wird, die Meldungen in ein Ereignisprotokoll schreibt. Unter anderen müssen die folgenden grundlegenden Schritte ausgeführt werden, um den Dienst zu erstellen und zu verwenden:

  • Erstellen Sie ein Projekt mit der Vorlage für Windows-Dienst-Anwendungen. Mit dieser Vorlage wird eine Klasse erstellt, die aus ServiceBase geerbt wird. Außerdem wird ein Großteil des grundlegenden Dienstcodes geschrieben, z. B. der Code zum Starten des Diensts.

  • Schreiben Sie Code für die Prozeduren OnStart und OnStop, und überschreiben Sie die Methoden, die Sie erneut definieren möchten.

  • Fügen Sie die für die Dienstanwendung erforderlichen Installationsprogramme hinzu. Standardmäßig wird eine Klasse mit zwei oder mehr Installationsprogrammen zur Anwendung hinzugefügt, wenn Sie auf den Link Installer hinzufügen klicken: eines zur Installation des Prozesses und eines für jeden zugeordneten Dienst, den das Projekt enthält.

  • Erstellen Sie das Projekt.

  • Erstellen Sie ein Setup-Projekt zur Installation des Diensts, und installieren Sie den Dienst anschließend.

  • Öffnen Sie den Dienststeuerungs-Manager von Windows 2000, und starten Sie den Dienst.

Erstellen Sie zunächst das Projekt, und legen Sie die Werte fest, die für die korrekte Funktion des Diensts erforderlich sind.

Hinweis:

Ihr Computer zeigt möglicherweise für einige der Elemente der Visual Studio-Benutzeroberfläche in der folgenden Anleitung andere Namen oder Standorte an. Diese Elemente sind von der jeweiligen Visual Studio-Version und den verwendeten Einstellungen abhängig. Weitere Informationen finden Sie unter Visual Studio-Einstellungen.

Erstellen eines Diensts

So erstellen und konfigurieren Sie einen Dienst

  1. Klicken Sie im Menü Datei auf Neues Projekt.

    Das Dialogfeld Neues Projekt wird angezeigt.

  2. Wählen Sie das Projekt Windows-Dienst aus der Liste der Projektvorlagen für Visual Basic, Visual C#, Visual C++ oder Visual J# aus, und nennen Sie es MyNewService. Klicken Sie auf OK.

    Hinweis:

    Die Projektvorlage fügt automatisch die Komponentenklasse Service1 hinzu, die von System.ServiceProcess.ServiceBase erbt.

  3. Klicken Sie auf den Designer, um Service1 auszuwählen. Legen Sie anschließend im Eigenschaftenfenster den ServiceName und die (Name)-Eigenschaft für Service1 auf MyNewService fest.

  4. Legen Sie die AutoLog-Eigenschaft auf true fest.

  5. Klicken Sie im Menü Ansicht auf Code, um den Code-Editor zu öffnen. Bearbeiten Sie die Main-Methode so, dass eine Instanz von MyNewService erstellt wird. Als Sie den Dienst in Schritt 3 umbenannt haben, wurde der Klassenname in der Main-Methode nicht verändert. In Visual C#- und Visual J#-Anwendungen befindet sich die Main-Methode in der Datei Program.cs bzw. Program.js.

    ' To access the Main method in Visual Basic, select Main from the
    ' method name drop-down list. This expands the Component Designer 
    ' generated code region.
    Shared Sub Main()
      Dim ServicesToRun() As System.ServiceProcess.ServiceBase
      ' Change the following line to match.
      ServicesToRun = New System.ServiceProcess.ServiceBase() _
          {New MyNewService()}
      System.ServiceProcess.ServiceBase.Run(ServicesToRun)
    End Sub
    
     static void Main()
        {
            System.ServiceProcess.ServiceBase[] ServicesToRun;
            // Change the following line to match.
            ServicesToRun = new System.ServiceProcess.ServiceBase[] 
              { new MyNewService() };
            System.ServiceProcess.ServiceBase.Run(ServicesToRun);
        }
    
        public static void main(String[] args)
        {
            System.ServiceProcess.ServiceBase[] ServicesToRun;
            ServicesToRun = new System.ServiceProcess.ServiceBase[] 
              { new MyNewService() };
            System.ServiceProcess.ServiceBase.Run(ServicesToRun);
        }
    

Hinzufügen von Features zum Dienst

Im nächsten Abschnitt fügen Sie dem Windows-Dienst ein benutzerdefiniertes Ereignisprotokoll hinzu. Ereignisprotokolle sind Windows-Diensten in keiner Weise zugeordnet. Hier wird die EventLog-Komponente als Beispiel für die Art der Komponente verwendet, die Sie einem Windows-Dienst hinzufügen können. Weitere Informationen zu benutzerdefinierten Ereignisprotokollen finden Sie unter Gewusst wie: Erstellen und Entfernen benutzerdefinierter Ereignisprotokolle.

So fügen Sie dem Dienst eine benutzerdefinierte Ereignisprotokollfunktion hinzu

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Service1.vb, Service1.cs oder Service1.jsl, und wählen Sie den Ansicht-Designer aus.

  2. Ziehen Sie in der Toolbox von der Registerkarte Komponenten eine EventLog-Komponente in den Designer.

  3. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Service1.vb, Service1.cs oder Service1.jsl, und wählen Sie Code anzeigen aus.

  4. Bearbeiten Sie den Konstruktor, um ein benutzerdefiniertes Ereignisprotokoll zu definieren:

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

So legen Sie fest, was beim Starten des Diensts ausgeführt wird

  • Suchen Sie im Code-Editor die OnStart-Methode, die beim Erstellen des Projekts automatisch überschrieben wurde, und schreiben Sie Code zum Festlegen, was beim Starten des Diensts ausgeführt wird:

    ' 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
    
     protected override void OnStart(string[] args)
        {
            eventLog1.WriteEntry("In OnStart");
        }
    
        protected void OnStart(String[] args)
        {
            eventLog1.WriteEntry("In OnStart");
        }
    
    Hinweis:

    Eine Dienstanwendung ist auf einen langen Ausführungszeitraum angelegt. Deshalb ruft sie in der Regel etwas im System ab oder überwacht etwas im System. Die Überwachung wird in der OnStart-Methode eingerichtet. Allerdings erfolgt die Überwachung jedoch nicht durch OnStart. Die OnStart-Methode muss zum Betriebssystem zurückkehren, sobald die Ausführung des Dienstes begonnen hat. Sie darf keine Endlosschleife oder Blöcke ausführen. Mit der System.Timers.Timer-Komponente können Sie einen einfachen Abrufmechanismus einrichten. In der OnStart-Methode würden Sie für die Komponente Parameter festlegen, und anschließend würden Sie die Enabled-Eigenschaft auf true festlegen. Der Zeitgeber würde dann regelmäßig zu der Zeit Ereignisse im Code auslösen, zu der der Dienst seine Überwachung ausführen könnte.

So legen Sie fest, was ausgeführt wird, wenn der Dienst beendet wurde

  • Wählen Sie im Code-Editor in der Dropdownliste Methodenname die OnStop-Prozedur. Sie wurde beim Erstellen des Projekts automatisch überschrieben. Schreiben Sie Code, um die Vorgehensweise beim Beenden des Diensts festzulegen.

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

Sie können auch die Methoden OnPause, OnContinue und OnShutdown überschreiben, um zusätzliche Verarbeitungsschritte für die Komponente festzulegen.

So definieren Sie weitere Aktionen für den Dienst

  • Überschreiben Sie die betreffende Methode mit einer Methode, die festlegt, was ausgeführt werden soll.

    Im folgenden Code wird das Ergebnis nach dem Überschreiben der OnContinue-Methode veranschaulicht:

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

Einige benutzerdefinierte Aktionen müssen beim Installieren des Windows-Diensts ausgeführt werden. Dies kann durch die Installer-Klasse erfolgen. Visual Studio kann diese Installationsprogramme speziell für einen Windows-Dienst erstellen und sie dem Projekt hinzufügen.

So erstellen Sie die Installationsprogramme für den Dienst

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Service1.vb, Service1.cs oder Service1.jsl, und wählen Sie den Ansicht-Designer aus.

  2. Klicken Sie auf den Hintergrund des Designers, um den Dienst selbst, nicht Elemente seines Inhalts, zu markieren.

  3. Klicken Sie mit der rechten Maustaste, wenn der Designer den Fokus hat, und klicken Sie dann auf Installer hinzufügen.

    Standardmäßig wird dem Projekt eine Komponentenklasse mit zwei Installationsprogrammen hinzugefügt. Die Komponente erhält den Namen ProjectInstaller; die darin enthaltenen Installationsprogramme sind zum einen das Installationsprogramm für den Dienst und zum andern das Installationsprogramm für den zugeordneten Prozess des Diensts.

  4. Klicken Sie in der Entwurfsansicht für ProjectInstaller auf ServiceInstaller1 oder serviceInstaller1.

  5. Legen Sie im Eigenschaftenfenster die ServiceName-Eigenschaft auf MyNewService fest.

  6. Legen Sie die StartType-Eigenschaft auf Automatic fest.

  7. Klicken Sie im Designer auf ServiceProcessInstaller1 (für ein Visual Basic-Projekt) oder serviceProcessInstaller1 (für ein Visual C#- oder Visual J#-Projekt). Legen Sie die Account-Eigenschaft auf LocalService fest. Dadurch wird der Dienst installiert und auf einem lokalen Dienstkonto ausgeführt.

    Sicherheitshinweis:

    Das Konto LocalService fungiert auf dem lokalen Computer als nicht berechtigter Benutzer und stellt einem beliebigen Remoteserver anonyme Anmeldeinformationen zur Verfügung. Verwenden Sie andere Konten mit Vorsicht, da sie mit umfassenderen Rechten ausgeführt werden und somit das Risiko für Angriffe durch böswilligen Code erhöhen.

So erstellen Sie ein Dienstprojekt

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und klicken Sie dann auf Eigenschaften. Der Eigenschaften-Designer des Projekts wird angezeigt.

  2. Klicken Sie auf der Seite Anwendung in der Liste Startobjekt auf MyNewService.

  3. Drücken Sie STRG+UMSCHALT+B, um das Projekt zu erstellen.

Da das Projekt nun erstellt ist, kann es bereitgestellt werden. Ein Setup-Projekt installiert die kompilierten Projektdateien und führt die Installationsprogramme aus, die zum Ausführen des Windows-Diensts erforderlich sind. Zum Erstellen eines vollständigen Setup-Projekts müssen Sie die Projektausgabe, MyNewService.exe, zum Setup-Projekt hinzufügen und dann eine benutzerdefinierte Aktion hinzufügen, um MyNewService.exe zu installieren. Weitere Informationen zu Setup-Projekten finden Sie unter Setup-Projekte. Weitere Informationen zu benutzerdefinierten Aktionen finden Sie unter Exemplarische Vorgehensweise: Erstellen einer benutzerdefinierten Aktion.

So erstellen Sie ein Setup-Projekt für den Dienst

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Projekt.

  2. Wählen Sie im Bereich Projekttypen den Ordner Setup und Bereitstellungsprojekte aus.

  3. Wählen Sie im Bereich Vorlagen die Option Setup-Projekt aus. Nennen Sie das Projekt MyServiceSetup. Klicken Sie auf OK.

    Ein Setup-Projekt wird zur Projektmappe hinzugefügt.

Danach wird dem Setup-Projekt die Ausgabe des Windows-Dienstprojekts, MyNewService.exe, hinzugefügt.

So fügen Sie MyNewService.exe zum Setup-Projekt hinzu

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf MyServiceSetup, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Projektausgabe.

    Das Dialogfeld Projektausgabegruppe hinzufügen wird angezeigt.

  2. MyNewService ist im Feld Projekt markiert.

  3. Wählen Sie in der Liste die Option Primäre Ausgabe aus, und klicken Sie auf OK.

    Ein Projektelement für die primäre Ausgabe von MyNewService wird zum Setup-Projekt hinzugefügt.

Jetzt können Sie eine benutzerdefinierte Aktion hinzufügen, um die Datei MyNewService.exe zu installieren.

So fügen Sie eine benutzerdefinierte Aktion zum Setup-Projekt hinzu

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Setup-Projekt, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Benutzerdefinierte Aktionen.

    Der Editor für benutzerdefinierte Aktionen wird angezeigt.

  2. Klicken Sie im Editor für benutzerdefinierte Aktionen mit der rechten Maustaste auf den Knoten Benutzerdefinierte Aktionen, und klicken Sie auf Benutzerdefinierte Aktion hinzufügen.

    Das Dialogfeld Element im Projekt auswählen wird angezeigt.

  3. Doppelklicken Sie in der Liste auf Anwendungsordner, um ihn zu öffnen. Wählen Sie dann Primäre Ausgabe von MyNewService (Aktiv) aus, und klicken Sie auf OK.

    Die primäre Ausgabe wird zu allen vier Knoten der benutzerdefinierten Aktionen – Install, Commit, Rollback und Uninstall – hinzugefügt.

  4. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das MyServiceSetup-Projekt, und klicken Sie auf Erstellen.

So installieren Sie den Windows-Dienst

  1. Klicken Sie zum Installieren von MyNewService.exe mit der rechten Maustaste auf das Setup-Projekt im Projektmappen-Explorer, und wählen Sie Installieren.

  2. Folgen Sie den Anweisungen des Setup-Assistenten. Erstellen und speichern Sie die Projektmappe.

So starten und beenden Sie den Dienst

  1. Öffnen Sie den Dienststeuerungs-Manager, indem Sie einen der folgenden Schritte ausführen:

    • Klicken Sie in Windows XP und 2000 Professional auf dem Desktop des Computers mit der rechten Maustaste auf Arbeitsplatz und dann auf Verwalten. Erweitern Sie in der Konsole Computerverwaltung den Knoten Dienste und Anwendungen.

      – oder –

    • Klicken Sie in Windows Server 2003 und Windows 2000 Server auf Start, zeigen Sie auf Programme und dann auf Verwaltung, und klicken anschließend Sie auf Dienste.

      Hinweis:

      Unter Windows NT 4.0 kann das Dialogfeld über die Systemsteuerung geöffnet werden.

    MyNewService müsste jetzt im Bereich Dienste des Fensters angezeigt werden.

  2. Wählen Sie den Dienst in der Liste aus, klicken Sie mit der rechten Maustaste darauf, und klicken Sie dann auf Starten.

  3. Klicken Sie mit der rechten Maustaste auf den Dienst, und klicken Sie dann auf Beenden.

So überprüfen Sie die Ereignisprotokollausgabe des Diensts

  1. Öffnen Sie den Server-Explorer, und greifen Sie auf den Knoten Ereignisprotokolle zu. Weitere Informationen finden Sie unter Gewusst wie: Arbeiten mit Ereignisprotokollen im Server-Explorer.

    Hinweis:

    Die Vorlage Windows-Dienst und die entsprechenden Funktionen stehen in der Standard Edition von Visual Studio nicht zur Verfügung.

  2. Suchen Sie die Liste für MyNewLog, und erweitern Sie sie. Es müssten die Einträge für die Aktionen zu sehen sein, die der Dienst ausgeführt hat.

So deinstallieren Sie einen Dienst

  1. Öffnen Sie im Startmenü die Systemsteuerung, und klicken Sie auf Software. Suchen Sie anschließend den Dienst, und klicken Sie auf Deinstallieren.

  2. Sie können das Programm auch deinstallieren, indem Sie mit der rechten Maustaste auf das Programmsymbol für die MSI-Datei klicken und Deinstallieren auswählen.

    Hinweis:

    Wenn Sie den Dienst unter Windows 2000 installiert haben, müssen Sie das System neu starten, bevor Sie den Dienst erneut installieren können. In Windows 2000 werden Dienste nicht vollständig gelöscht, bevor das System neu gestartet wird.

Nächste Schritte

Sie können eine ServiceController-Komponente verwenden, um Befehle an den von Ihnen installierten Dienst zu senden. Weitere Informationen zur Verwendung der ServiceController-Komponente finden Sie unter Überwachen von Windows-Diensten.

Sie können ein Installationsprogramm verwenden, um ein Ereignisprotokoll während der Installation statt während der Ausführung der Anwendung zu erstellen. Außerdem wird das Ereignisprotokoll vom Installationsprogramm gelöscht, wenn die Anwendung deinstalliert wird. Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Installieren einer Ereignisprotokollkomponente.

Siehe auch

Aufgaben

Gewusst wie: Hinzufügen von Installern zur Dienstanwendung

Gewusst wie: Installieren und Deinstallieren von Diensten

Gewusst wie: Debuggen von Windows-Dienstanwendungen

Gewusst wie: Starten des Ereignis-Viewers aus dem Server-Explorer

Konzepte

Einführung in Windows-Dienstanwendungen

Referenz

Gewusst wie: Zugreifen auf und Initialisieren von Server-Explorer/Datenbank-Explorer

Weitere Ressourcen

Windows-Dienstanwendungen