2010-11-10 36 views
35

He leído esta pregunta Inno Setup for Windows service?. Tengo el mismo problema, pero no entiendo la respuesta de lubos hasko. ¿Cómo puedo hacerlo? ¿Puede alguien publicarme una guía completa?Servicio de instalación de Windows en .NET C#

Cuando ejecuto el código a continuación, algo está instalado, pero en la lista de servicios, no pude encontrarlo. tengo esto, pero esto no funciona:

using System; 
using System.Collections.Generic; 
using System.Configuration.Install; 
using System.Linq; 
using System.Reflection; 
using System.ServiceProcess; 
using System.Text; 
using System.IO; 

namespace ConsoleApplication1 
{ 

public class Service1 : ServiceBase 
{ 

    public Service1() 
    { 
     File.AppendAllText("sss.txt", "ccccc"); 
    } 

    protected override void OnStart(string[] args) 
    { 
     File.AppendAllText("sss.txt", "asdfasdf"); 
    } 

    protected override void OnStop() 
    { 
     File.AppendAllText("sss.txt", "bbbbb"); 
    } 


    static void Main(string[] args) 
    { 
     if (System.Environment.UserInteractive) 
     { 
      string parameter = string.Concat(args); 
      switch (parameter) 
      { 
       case "--install": 
        ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location }); 
        break; 
       case "--uninstall": 
        ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location }); 
        break; 
      } 
     } 
     else 
     { 
      ServiceBase.Run(new Service1()); 
     } 


     Console.ReadKey(); 
    } 
} 
} 

yo no understad esto tampoco:

if (System.Environment.UserInteractive) ... 

Respuesta

72

Esta es mi solución completa, y funciona. Básicamente es la misma respuesta que en la pregunta this.

using System; 
using System.Configuration.Install; 
using System.Reflection; 
using System.ServiceProcess; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program : ServiceBase 
    { 
     static void Main(string[] args) 
     { 

      AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException; 


      if (System.Environment.UserInteractive) 
      { 
       string parameter = string.Concat(args); 
       switch (parameter) 
       { 
        case "--install": 
         ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location }); 
         break; 
        case "--uninstall": 
         ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location }); 
         break; 
       } 
      } 
      else 
      { 
       ServiceBase.Run(new Program()); 
      } 



     } 

     private static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) 
     { 
      File.AppendAllText(@"C:\Temp\error.txt", ((Exception)e.ExceptionObject).Message + ((Exception)e.ExceptionObject).InnerException.Message); 
     } 

     public Program() 
     { 
      this.ServiceName = "My Service"; 
      File.AppendAllText(@"C:\Temp\sss.txt", "aaa"); 

     } 

     protected override void OnStart(string[] args) 
     { 
      base.OnStart(args); 

      File.AppendAllText(@"C:\Temp\sss.txt", "bbb"); 
     } 

     protected override void OnStop() 
     { 
      base.OnStop(); 

      File.AppendAllText(@"C:\Temp\sss.txt", "ccc"); 
     } 
    } 
} 

y en el mismo proyecto de crear esta clase:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Configuration.Install; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    [RunInstaller(true)] 
    public class MyWindowsServiceInstaller : Installer 
    { 
     public MyWindowsServiceInstaller() 
     { 
      var processInstaller = new ServiceProcessInstaller(); 
      var serviceInstaller = new ServiceInstaller(); 

      //set the privileges 
      processInstaller.Account = ServiceAccount.LocalSystem; 

      serviceInstaller.DisplayName = "My Service"; 
      serviceInstaller.StartType = ServiceStartMode.Automatic; 

      //must be the same as what was set in Program's constructor 
      serviceInstaller.ServiceName = "My Service"; 
      this.Installers.Add(processInstaller); 
      this.Installers.Add(serviceInstaller); 
     } 
    } 
} 

Ejecutar este programa con parámetros --install/- desinstalación como administrador en Windows 7. Compruebe el registro de errores en la temp. Verifique el registro de trabajo en la misma ruta.

0

System.Environment.UserInteractive propiedad que dice que si un proceso de Windows o un servicio como IIS que se ejecuta sin un usuario interfaz.

Si esta propiedad es falsa, no muestre cuadros de diálogo modales o cuadros de mensaje porque no hay una interfaz gráfica de usuario para que el usuario pueda interactuar. Source

Comprobar this artículo también.

+0

Gracias, ese artículo realmente me ayudó. Pero en el artículo, el autor utilizó installutil. No quiero usar installutil. ¿Hay alguna opción? La respuesta está en este artículo http://stackoverflow.com/questions/1449994/inno-setup-for-windows-service/1450051#1450051 pero no sé cómo usarlo. – Simon

+0

¿Por qué no quieres instalar un servicio con installutil? Si es por permisos, no podrá instalar un servicio sin derechos de administrador. No hay trabajo para eso. – jlafay

+0

En realidad, todavía estoy usando installutil, pero a través de ManagedInstallerClass.InstallHelper. Ese es el punto. Cuando despliegue mi programa, no necesito desplegar installutil.exe también. La instalación de WS se realiza durante la instalación de la aplicación con Inno Setup, y esto se realiza bajo derechos de administrador, por lo que no hay problema ... – Simon

1

En primer lugar, en su constructor Service1 establece la propiedad ServiceName.

Extracto de MSDN:

El mínimo que necesita para poner en práctica en el constructor para una clase heredada de ServiceBase es establecer el ServiceName en su componente. Ningún otro procesamiento es específicamente requerido en el constructor. Debería manejar la mayoría de las inicializaciones en OnStart en lugar de en el constructor.

En segundo lugar, debe pasar argumentos a su servicio al ejecutarlo desde la línea de comandos. --install para la instalación, --uninstall para la desinstalación. Observe la declaración del switch que está haciendo en los argumentos de entrada.

+0

Sí, se pasaron los parámetros y se corrigió la construcción. Todavía sin suerte. – Simon

+0

Doh! Vea la respuesta de Simon, esa parte del instalador falta. – Mihailo

+0

Por cierto, tiene una opción, cuando agrega un nuevo elemento a un proyecto, para seleccionar el Servicio de Windows (haga clic con el botón secundario en proyecto, en el menú emergente seleccione Agregar -> Nuevo elemento ... y encuentre el Servicio de Windows allí). Después de agregarlo así puede establecer las propiedades del servicio muy bien y agregar instaladores, etc. – Mihailo

Cuestiones relacionadas