Derive de ServiceBase al definir la clase de servicio de una aplicación de servicio. Cualquier servicio útil reemplaza los métodos OnStart y OnStop. Para obtener funcionalidad adicional, puede reemplazar OnPause y OnContinue por un comportamiento específico en respuesta a cambios en el estado del servicio.
Un servicio es un ejecutable de ejecución larga que no admite una interfaz de usuario y que puede no ejecutarse en la cuenta de usuario que ha iniciado la sesión. El servicio puede ejecutarse sin que ningún usuario haya iniciado una sesión en el equipo.
De forma predeterminada, los servicios se ejecutan en la cuenta de sistema, que no es igual que la cuenta de administrador. No puede cambiar los derechos de la cuenta de sistema. De modo alternativo, puede utilizar ServiceProcessInstaller para especificar una cuenta de usuario en la que se ejecutará el servicio.
Un ejecutable puede contener más de un servicio, pero tiene que contener un componente ServiceInstaller independiente para cada uno de los servicios. La instancia de ServiceInstaller registra el servicio en el sistema. Asimismo, el instalador asocia cada servicio a un registro de eventos que puede utilizar para registrar comandos de servicio. La función main() del ejecutable define qué servicios deben ejecutarse. El directorio de trabajo actual del servicio es el directorio del sistema, no el directorio en el que está situado el ejecutable.
Cuando se inicia un servicio, el sistema busca el ejecutable y ejecuta el método OnStart de ese servicio, contenido dentro del ejecutable. Sin embargo, ejecutar el servicio no equivale a ejecutar el ejecutable. El ejecutable solamente carga el servicio. Se obtiene acceso al servicio (por ejemplo, lo inicia y lo detiene) mediante el Administrador de control de servicios.
El ejecutable llama al constructor de la clase derivada de ServiceBase la primera vez que se llama a Start para el servicio. Se llama al método de control de comandos OnStart inmediatamente después de que se ejecute el constructor. El constructor no se vuelve a ejecutar después de la primera vez que se ha cargado el servicio, por lo que es necesario separar el procesamiento realizado por el constructor del realizado por OnStart. Cualquier recurso que OnStop pueda liberar tiene que crearse en OnStart. La creación de recursos en el constructor impide que estos se creen adecuadamente si se inicia de nuevo el servicio una vez que OnStop ha liberado los recursos.
El Administrador de control de servicios (SCM, Service Control Manager) permite la interacción con el servicio. Puede utilizar el SCM para pasar comandos Iniciar, Detener, Pausar, Continuar o comandos personalizados al servicio. El SCM utiliza los valores de las propiedades CanStop y CanPauseAndContinue para determinar si el servicio acepta los comandos Detener, Pausar o Continuar. Detener, Pausar y Continuar sólo estarán habilitados en los menús contextuales del SCM si la propiedad CanStop o CanPauseAndContinue correspondiente es true en la clase de servicio. Si está habilitado, el comando se pasa al servicio y se llama a OnStop, OnPause o OnContinue. Si la propiedad CanStop, CanShutdown o CanPauseAndContinue es false, no se procesará el método de control de comandos correspondiente (como OnStop), aunque se haya implementado el método.
Puede utilizar la clase ServiceController para realizar mediante programación lo que el SCM realiza mediante una interfaz de usuario. Es posible automatizar las tareas disponibles en la consola. Si la propiedad CanStop, CanShutdown o CanPauseAndContinue es true, pero no implementó el método de control de comandos correspondiente (como OnStop), el sistema produce una excepción y omite el comando.
No tiene que implementar el método OnStart, OnStop ni ningún otro método en ServiceBase. Sin embargo, el comportamiento del servicio se describe en OnStart, por lo que, como mínimo, tendrá que reemplazarse este miembro. Debe establecerse el nombre del servicio en la función main() del ejecutable. El nombre de servicio que se establece en main() debe coincidir exactamente con la propiedad ServiceName del instalador del servicio.
Puede utilizar InstallUtil.exe para instalar servicios en el sistema.
Nota |
|---|
| Es posible especificar un registro que no sea el registro de eventos de aplicación para recibir la notificación de llamadas de servicio, pero ni la propiedad AutoLog ni la propiedad EventLog pueden escribir en un registro personalizado. Establezca AutoLog en false si no desea utilizar el registro automático. |