Dérivez votre classe de service de ServiceBase lorsque vous la définissez dans une application de service. Tout service utile substitue les méthodes OnStart et OnStop. Pour une fonctionnalité plus riche, vous pouvez substituer OnPause et OnContinue par un comportement spécifique en réaction aux modifications d'état du service.
Un service est un exécutable fonctionnant en permanence, qui ne prend pas en charge d'interface utilisateur et qui peut ne pas s'exécuter sous le compte de l'utilisateur ayant ouvert une session. Le service peut s'exécuter quand aucun utilisateur n'est en session sur l'ordinateur.
Par défaut, les services s'exécutent sous le compte système, lequel est différent du compte d'administrateur. Vous ne pouvez pas modifier les droits associés au compte système. Vous avez également la possibilité d'utiliser ServiceProcessInstaller pour spécifier un compte d'utilisateur sous lequel le service s'exécutera.
Un exécutable peut contenir plus d'un service à condition de comprendre un ServiceInstaller distinct pour chaque service. L'instance de ServiceInstaller inscrit le service dans le système. Le programme d'installation associe aussi chaque service à un journal des événements que vous pouvez utiliser pour enregistrer les commandes du service. La fonction main() de l'exécutable définit les services qui doivent s'exécuter. Le répertoire de travail actif du service est le répertoire système et non le répertoire où se trouve l'exécutable.
Lorsque vous démarrez un service, le système trouve l'exécutable et exécute la méthode OnStart pour ce service qui se trouve dans l'exécutable. Toutefois, il convient de faire la distinction entre l'exécution du service et celle de l'exécutable. L'exécutable se contente de charger le service. Vous accédez au service lui-même (pour le démarrer et l'arrêter notamment) par le biais du Gestionnaire de contrôle des services.
L'exécutable appelle le constructeur de la classe dérivée ServiceBase lorsque vous appelez pour la première fois Start sur le service. La méthode de gestion de commande OnStart est appelée immédiatement après l'exécution du constructeur. Le constructeur ne s'exécute plus après le chargement initial du service ; il est donc nécessaire de séparer le traitement effectué par le constructeur de celui effectué par OnStart. Toutes les ressources qui peuvent être libérées par OnStop doivent être créées dans OnStart. Le fait de créer les ressources dans le constructeur empêche qu'elles ne soient créées correctement dans le cas où le service serait redémarré après la libération de ces ressources par OnStop.
Le Gestionnaire de contrôle des services (SCM, Service Control Manager) permet l'interaction avec le service. Vous pouvez utiliser SCM pour passer au service des commandes Démarrer, Arrêter, Suspendre, Continuer ou des commandes personnalisées. Le Gestionnaire de contrôle des services utilise les valeurs de CanStop et CanPauseAndContinue pour déterminer si le service accepte les commandes Arrêter, Suspendre et Continuer. Les commandes Arrêter, Suspendre et Continuer ne sont activées dans les menus contextuels de SCM que si la propriété correspondante CanStop ou CanPauseAndContinue a la valeur true dans la classe du service. Si elle est activée, la commande est passée au service et la méthode OnStop, OnPause ou OnContinue est appelée. Si CanStop, CanShutdown ou CanPauseAndContinue a la valeur false, la méthode de gestion de commande correspondante (par exemple, OnStop) n'est pas traitée, même si vous avez implémenté cette méthode.
Vous pouvez utiliser la classe ServiceController pour accomplir par programme ce que fait le Gestionnaire de contrôle des services à l'aide d'une interface utilisateur. Il est possible d'automatiser les tâches disponibles dans la console. Si CanStop, CanShutdown ou CanPauseAndContinue a la valeur true et que vous n'avez pas implémenté la méthode de gestion de commande correspondante (par exemple, OnStop), le système lève une exception et ignore la commande.
Il n'est pas nécessaire d'implémenter OnStart, OnStop ou toute autre méthode de ServiceBase. Toutefois, comme le comportement du service est décrit dans OnStart, il convient au minimum de substituer ce membre. La fonction main() de l'exécutable inscrit le service dans l'exécutable avec le Gestionnaire de contrôle des services en appelant la méthode Run. La propriété ServiceName de l'objet ServiceBase passé à la méthode Run doit correspondre à la propriété ServiceName du programme d'installation de service pour ce service.
Vous pouvez utiliser InstallUtil.exe pour installer des services sur votre système.
Remarque : |
|---|
Vous pouvez spécifier un journal différent du journal des événements de l'application pour recevoir la notification des appels du service ; toutefois, aucune des propriétés AutoLog et EventLog ne peut écrire dans un journal personnalisé. Affectez à AutoLog la valeur false si vous ne souhaitez pas utiliser l'enregistrement automatique dans le journal. |