Tutorial: Crear una aplicación de servicios de Windows en el Diseñador de componentes
Actualización: noviembre 2007
Nota: |
---|
La plantilla Servicio de Windows con su funcionalidad asociada no está disponible en Visual Studio Standard. |
Los procedimientos de este tema muestran el proceso de creación de una sencilla aplicación de servicios de Windows que escribe mensajes en un registro de eventos. Los pasos básicos que se realizan para crear y usar el servicio son los siguientes:
Crear un proyecto mediante la plantilla de aplicaciones de Servicios de Windows. Esta plantilla crea una clase que hereda de ServiceBase y escribe gran parte del código básico del servicio, como el código que lo inicia.
Escribir el código de los procedimientos OnStart y OnStop, y reemplazar el resto de los métodos que desee volver a definir.
Agregar los instaladores necesarios para su aplicación de servicio. De forma predeterminada, al hacer clic en el vínculo Agregar instalador, se agrega a la aplicación una clase que contiene dos o más instaladores: uno para instalar el proceso y otro para cada uno de los servicios asociados que contiene.
Generar el proyecto.
Crear un proyecto de instalación para instalar el servicio y, a continuación, instalarlo.
Abrir el Administrador de control de servicios de Windows 2000 e iniciar el servicio.
Para empezar, debe crear el proyecto y definir los valores necesarios para que el servicio funcione correctamente.
Nota: |
---|
Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario de Visual Studio incluidos en las instrucciones siguientes. La edición de Visual Studio que se tenga y la configuración que se utilice determinan estos elementos. Para obtener más información, vea Valores de configuración de Visual Studio. |
Crear un servicio
Para crear y configurar el servicio
En el menú Archivo, haga clic en Nuevo proyecto.
Aparece el cuadro de diálogo Nuevo proyecto.
Seleccione el proyecto Servicio de Windows de la lista de plantillas de proyecto de Visual Basic, Visual C#, Visual C++ o Visual J# y asígnele el nombre MyNewService. Haga clic en Aceptar.
Nota: La plantilla de proyecto agrega automáticamente una clase de componente, denominada Service1, que hereda de System.ServiceProcess.ServiceBase.
Haga clic en el diseñador para seleccionar Service1. A continuación, en la ventana Propiedades, establezca ServiceName y la propiedad (Name) de Service1 en MyNewService.
Establezca la propiedad AutoLog en true.
En el menú Ver, haga clic en Código para abrir el Editor de código. Edite el método Main para crear una instancia de MyNewService. Cuando cambió el nombre del servicio en el paso 3, el nombre de la clase no se modificó en el método Main. En aplicaciones de Visual C# y Visual J#, el método Main se encuentra en los archivos Program.cs y Program.js, respectivamente.
' To access the Main method in Visual Basic, select Main from the ' method name drop-down list. This expands the Component Designer ' generated code region. Shared Sub Main() Dim ServicesToRun() As System.ServiceProcess.ServiceBase ' Change the following line to match. ServicesToRun = New System.ServiceProcess.ServiceBase() _ {New MyNewService()} System.ServiceProcess.ServiceBase.Run(ServicesToRun) End Sub
static void Main() { System.ServiceProcess.ServiceBase[] ServicesToRun; // Change the following line to match. ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun); }
public static void main(String[] args) { System.ServiceProcess.ServiceBase[] ServicesToRun; ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun); }
Agregar características al servicio
En la siguiente sección, va a agregar un registro de eventos personalizado al servicio de Windows. Los registros de eventos no están asociados de ningún modo a los servicios de Windows. Aquí, el componente EventLog se utiliza como ejemplo del tipo de componente que se puede agregar a un servicio de Windows. Para obtener más información sobre los registros de eventos personalizados, vea Cómo: Crear y quitar registros de eventos personalizados.
Para agregar la funcionalidad de registro de eventos personalizado al servicio
En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en Service1.vb, Service1.cs o Service1.jsl y seleccione Diseñador de vistas.
En la ficha Componentes del Cuadro de herramientas, arrastre un componente EventLog hasta el diseñador.
En el Explorador de soluciones, haga clic con el botón secundario del mouse en Service1.vb, Service1.cs o Service1.jsl y seleccione Ver código.
Modifique el constructor para definir un registro de eventos personalizado:
' To access the constructor in Visual Basic, select New from the ' method name drop-down list. Public Sub New() MyBase.New() InitializeComponent() If Not System.Diagnostics.EventLog.SourceExists("MySource") Then System.Diagnostics.EventLog.CreateEventSource("MySource", _ "MyNewLog") End If EventLog1.Source = "MySource" EventLog1.Log = "MyNewLog" End Sub
public MyNewService() { InitializeComponent(); if (!System.Diagnostics.EventLog.SourceExists("MySource")) { System.Diagnostics.EventLog.CreateEventSource( "MySource","MyNewLog"); } eventLog1.Source = "MySource"; eventLog1.Log = "MyNewLog"; }
public MyNewService() { InitializeComponent(); if (!System.Diagnostics.EventLog.SourceExists("MySource")) { System.Diagnostics.EventLog.CreateEventSource( "MySource", "MyNewLog"); } eventLog1.set_Source("MySource"); eventLog1.set_Log("MyNewLog"); }
Para definir qué ocurre al iniciar el servicio
En el Editor de código, busque el método OnStart, que fue invalidado automáticamente al crear el proyecto, y escriba código que determine las acciones que se deben realizar al empezar a ejecutar el servicio:
' To access the OnStart in Visual Basic, select OnStart from the ' method name drop-down list. Protected Overrides Sub OnStart(ByVal args() As String) EventLog1.WriteEntry("In OnStart") End Sub
protected override void OnStart(string[] args) { eventLog1.WriteEntry("In OnStart"); }
protected void OnStart(String[] args) { eventLog1.WriteEntry("In OnStart"); }
Nota: Una aplicación de servicio está diseñada para ejecutarse de forma prolongada. Por lo tanto, normalmente sondea o supervisa algún elemento del sistema. La supervisión se puede establecer en el método OnStart. Sin embargo, OnStart no lleva a cabo realmente la supervisión. El método OnStart debe volver al sistema operativo después de que haya comenzado el funcionamiento del servicio. No debe bloquearse ni ejecutar un bucle infinito. Para establecer un mecanismo de sondeo sencillo, utilice el componente System.Timers.Timer. En el método OnStart, debería establecer los parámetros en el componente y, a continuación, establecer la propiedad Enabled en true. El temporizador activaría entonces los eventos periódicamente en el código y, en esos instantes, el servicio podría realizar su control.
Para definir qué debe ocurrir al detener el servicio
En el Editor de código, seleccione el procedimiento OnStop de la lista desplegable Nombre de método, que se invalidó automáticamente al crear el proyecto. Escriba el código para determinar lo que ocurre cuando se detiene el servicio:
Protected Overrides Sub OnStop() EventLog1.WriteEntry("In OnStop.") End Sub
protected override void OnStop() { eventLog1.WriteEntry("In onStop."); }
protected void OnStop() { eventLog1.WriteEntry("In onStop."); }
También puede invalidar los métodos OnPause, OnContinue y OnShutdown para definir un procesamiento adicional para el componente.
Para definir otras acciones para el servicio
Para el método que desee controlar, invalide el método apropiado y defina lo que desea que suceda.
El código siguiente muestra el aspecto del método OnContinue al ser reemplazado:
Protected Overrides Sub OnContinue() EventLog1.WriteEntry("In OnContinue.") End Sub
protected override void OnContinue() { eventLog1.WriteEntry("In OnContinue."); }
protected void OnContinue() { eventLog1.WriteEntry("In OnContinue."); }
Cuando se instala un servicio de Windows se deben ejecutar algunas acciones personalizadas, que se consigue mediante la clase Installer. Visual Studio puede crear estos instaladores específicamente para un servicio de Windows y agregarlos al proyecto.
Para crear los instaladores necesarios para el servicio
En el Explorador de soluciones, haga clic con el botón secundario del mouse en Service1.vb, Service1.cs o Service1.jsl y seleccione Diseñador de vistas.
Haga clic en el fondo del diseñador para seleccionar el propio servicio, en vez de cualquier elemento de su contenido.
Con el foco en el diseñador, haga clic con el botón secundario del mouse y, a continuación, haga clic en Agregar instalador.
De forma predeterminada, se agrega al proyecto una clase de componente que contiene dos instaladores. El componente se denomina ProjectInstaller, y los instaladores que contiene son el instalador para el servicio y el instalador para el proceso asociado al servicio.
En la vista Diseño de ProjectInstaller, haga clic en ServiceInstaller1 o en serviceInstaller1.
En la ventana Propiedades, establezca la propiedad ServiceName en MyNewService.
En el diseñador, haga clic en ServiceProcessInstaller1 (para un proyecto de Visual Basic) o en serviceProcessInstaller1 (para un proyecto de Visual C# o Visual J#). Establezca la propiedad Account en LocalService. Esto hará que se instale el servicio y se ejecute con una cuenta de servicio local.
Nota de seguridad: La cuenta LocalService actúa como usuario sin privilegios en el equipo local y presenta credenciales anónimas a cualquier servidor remoto. Utilice las demás cuentas con cuidado, puesto que se ejecutan con privilegios muy amplios y ello incrementa el riesgo de ataques de código malintencionado.
Para generar el proyecto de servicio
En el Explorador de soluciones, haga clic con el botón secundario en su proyecto y, a continuación, haga clic en Propiedades. Aparece el Diseñador de propiedades del proyecto.
En la página Aplicación, de la lista Objeto inicial, haga clic en MyNewService.
Presione Ctrl+Mayús+B para generar el proyecto.
Ahora que el proyecto se ha generado, puede ser implantado en el sistema. Un proyecto de instalación instalará los archivos del proyecto compilados y ejecutará los instaladores necesarios para ejecutar el servicio de Windows. Para crear un proyecto de instalación completo, deberá agregar el resultado del proyecto (MyNewService.exe) al proyecto de instalación y, a continuación, agregar una acción personalizada para instalar MyNewService.exe. Para obtener más información sobre proyectos de programas de instalación, vea Proyectos de instalación. Para obtener más información sobre acciones personalizadas, vea Tutorial: Crear una acción personalizada.
Para crear un proyecto de instalación para el servicio
En el Explorador de soluciones, haga clic con el botón secundario del mouse para seleccionar la solución, elija Agregar y, a continuación, haga clic en Nuevo proyecto.
En el panel Tipos de proyecto, seleccione la carpeta Proyectos de instalación e implementación.
En el panel Plantillas, seleccione Proyecto de instalación. Asigne al proyecto el nombre MyServiceSetup. Haga clic en Aceptar.
Se agregará un proyecto de instalación a la solución.
A continuación, deberá agregar el resultado del proyecto de servicio de Windows (MyNewService.exe) a la instalación.
Para agregar MyNewService.exe al proyecto de instalación
En el Explorador de soluciones, haga clic con el botón secundario en MyServiceSetup, elija Agregar y, a continuación, haga clic en Resultados del proyecto.
Aparecerá el cuadro de diálogo Agregar grupo de resultados del proyecto.
MyNewService aparece seleccionado en el cuadro Proyecto.
En la lista, seleccione Resultado principal y haga clic en Aceptar.
Se agrega al proyecto de instalación un elemento del proyecto para el resultado principal de MyNewService.
Ahora, agregue una acción personalizada para instalar el archivo MyNewService.exe.
Para agregar una acción personalizada al proyecto de instalación
En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto de instalación, elija Ver y haga clic en Acciones personalizadas.
Aparece el editor de Acciones personalizadas.
En el editor de Acciones personalizadas, haga clic con el botón secundario en el nodo Acciones personalizadas y haga clic en Agregar acción personalizada.
Aparecerá el cuadro de diálogo Seleccionar elemento en el proyecto.
Haga doble clic en la opción Carpeta de la aplicación de la lista para abrirla, seleccione Resultado principal de MyNewService (activo) y haga clic en Aceptar.
El resultado principal se agrega a los cuatro nodos de las acciones personalizadas: Instalar, Confirmar, Deshacer y Desinstalar.
En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto MyServiceSetup y haga clic en Generar.
Para instalar el servicio de Windows
Para instalar MyNewService.exe, haga clic con el botón secundario del mouse en el proyecto de instalación en el Explorador de soluciones y seleccione Instalar.
Siga los pasos del Asistente para proyectos de instalación. Genere y guarde la solución.
Para iniciar y detener el servicio
Abra el Administrador de control de servicios mediante uno de los métodos siguientes:
En Windows XP y 2000 Professional, haga clic con el botón secundario del mouse en Mi PC en el escritorio y, a continuación, haga clic en Administrar. En el cuadro de diálogo Administración de equipos, expanda el nodo Servicios y Aplicaciones.
O bien
En Windows Server 2003 y Windows 2000 Server, haga clic en Inicio, elija Programas, haga clic en Herramientas administrativas y, a continuación, en Servicios.
Nota: En Windows NT versión 4.0, puede abrir este cuadro de diálogo desde el Panel de control.
Podrá ver el servicio MyNewService en la lista de la sección Servicios de la ventana.
Seleccione su servicio en la lista, haga clic en él con el botón secundario y luego haga clic en Iniciar.
Haga clic con el botón secundario en el servicio y, a continuación, haga clic en Detener.
Para comprobar el registro de eventos del servicio
Vaya al Explorador de servidores y busque el nodo Registros de eventos. Para obtener más información, vea Cómo: Trabajar con registros de eventos en el Explorador de servidores.
Nota: La plantilla Servicio de Windows con su funcionalidad asociada no está disponible en Visual Studio Standard.
Busque la entrada correspondiente a MyNewLog y expándala. Aparecerán las entradas correspondientes a las acciones realizadas por el servicio.
Para desinstalar el servicio
En el menú Inicio, abra el Panel de control, haga clic en Agregar o quitar programas, busque el servicio y haga clic en Desinstalar.
También puede desinstalar el programa haciendo clic con el botón secundario en el icono de programa correspondiente al archivo .msi y seleccionando Desinstalar.
Nota: Si instaló el servicio en Windows 2000, deberá reiniciar el sistema para poder reinstalar el servicio. En Windows 2000, los servicios no se eliminan totalmente hasta que se reinicia el sistema.
Pasos siguientes
Podría probar también el uso de un componente ServiceController para enviar comandos al servicio instalado. Para obtener más información sobre cómo usar el componente ServiceController, vea Supervisar servicios de Windows.
Puede usar un instalador para crear un registro de eventos al instalar la aplicación, en lugar de crearlo cuando se ejecuta la aplicación. Además, el instalador eliminará el registro de eventos cuando se desinstale la aplicación. Para obtener más información, vea Tutorial: Instalar un componente de registro de eventos.
Vea también
Tareas
Cómo: Agregar instaladores a una aplicación de servicio
Cómo: Instalar y desinstalar servicios
Cómo: Depurar aplicaciones de servicios de Windows
Cómo: Iniciar el visor de eventos desde el Explorador de servidores
Conceptos
Introducción a las aplicaciones de servicios de Windows
Referencia
Cómo: Tener acceso e inicializar el Explorador de servidores o el Explorador de bases de datos