2010-09-02 12 views
2

Supposons qu'un exécutable nommé ConsoleOrService.exe soit écrit en C#. C'est actuellement un hybride. Je peux simplement le démarrer sur la ligne de commande, ou je peux l'installer en utilisant le .Net installutil ConsoleOrService.exe puis démarrez le service. Je voudrais une troisième option: l'exécuter sur la ligne de commande comme si: ConsoleOrService.exe --install et le faire faire tout le travail.Existe-t-il un moyen relativement simple pour un .Net exe hybride (application console/service Windows) de s'installer et de se lancer en tant que service?

  1. Est-ce possible?
  2. Est-ce difficile?
  3. Comment puis-je commencer?

Merci, et laissez-moi savoir s'il y a des questions s'il vous plaît.

Répondre

2

C'est en fait assez simple. Je l'ai utilisé dans beaucoup de mes propres services (en fait, TOUS mes services sont capables de faire leur propre installation/désinstallation.) Je le contrôle avec un commutateur de ligne de commande, tel que /install ou /uninstall

l'installation est effectuée comme suit:.

private static void InstallService() 
{ 
var ti = new System.Configuration.Install.TransactedInstaller(); 
var si = new MyServiceInstaller(); 
var cl = new string[] { string.Format(CultureInfo.InvariantCulture, "/assemblypath={0}", System.Reflection.Assembly.GetExecutingAssembly().Location) }; 
var ctx = new System.Configuration.Install.InstallContext(null, cl); 

ti.Installers.Add(si); 
ti.Context = ctx; 
ti.Install(new Hashtable()); 
} 

la désinstallation est le même, sauf que vous appelez ti.Uninstall(null); au lieu de ti.Install(...);

Mon MyServiceInstaller est une classe qui hérite de la classe (comme vous le feriez normalement System.Configuration.Install.Installer avoir dans un service)

+0

Nice, pourriez-vous nous montrer plus de détails, par exemple comment vous gérez la ligne de commande dans le programme? –

+0

Je suppose que cela fait partie de cela, je suis sûr que toutes sortes d'exceptions désagréables se présentent. Pour faire écho à Pierre, si cela ne vous dérange pas de partager un peu plus de code, ce serait très bien accueilli. –

+0

Ma gestion de ligne de commande n'est rien de plus complexe qu'un 'if (args.Length> 0) {...}' et un 'switch (args [0]) {...}' dans ce projet particulier. Je ne gère aucune exception spécialement, car il existe un gestionnaire global pour 'AppDomain.CurrentDomain.UnhandledException' qui se connecte pour moi. – Mark