2010-09-17 33 views
9

Estamos desarrollando una aplicación Windows Presentation Foundation que nos gustaría poder ejecutar como un servicio de Windows.Ejecutar una aplicación WPF como un servicio de Windows

¿Alguien ha hecho algo como eso?
¿Es posible?

No necesitamos interactuar con el Escritorio o cualquier GUI, sería bueno tener una Aplicación que podamos ejecutar con una GUI, desde la Línea de Comandos (que funciona) o como un Servicio.

Mirando hacia adelante a la entrada interesante :-)

Respuesta

12

Como regla del pulgar de los servicios no debe tener ningún tipo de interfaz de usuario. Esto se debe a que los servicios generalmente se ejecutan con privilegios muy altos y pueden ocurrir cosas malas si no se es muy cuidadoso con sus entradas. (Creo que las versiones más nuevas de Windows no le permitirán crear UI desde un servicio, pero no estoy 100% seguro.)

Si necesita comunicarse con un servicio, debe usar alguna forma de IPC (WCF, tubos, tomas de corriente,   ...). Si quieres un programa de consola simple que también puede ser un servicio, no conozco un truco para poner esto en marcha:

class MyExampleApp : ServiceBase 
{ 
    public static void Main(string[] args) 
    { 
     if (args.Length == 1 && args[0].Equals("--console")) 
     { 
      new MyExampleApp().ConsoleRun(); 
     } 
     else 
     { 
      ServiceBase.Run(new MyExampleApp()); 
     } 
    } 
    private void ConsoleRun() 
    { 
     Console.WriteLine(string.Format("{0}::starting...", GetType().FullName)); 

     OnStart(null); 

     Console.WriteLine(string.Format("{0}::ready (ENTER to exit)", GetType().FullName)); 
     Console.ReadLine(); 

     OnStop(); 

     Console.WriteLine(string.Format("{0}::stopped", GetType().FullName)); 
    } 
    //snip 
} 

Si usted acaba de empezar el programa, se pondrá en marcha como un servicio (y grito a usted si lo ejecuta desde la consola), pero si agrega el parámetro --console cuando lo inicia, el programa se iniciará y esperará que presione enter para cerrar.

+0

Esto está bien para la CLI y el Servicio. –

+0

Gracias por el código. Debes profundizar un poco más en los Servicios para comprender la parte de OnStop. – Remy

0

Si ya lo tiene trabajando desde la línea de comandos, está a medio camino. Algunas aplicaciones simplemente tienen designaciones de banderas simples que usted usa cuando desea ejecutar la aplicación como un servicio, verifica estas banderas y tiene su flujo lógico en consecuencia. Algo como:

myapp.exe --runservice 
+0

No es un mal consejo, pero me parece que generalmente es mejor tener la CLI ejecutándose como un servicio por defecto. Simplifica la configuración. –

3

no hacen esto. Escriba todas las agallas en un conjunto de motor, luego hágalo desde la GUI y el servicio. La CLI puede ser un tercer ejecutable o una reutilización del ejecutable del servicio. La clave es permitir que el servicio se ejecute sin ninguna referencia a WPF o WinForms o cualquier marco de GUI que utilice.

+0

Estaba pensando en esto también. Suena como una solución razonable. Pero, ¿por qué es mala una referencia a WPF o WinForms? ¿Siempre y cuando solo sea una referencia? – Remy

+0

@ Remy: una referencia estática carga el ensamblado al principio. –

0

Mi solución es añadir una función de entrada principal, como:

public static void Main() 
{ 
    ServiceBase.Run(new MyService()); 
} 

Ahora tenemos dos entrada de inicio de aplicaciones, una para WPF, uno para servicios de Windows;

Podemos configurar el objeto de inicio en Visual Studio -> Propiedad del proyecto -> Aplicación -> Objeto de inicio.

Así que al configurar la entrada y reconstruir, obtendrá lo que desee.

Cuestiones relacionadas