Freigeben über


ServiceInstaller-Klasse

Installiert eine Klasse, die ServiceBase für die Implementierung eines Dienstes erweitert. Diese Klasse wird vom Installationsdienstprogramm beim Installieren einer Dienstanwendung aufgerufen.

Namespace: System.ServiceProcess
Assembly: System.ServiceProcess (in system.serviceprocess.dll)

Syntax

'Declaration
Public Class ServiceInstaller
    Inherits ComponentInstaller
'Usage
Dim instance As ServiceInstaller
public class ServiceInstaller : ComponentInstaller
public ref class ServiceInstaller : public ComponentInstaller
public class ServiceInstaller extends ComponentInstaller
public class ServiceInstaller extends ComponentInstaller

Hinweise

Die Funktionsweise von ServiceInstaller hängt vom zugeordneten Dienst ab. Dieser wird vom Installationsprogramm verwendet, um Registrierungswerte für den Dienst in einen Unterschlüssel des Registrierungsschlüssels HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services zu schreiben. Der Dienst ist in diesem Unterschlüssel durch ServiceName gekennzeichnet. Außerdem enthält der Unterschlüssel den Namen der ausführbaren Datei bzw. DLL des Dienstes.

Erstellen Sie zum Installieren eines Dienstes eine Projektinstallationsprogramm-Klasse, die von der Installer-Klasse erbt, und legen Sie das RunInstallerAttribute-Attribute für die Klasse auf true fest. Erstellen Sie für jede Dienstanwendung im Projekt eine ServiceProcessInstaller-Instanz und für jeden Dienst in der Anwendung jeweils eine ServiceInstaller-Instanz. Legen Sie die Installationseigenschaften für den Dienst im Klassenkonstruktor des Projektinstallationsprogramms mithilfe der ServiceProcessInstaller-Instanz und der ServiceInstaller-Instanz fest, und fügen Sie die Instanzen der Installers-Auflistung hinzu.

Hinweis

   Es ist empfehlenswert, dass Sie den Konstruktor verwenden, um die Instanzen des Installationsprogramms hinzuzufügen. Wenn das Hinzufügen zur Installers-Auflistung jedoch in der Install-Methode erfolgen soll, stellen Sie sicher, dass Sie der Auflistung in der Uninstall-Methode dieselben Elemente hinzufügen.

Für alle von der Installer-Klasse abgeleiteten Klassen muss der Zustand der Installers-Auflistung in der Install-Methode und in der Uninstall-Methode übereinstimmen. Sie können es jedoch vermeiden, die Auflistung in der Install-Methode und in der Uninstall-Methode in Übereinstimmung halten zu müssen, indem Sie der Installers-Auflistung im Klassenkonstruktor für das benutzerdefinierte Installationsprogramm Instanzen des Installationsprogramms hinzufügen. Beim Aufrufen des Installationsdienstprogramms sucht dieses nach dem RunInstallerAttribute-Attribut. Wenn das Attribut true ist, werden alle Dienste installiert, die der Installers-Auflistung des Projektinstallationsprogramms hinzugefügt wurden. Wenn RunInstallerAttribute false oder nicht vorhanden ist, ignoriert das Installationsdienstprogramm das Projektinstallationsprogramm.

Der ServiceProcessInstaller der Projektinstallationsklasse installiert Informationen, die zu allen ServiceInstaller-Instanzen des Projekts gehören. Wenn sich der Dienst von den anderen Diensten im Installationsprojekt unterscheidet, wird diese Methode zur Installation der dienstspezifischen Informationen verwendet.

Hinweis

Der ServiceName muss unbedingt mit dem ServiceBase.ServiceName aus der von ServiceBase abgeleiteten Klasse übereinstimmen. Der Wert der ServiceBase.ServiceName-Eigenschaft für den Dienst wird üblicherweise in der Main()-Funktion der ausführbaren Datei der Dienstanwendung festgelegt. Der Dienststeuerungs-Manager verwendet die ServiceInstaller.ServiceName-Eigenschaft, um den Dienst in dieser ausführbaren Datei zu finden.

Weitere Eigenschaften von ServiceInstaller können sowohl vor als auch nach dem Hinzufügen zur Installers-Auflistung des Projektinstallationsprogramms geändert werden. Der StartType eines Dienstes könnte beispielsweise so festgelegt sein, dass der Dienst automatisch beim Neustart des Computers oder manuell vom Benutzer gestartet wird.

Normalerweise rufen Sie die Methoden für ServiceInstaller nicht im Code auf. Diese werden i. d. R. nur vom Installationsdienstprogramm aufgerufen. Das Installationsdienstprogramm ruft die ServiceProcessInstaller.Install-Methode und die ServiceInstaller.Install-Methode bei der Installation automatisch auf. Im Bedarfsfall werden Fehler behoben, indem Rollback oder ServiceInstaller.Rollback für alle zuvor installierten Komponenten aufgerufen wird.

Zum Entfernen des Objekts ruft das Installationsprogramm Uninstall auf.

Die Installationsroutine einer Anwendung verwaltet automatisch Informationen über bereits installierte Komponenten. Dazu wird der Installer.Context des Projektinstallationsprogramms verwendet. Diese Zustandsinformationen werden fortlaufend aktualisiert, während das Dienstprogramm die ServiceProcessInstaller-Instanz und alle ServiceInstaller-Instanzen installiert. Normalerweise ist es nicht erforderlich, dass der Code Zustandsinformationen explizit ändert.

Bei der Installation wird automatisch ein EventLogInstaller für die Installation der Ereignisprotokollquelle generiert, die der von ServiceBase abgeleiteten Klasse zugeordnet ist. Die Log-Eigenschaft für diese Quelle wird vom ServiceInstaller-Konstruktor auf das Anwendungsprotokoll des Computers festgelegt. Wenn der ServiceName des ServiceInstaller, der mit dem ServiceBase.ServiceName des Dienstes übereinstimmen sollte, festgelegt wird, wird für Source automatisch der gleiche Wert festgelegt. Bei einem Installationsfehler wird für die Installation der Quelle, einschließlich der bereits installierten Dienste, ein Rollback ausgeführt.

Die Uninstall-Methode versucht, den Dienst zu beenden, sofern dieser ausgeführt wird. Unabhängig vom Erfolg dieser Operation macht Uninstall die von Install durchgeführten Änderungen wieder rückgängig. Wenn eine neue Quelle für die Ereignisprotokollierung erstellt wurde, wird diese gelöscht.

Beispiel

Im folgenden Beispiel wird ein Projektinstallationsprogramm mit dem Namen MyProjectInstaller erstellt, das von Installer erbt. Dabei wird angenommen, dass eine ausführbare Datei vorhanden ist, die die beiden Dienste "Hello-World Service 1" und "Hello-World Service 2" enthält. Im Konstruktor für MyProjectInstaller, der vom Installationsdienstprogramm aufgerufen wird, werden ServiceInstaller-Objekte für beide Dienste und ein ServiceProcessInstaller für die ausführbare Datei erstellt. Damit das Installationsdienstprogramm MyProjectInstaller als gültiges Installationsprogramm erkennt, wird das RunInstallerAttribute-Attribut auf true festgelegt.

Nach dem Festlegen optionaler Eigenschaften für das Prozess- und Dienstinstallationsprogramm werden die Installationsprogramme der Installers-Auflistung hinzugefügt. Wenn das Installationsdienstprogramm auf MyProjectInstaller zugreift, werden nacheinander die Objekte installiert, die der Installers-Auflistung durch Aufrufen von InstallerCollection.Add hinzugefügt wurden. Während des Vorgangs verwaltet das Installationsprogramm Zustandsinformationen, die angeben, welche Objekte installiert wurden, sodass die Installation jedes einzelnen Objekts im Falle eines Installationsfehlers wieder rückgängig gemacht werden kann.

Üblicherweise wird keine Instanz der Projektinstallationsprogramm-Klasse explizit erstellt. Sie erstellen die Klasse und fügen der Syntax das RunInstallerAttribute-Attribut hinzu, diese wird jedoch vom Installationsdienstprogramm direkt aufgerufen und damit instanziiert.

Imports System
Imports System.Collections
Imports System.Configuration.Install
Imports System.ServiceProcess
Imports System.ComponentModel

<RunInstallerAttribute(True)> _
Public Class MyProjectInstaller
    Inherits Installer
    Private serviceInstaller1 As ServiceInstaller
    Private serviceInstaller2 As ServiceInstaller
    Private processInstaller As ServiceProcessInstaller    
    
    Public Sub New()
        ' Instantiate installers for process and services.
        processInstaller = New ServiceProcessInstaller()
        serviceInstaller1 = New ServiceInstaller()
        serviceInstaller2 = New ServiceInstaller()
        
        ' The services will run under the system account.
        processInstaller.Account = ServiceAccount.LocalSystem
        
        ' The services will be started manually.
        serviceInstaller1.StartType = ServiceStartMode.Manual
        serviceInstaller2.StartType = ServiceStartMode.Manual
        
        ' ServiceName must equal those on ServiceBase derived classes.            
        serviceInstaller1.ServiceName = "Hello-World Service 1"
        serviceInstaller2.ServiceName = "Hello-World Service 2"
        
        ' Add installers to collection. Order is not important.
        Installers.Add(serviceInstaller1)
        Installers.Add(serviceInstaller2)
        Installers.Add(processInstaller)
    End Sub
End Class
using System;
using System.Collections;
using System.Configuration.Install;
using System.ServiceProcess;
using System.ComponentModel;

[RunInstallerAttribute(true)]
public class MyProjectInstaller: Installer{
   private ServiceInstaller serviceInstaller1;
   private ServiceInstaller serviceInstaller2;
   private ServiceProcessInstaller processInstaller;

   public MyProjectInstaller(){
      // Instantiate installers for process and services.
      processInstaller = new ServiceProcessInstaller();
      serviceInstaller1 = new ServiceInstaller();
      serviceInstaller2 = new ServiceInstaller();

      // The services run under the system account.
      processInstaller.Account = ServiceAccount.LocalSystem;

      // The services are started manually.
      serviceInstaller1.StartType = ServiceStartMode.Manual;
      serviceInstaller2.StartType = ServiceStartMode.Manual;

      // ServiceName must equal those on ServiceBase derived classes.            
      serviceInstaller1.ServiceName = "Hello-World Service 1";
      serviceInstaller2.ServiceName = "Hello-World Service 2";

      // Add installers to collection. Order is not important.
      Installers.Add(serviceInstaller1);
      Installers.Add(serviceInstaller2);
      Installers.Add(processInstaller);
   }
}
#using <System.dll>
#using <System.ServiceProcess.dll>
#using <System.Configuration.Install.dll>

using namespace System;
using namespace System::Collections;
using namespace System::Configuration::Install;
using namespace System::ServiceProcess;
using namespace System::ComponentModel;

[RunInstallerAttribute(true)]
public ref class MyProjectInstaller: public Installer
{
private:
   ServiceInstaller^ serviceInstaller1;
   ServiceInstaller^ serviceInstaller2;
   ServiceProcessInstaller^ processInstaller;

public:
   MyProjectInstaller()
   {
      
      // Instantiate installers for process and services.
      processInstaller = gcnew ServiceProcessInstaller;
      serviceInstaller1 = gcnew ServiceInstaller;
      serviceInstaller2 = gcnew ServiceInstaller;
      
      // The services run under the system account.
      processInstaller->Account = ServiceAccount::LocalSystem;
      
      // The services are started manually.
      serviceInstaller1->StartType = ServiceStartMode::Manual;
      serviceInstaller2->StartType = ServiceStartMode::Manual;
      
      // ServiceName must equal those on ServiceBase derived classes.            
      serviceInstaller1->ServiceName = "Hello-World Service 1";
      serviceInstaller2->ServiceName = "Hello-World Service 2";
      
      // Add installers to collection. Order is not important.
      Installers->Add( serviceInstaller1 );
      Installers->Add( serviceInstaller2 );
      Installers->Add( processInstaller );
   }

};
import System.*;
import System.Collections.*;
import System.Configuration.Install.*;
import System.ServiceProcess.*;
import System.ComponentModel.*;

/** @attribute RunInstallerAttribute(true)
 */
public class MyProjectInstaller extends Installer
{
    private ServiceInstaller serviceInstaller1;
    private ServiceInstaller serviceInstaller2;
    private ServiceProcessInstaller processInstaller;

    public MyProjectInstaller()
    {
        // Instantiate installers for process and services.
        processInstaller = new ServiceProcessInstaller();
        serviceInstaller1 = new ServiceInstaller();
        serviceInstaller2 = new ServiceInstaller();

        // The services run under the system account.
        processInstaller.set_Account(ServiceAccount.LocalSystem);

        // The services are started manually.
        serviceInstaller1.set_StartType(ServiceStartMode.Manual);
        serviceInstaller2.set_StartType(ServiceStartMode.Manual);

        // ServiceName must equal those on ServiceBase derived classes.            
        serviceInstaller1.set_ServiceName("Hello-World Service 1");
        serviceInstaller2.set_ServiceName("Hello-World Service 2");

        // Add installers to collection. Order is not important.
        get_Installers().Add(serviceInstaller1);
        get_Installers().Add(serviceInstaller2);
        get_Installers().Add(processInstaller);
    } //MyProjectInstaller
} //MyProjectInstaller

Vererbungshierarchie

System.Object
   System.MarshalByRefObject
     System.ComponentModel.Component
       System.Configuration.Install.Installer
         System.Configuration.Install.ComponentInstaller
          System.ServiceProcess.ServiceInstaller

Threadsicherheit

Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

Plattformen

Windows 98, Windows 2000 SP4, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

Siehe auch

Referenz

ServiceInstaller-Member
System.ServiceProcess-Namespace
ServiceBase.ServiceName-Eigenschaft
ServiceProcessInstaller
ServiceBase-Klasse
ServiceBase.EventLog-Eigenschaft