Installa una classe che estende
ServiceBase per implementare un servizio. Questa classe viene chiamata dall'utilità di installazione durante l'installazione di un'applicazione di servizio.
Spazio dei nomi: System.ServiceProcess
Assembly: System.ServiceProcess (in system.serviceprocess.dll)
Visual Basic - (Dichiarazione)
Public Class ServiceInstaller
Inherits ComponentInstaller
Dim instance As ServiceInstaller
public class ServiceInstaller : ComponentInstaller
public ref class ServiceInstaller : public ComponentInstaller
public class ServiceInstaller extends ComponentInstaller
public class ServiceInstaller extends ComponentInstaller
ServiceInstaller esegue operazioni specifiche del servizio a cui è associato. Viene utilizzata dall'utilità di installazione per scrivere i valori del Registro di sistema associati al servizio in una sottochiave della chiave di registro HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services. Il servizio è identificato dal relativo ServiceName all'interno di questa sottochiave. La sottochiave contiene anche il nome dell'eseguibile o della DLL a cui appartiene il servizio.
Per installare un servizio, creare una classe di installazione progetti che eredita dalla classe Installer e impostare l'attributo RunInstallerAttribute della classe su true. All'interno del progetto creare un'istanza di ServiceProcessInstaller per ogni applicazione di servizio e un'istanza di ServiceInstaller per ogni servizio contenuto nell'applicazione. All'interno del costruttore della classe del programma di installazione dei progetti impostare le proprietà di installazione del servizio utilizzando le istanze di ServiceProcessInstaller e ServiceInstaller e aggiungendole all'insieme Installers.
Nota |
|---|
| Si consiglia di utilizzare il costruttore per l'aggiunta di istanze del programma di installazione. Se tuttavia è necessario aggiungere le istanze all'insieme Installers del metodo Install, assicurarsi di effettuare le stesse aggiunte nell'insieme del metodo Uninstall. |
Per tutte le classi che derivano dalla classe Installer, lo stato dell'insieme Installers deve corrispondere nei metodi Install e Uninstall. È tuttavia possibile evitare di mantenere lo stato dell'insieme nei metodi Install e Uninstall aggiungendo istanze del programma di installazione all'insieme Installers del costruttore della classe del programma di installazione. Quando viene chiamata l'utilità di installazione cerca l'attributo RunInstallerAttribute. Se l'attributo è true, verranno installati tutti i servizi precedentemente aggiunti all'insieme Installers e associati al programma di installazione del progetto. Se RunInstallerAttribute è false o non esiste, il programma di installazione del progetto verrà ignorato dall'utilità di installazione.
L'oggetto ServiceProcessInstaller associato alla classe di installazione del progetto installa le informazioni comuni a tutte le istanze di ServiceInstaller nel progetto. Se il servizio si distingue per qualche particolare dagli altri servizi nel progetto di installazione, tali informazioni vengono installate da questo metodo.
Nota |
|---|
| È fondamentale che la proprietà ServiceName sia identica alla proprietà ServiceBase.ServiceName della classe derivata da ServiceBase . In genere, il valore della proprietà ServiceBase.ServiceName del servizio viene impostata nella funzione Main() dell'eseguibile dell'applicazione del servizio. Gestione controllo servizi utilizza la proprietà ServiceInstaller.ServiceName per individuare il servizio all'interno dell'eseguibile. |
È possibile modificare altre proprietà nella classe ServiceInstaller prima o dopo averla aggiunta all'insieme Installers del programma di installazione del progetto. Ad esempio, la proprietà StartType di un servizio può essere impostata per l'avvio automatico del servizio al riavvio del sistema o per richiedere l'avvio manuale ad opera dell'utente.
Normalmente non vengono chiamati metodi su ServiceInstaller all'interno del codice, in quanto questi vengono chiamati solo dall'utilità di installazione. L'utilità di installazione chiama automaticamente i metodi ServiceProcessInstaller.Install e ServiceInstaller.Install durante il processo di installazione. Per il ripristino da eventuali errori, viene chiamato il metodo Rollback o ServiceInstaller.Rollback su tutti i componenti precedentemente installati.
L'utilità di installazione chiama il metodo Uninstall per rimuovere l'oggetto.
La routine di installazione di un'applicazione mantiene automaticamente le informazioni relative ai componenti già installati utilizzando la proprietà Installer.Context del programma di installazione del progetto. Queste informazioni sullo stato vengono costantemente aggiornate durante l'installazione dell'istanza di ServiceProcessInstaller e di ciascuna istanza di ServiceInstaller. In genere non è necessario che il codice modifichi le informazioni sullo stato in modo esplicito.
Al momento dell'esecuzione dell'installazione, viene creato automaticamente un oggetto EventLogInstaller per l'installazione dell'origine del log eventi associata alla classe derivata da ServiceBase. La proprietà Log per questa origine viene impostata dal costruttore ServiceInstaller sul log delle applicazioni del computer. Quando si imposta la proprietà ServiceName di ServiceInstaller (che è necessario che sia identica alla proprietà ServiceBase.ServiceName del servizio), Source viene impostata automaticamente sullo stesso valore. Se l'installazione non riesce, l'installazione dell'origine viene annullata insieme ai servizi precedentemente installati.
Il metodo Uninstall tenta di interrompere il servizio, se è in esecuzione. Indipendentemente dalla riuscita dell'operazione, Uninstall annulla le modifiche apportate da Install. Se è stata creata una nuova origine per la registrazione degli eventi, l'origine viene eliminata.
Nell'esempio riportato di seguito viene descritta la creazione di un programma di installazione di progetto denominato MyProjectInstaller, che eredita da Installer. Si presuppone l'esistenza di un eseguibile di servizio contenente due servizi, "Hello-World Service 1" e "Hello-World Service 2". All'interno del costruttore per MyProjectInstaller (che viene chiamato dall'utilità di installazione), per ognuno di questi servizi vengono creati oggetti ServiceInstaller e per l'eseguibile viene creata una classe ServiceProcessInstaller. Per consentire all'utilità di installazione di riconoscere MyProjectInstaller come programma di installazione valido, l'attributo RunInstallerAttribute è impostato su true.
Prima di aggiungere i programmi di installazione all'insieme Installers, vengono aggiunte le proprietà opzionali ai programmi di installazione del processo e dei servizi. Quando l'utilità di installazione accede a MyProjectInstaller, verranno installati ad uno ad uno gli oggetti aggiunti all'insieme Installers tramite una chiamata a InstallerCollection.Add. Nel corso di questo processo, il programma di installazione mantiene informazioni sullo stato che indicano quali oggetti sono stati installati, per consentirne il ripristino in caso di problemi durante la procedura di installazione.
È in genere sconsigliabile creare esplicitamente un'istanza della classe del programma di installazione del progetto. È preferibile invece creare la classe e aggiungere alla sintassi l'attributo RunInstallerAttribute, lasciando che sia l'utilità di installazione a chiamarla effettivamente, e quindi a crearne un'istanza.
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
Gerarchia di ereditarietà
System.Object
System.MarshalByRefObject
System.ComponentModel.Component
System.Configuration.Install.Installer
System.Configuration.Install.ComponentInstaller
System.ServiceProcess.ServiceInstaller
I membri statici pubblici (Shared in Visual Basic) di questo tipo sono validi per le operazioni multithreading. I membri di istanza non sono garantiti come thread safe.
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 non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema.
Informazioni sulla versione
.NET Framework
Supportato in: 2.0 1.1 1.0