2010-07-03 16 views
4

Comment puis-je faire mon service Windows fonctionne de la façon suivante ...Double-cliquez pour démarrer le service Windows

1.) Démarrer automatiquement après avoir installé

2.) Démarrer automatiquement même si nous avons simplement double-cliquez sur l'exécutable

En d'autres termes, je ne veux pas utiliser les commandes "NET START", "SC" et ne voulez pas le démarrer via la console de services. Je veux juste que mon service s'auto-installe et se démarre automatiquement ... plus se lance automatiquement quand on double clique sur l'exécutable.

Merci.

Répondre

2

Jetez un coup d'oeil au projet Topshelf (http://topshelf-project.com) et éliminer toute la complexité de l'écriture de services Windows dans .NET. Il gère tous les auto-enregistrements et élimine toutes les dépendances sur le code de service de votre application.

Il est également open-source et hébergé sur GitHub, ce qui le rend facile à adapter à n'importe quelle application.

(divulgation complète, je suis l'un des auteurs du projet)

+0

J'ai essayé votre projet ... mais l'argument SERVICE ne fonctionne pas.C'est comme un service Windows normal.it dit " --------------------------- Échec du démarrage du service Windows ----------------- ---------- Impossible de démarrer le service à partir de la ligne de commande ou d'un débogueur Un service Windows doit d'abord être installé (à l'aide de installutil.exe), puis démarré avec ServerExplorer, l'outil d'administration Windows Services ou le NET START commande --------------------------- OK ----------------- ---------- ". – Josh

+0

Vous devez créer votre propre EXE, vous pouvez suivre le play-by-play ici: http://topshelf-project.com/documentation/getting-started/ –

+0

Merci ...Et les liens de téléchargement ne fonctionnent pas sur votre site Web .. – Josh

4

Jetez un oeil à ServiceController classe.

Vous pouvez l'utiliser en cas commited comme ceci:

[RunInstaller(true)] 
public class ServiceInstaller : Installer 
{ 
    string serviceName = "MyServiceName"; 

    public ServiceInstaller() 
    { 
     var processInstaller = new ServiceProcessInstaller(); 
     var serviceInstaller = new ServiceInstaller(); 

     processInstaller.Account = ...; 
     processInstaller.Username = ...; 
     processInstaller.Password = ...; 

     serviceInstaller.DisplayName = serviceName; 
     serviceInstaller.StartType = ServiceStartMode.Automatic; 

     serviceInstaller.ServiceName = serviceName; 

     this.Installers.Add(processInstaller); 
     this.Installers.Add(serviceInstaller); 

     this.Committed += new InstallEventHandler(ServiceInstaller_Committed); 
    } 

    void ServiceInstaller_Committed(object sender, InstallEventArgs e) 
    { 
     // Auto Start the Service Once Installation is Finished. 
     var controller = new ServiceController(serviceName); 
     controller.Start(); 
    } 
} 
+0

Je dois encore utiliser le « NET START » ou « SC » .... Comment puis-je démarrer le service en double cliquant sur il? – Josh

+0

@Josh Vous pouvez simplement doubler l'horloge sur le fichier exécutable et exécuter le service. Ce que vous pouvez faire est juste de faire un autre exécutable qui utilisera ServiceController pour démarrer vos services qui n'est pas démarré. Vous pouvez vérifier comment MS SQL Server fait cela. Il existe un programme séparé qui arrête et démarre le service si vous ne voulez pas utiliser MMC. – Incognito

0

Mon poste here montre comment avoir votre service Windows lui-même installer à partir de la ligne de commande en utilisant une option -install. Vous pouvez étendre cette logique pour avoir une option -start, puis créer un raccourci sur le bureau qui inclut cette option.

+0

- l'option de démarrage est ce dont j'ai réellement besoin. – Josh

1

Vous pouvez ajouter des arguments de ligne de commande qui appellent le programme d'installation (utilisation ManagedInstallerClass.InstallHelper()), et le code pour démarrer le service ...

public class DataImportService : ServiceBase 
{ 
    // ----------- Other code ----------- 

    static void Main(string[] args) 
    { 
     if (args.Length == 0) 
     { 
      InstallService(false, argValue); break; 
      StartService(); 
     } 
     else 
     { 
      string arg0 = args[0], 
      switchVal = arg0.ToUpper(), 
      argValue = arg0.Contains(":") ? 
      arg0.Substring(arg0.IndexOf(":")) : null; 

      switch (switchVal.Substring(0, 1)) 
      { 
       //Install Service and run 
       case ("I"): case ("-I"): case ("/I"): 
        InstallService(true, argValue); break; 

       // Start Service 
       case ("S"): case ("-S"): case ("/S"): 
        StartService(); 
       default: break; 

       // Install & Start Service 
       case ("IS"): case ("-IS"): case ("/IS"): 
        InstallService(false, argValue); break; 
        StartService(); 

       // Uninstall Service 
       case ("U"): case ("-U"): case ("/U"): 
        InstallService(false, argValue); break; 

       default: break;     
      } 
     } 

    private static void InstallService(bool install, string argFileSpec) 
    { 
     string fileSpec = Assembly.GetExecutingAssembly().Location; 
     if (!String.IsNullOrEmpty(argFileSpec)) fileSpec = argFileSpec; 
     // ------------------------------------------------------------ 
     string[] installerParams = 
      install? new string[] { fileSpec } : 
        new string[] { "/u", fileSpec }; 
     ManagedInstallerClass.InstallHelper(installerParams); 
    } 

    private void StartService() 
    { 
     var ctlr = new ServiceController(); 
     ctlr.ServiceName = "MyService"; // hard code the service name 
     // Start the service 
     ctlr.Start();   
    } 
} 
+0

Qu'en est-il du démarrage du service? J'ai besoin de démarrer le service en double cliquant dessus ... – Josh

+0

@Josh, utilisez la classe 'ServiceController()' pour démarrer et arrêter les services. Vous devrez décider comment coder cette routine principale pour le faire ... C'est à vous de le faire ... –