Derivare da ServiceBase quando si definisce la classe di servizio in un'applicazione di servizio. Ogni servizio utile esegue l'override dei metodi OnStart e OnStop. Per funzionalità aggiuntive, è possibile eseguire l'override di OnPause e OnContinue con un funzionamento specifico in risposta alle variazioni dello stato di servizio.
Il servizio è un eseguibile ad esecuzione prolungata che non supporta un'interfaccia utente e che potrebbe non essere avviato con l'account utente connesso. Per eseguire il servizio non è necessario che un utente sia connesso al computer.
In base all'impostazione predefinita, i servizi vengono eseguiti con l'account System, che non corrisponde all'account Administrator. Non è possibile modificare i privilegi dell'account System. In alternativa, è possibile utilizzare un oggetto ServiceProcessInstaller per specificare un account utente con il quale verrà eseguito il servizio.
Un eseguibile può contenere più servizi ma è necessario che contenga un oggetto ServiceInstaller separato per ciascuno di essi. L'istanza di ServiceInstaller registra il servizio nel sistema. Il programma di installazione, inoltre, associa ciascun servizio a un registro eventi che può essere utilizzato per registrare i comandi di servizio. La funzione main() nell'eseguibile definisce quali servizi è necessario eseguire. La directory di lavoro corrente del servizio è la directory di sistema e non quella in cui si trova l'eseguibile.
Quando si avvia un servizio, il sistema individua l'eseguibile ed esegue il metodo OnStart per tale servizio, contenuto all'interno dell'eseguibile. Eseguire un servizio, tuttavia, non significa avviare l'eseguibile. L'eseguibile carica solo il servizio. Al servizio è possibile accedere (ad esempio, per l'avvio e l'interruzione) mediante Gestione controllo servizi.
L'eseguibile chiama il costruttore della classe derivata ServiceBase la prima volta che si chiama il metodo Start sul servizio. Il metodo per la gestione dei comandi OnStart viene chiamato subito dopo l'esecuzione del costruttore. Poiché il costruttore non viene più eseguito dopo il primo caricamento del servizio, è necessario separare l'elaborazione eseguita dal costruttore da quella eseguita dal metodo OnStart . È necessario che tutte le risorse che possono essere rilasciate dal metodo OnStop siano create nel metodo OnStart . La creazione di risorse nel costruttore ne impedisce la creazione corretta se il servizio viene riavviato dopo che il metodo OnStop le ha rilasciate.
Gestione controllo servizi (SCM, Service Control Manager) fornisce un modo per interagire con il servizio. Il gestore SCM può essere utilizzato per passare comandi di avvio, interruzione, pausa o continuazione oppure comandi personalizzati nel servizio. Il gestore SCM utilizza i valori di CanStop e CanPauseAndContinue per determinare se il servizio accetta i comandi di avvio, pausa o continuazione. Tali comandi vengono attivati nei menu di scelta rapida di SCM solo se la corrispondente proprietà CanStop o CanPauseAndContinue è true nella classe di servizio. Se attivato, il comando viene passato al servizio e viene chiamato OnStop, OnPause o OnContinue. Se la proprietà CanStop, CanShutdown o CanPauseAndContinue è false, il corrispondente metodo per la gestione dei comandi (ad esempio OnStop ) non verrà elaborato, anche se il metodo è stato implementato.
È possibile utilizzare la classe ServiceController per eseguire in modo programmatico ciò che il gestore SCM effettua tramite un'interfaccia utente. È possibile automatizzare le attività disponibili nella console. Se CanStop, CanShutdown o CanPauseAndContinue è true ma non è stato implementato un corrispondente metodo per la gestione dei comandi (ad esempio OnStop), il sistema genera un'eccezione e ignora il comando.
Non è necessario implementare OnStart, OnStop o un altro metodo in ServiceBase. Comunque, il funzionamento del servizio è descritto nel OnStart, quindi occorrere almeno eseguire l'override di questo membro. La funzione main() del file eseguibile registra il servizio nel file eseguibile con il gestore SCM mediante la chiamata del metodo Run. La proprietà ServiceName dell'oggetto ServiceBase passata al metodo Run deve corrispondere alla proprietà ServiceName del programma di installazione di tale servizio.
Per installare servizi nel sistema, è possibile utilizzare InstallUtil.exe.
Nota: |
|---|
Sebbene sia possibile specificare un log diverso dal log eventi delle applicazioni per ricevere la notifica delle chiamate ai servizi, tenere presente che le proprietà AutoLog e EventLog non possono scrivere in un log personalizzato. Se non si desidera utilizzare la registrazione automatica, impostare AutoLog su false. |