Servicios Windows en .NET (3ª parte)

Depuración

Una vez hemos logrado instalar correctamente el servicio y lo hemos conseguido iniciar, podemos depurarlo durante su funcionamiento con Visual Studio, lo cual está muy bien. Para ello, lo primero que tenemos que hacer es asociar el Debugger de VisualStudio con el proceso que deseamos depurar o tracear:

Asociar un Servicio Windows en ejecución

Simplemente señalar que, como ya hemos dicho, el servicio debe estar ejecutándose en estos momentos.

  1. Cargue el proyecto del Servicio en Visual Studio.
  2. Haga clic en el menú Debug (*)
  3. Haga clic en la opción Processes (*)
  4. Asegúrese de que la opción Mostrar todos los procesos está seleccionada.
  5. Haga clic sobre el proceso que desea asociar, en la lista de Procesos Disponibles.
  6. Haga clic sobre el botón Asociar.
  7. Haga clic sobre OK, y después sobre Cerrar.
  8. Ahora puede establecer puntos de interrupción donde desee, y esperar que la ejecución del servicio llegue a tales puntos.

(*)NOTA: En la versión en Castellano de VisualStudio, esta opción se encuentra en Herramientas->Asociar al Proceso…

Esto es todo. Espero que les haya servido de algo y que a más de uno le haya solucionado la papeleta. Agradecería mucho sus comentarios y opiniones al respecto; si les he ayudado en algo y, por supuesto, si tienen algún problema también pueden dejar un comentario y yo personalmente, si soy capaz, trataré de ayudarles.

Apéndice: Manejo de rutas de directorios.

MUY IMPORTANTE: Por alguna razón que se escapa a mi raciocinio, al convertir un programa de consola corriente y moliente a Servicio Windows la ruta de ficheros raíz (el Path) desde la que se ubica el programa (normalmente el directorio \bin de la aplicación correspondiente) se trastoca y se cambia a C:\Windows\. Esto no supone ningún problema salvo si tenemos que indicar alguna ruta para escribir o leer de un fichero, por ejemplo, lo cual supone un gran problema porque es un dato que podemos leer pero no modificar. Por mucho que os molestéis en ir al Administrador de Servicios y ver las Propiedades del Servicio instalado, aunque en la ruta sea correcta y apunte al directorio de la aplicación, en realidad al ejecutar irá al directorio Windows.

¿Cómo solventar el problema? Bueno, yo lo hice introduciendo esta ruta en el registro de Windows, lo cual no es mala idea porque permite configurar vuestra aplicación de forma personalizada en la máquina cliente, en el directorio que queráis, lo cual desacopla bastante la instalación del código de la propia aplicación. No me parece correcto, por tanto, introducir rutas fijas, absolutas, en el código, porque si cambiamos de máquina es posible que la estructura de ficheros o el volumen cambie, lo cual nos obliga a modificar el código y recompilar, lo cual es inadmisible. De otro modo solamente tendremos que modificar una clave de registro, y si a este servicio le creamos un instalador MSI donde el usuario indique esta ruta la solución será muchísimo mejor y más elegante.

Por si no sabéis cómo se lee del Registro de Windows, podéis buscar en Internet, pero para que veáis lo bueno que soy, aquí os indico un ejemplo, para los más vagos:

public static string leerRutaConfigRegistro()
{
//Lee del registro de windows la ruta hacia los archivos de configuración
string rutaConfiguracion = "";
//accedemos al registro
RegistryKey mKey = Registry.LocalMachine.OpenSubKey(@"Software\<miEmpresa>\Paths\", true);
//si existe la clave, la traemos
if (mKey != null)
{
try
{
rutaConfiguracion = mKey.GetValue("RutaConfig").ToString();
}
catch (Exception eo)
{
/* Devolvemos una cadena vacía; el invocador de esta llamada va a dar un error y se encargará
* de hacer lo que tenga que hacer, como de lanzar una excepción, por ejemplo
* mediante 'throw'
*/
Log.Write("No se pudo acceder a la ruta de Configuración. " + eo.Message, true);
return "";
}
}
mKey.Close();
return rutaConfiguracion;
}

Creo que está bastante claro y documentado el código. Si no, dénle un par de vueltas, no lo voy a hacer yo todo…

————————————————————————————————————————————————————————–
Fuente original en inglés (aunque gran parte del artículo son notas propias):
http://www.developer.com/net/csharp/article.php/10918_2173801_1
Donde encontraréis un ejemplo incluso.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s