Comment configurer le nom d’un service Windows lors de l’installation (ou facilement lors de la compilation)?

J’ai créé un service Windows en C #, je l’ai installé sur un serveur et tout fonctionne correctement.

Maintenant, je souhaite réinstaller le même service, mais à partir d’un répertoire de travail différent, d’un fichier de configuration différent, etc. Par conséquent, j’aimerais avoir deux instances (ou plus) du même service exécutées simultanément. Initialement, cela n’est pas possible car l’installateur se plaint du fait qu’il existe déjà un service avec le nom donné installé.

Je peux résoudre ce problème en modifiant mon code, en définissant la propriété ServiceBase.ServiceName sur une nouvelle valeur, puis en recompilant et en exécutant à nouveau InstallUtil.exe. Cependant, je préférerais de beaucoup définir le nom du service au moment de l’installation, c’est-à-dire idéalement, je ferais quelque chose comme:

InstallUtil.exe / i / nom_service = “Instance MyService 2” MyService.exe

Si cela n’est pas réalisable (j’en doute fort), j’aimerais pouvoir insérer le nom du service lors de la création du service. Je pensais qu’il serait peut-être possible d’utiliser une sorte d’événement de construction, un astuce msbuild ou nant astucieuse, ou quelque chose du genre, mais je n’ai aucune idée.

Toutes les suggestions seraient grandement appréciées.

Merci pour votre temps.

J’ai essayé d’accéder à une configuration en utilisant

 ConfigurationManager.OpenExeConfiguration(ssortingng exePath) 

dans l’installateur, mais n’a pas pu le faire fonctionner.

Au lieu de cela, j’ai décidé d’utiliser System.Environment.GetCommandLineArgs() dans le programme d’installation comme suit:

 ssortingng[] commandlineArgs = Environment.GetCommandLineArgs(); ssortingng servicename; ssortingng servicedisplayname; ParseServiceNameSwitches( commandlineArgs, out servicename, out servicedisplayname); serviceInstaller.ServiceName = servicename; serviceInstaller.DisplayName = servicedisplayname; 

Maintenant je peux installer mes services en utilisant

InstallUtil.exe / i InstallableService.dll / servicename = “myserviceinstance_2” / servicedisplayname = “Mon instance de service 2”

J’ai écrit une explication plus élaborée ici .

Vous ne pouvez pas transmettre ceci en tant qu’argument de ligne de commande, car InstallUtil ne fournit pas les hooks adéquats pour cela.

Cependant, vous pouvez obliger votre installateur de service à lire le nom du service à partir d’un fichier de configuration. Si vous examinez du code pour un ServiceInstaller typique, vous verrez qu’il suffit que les propriétés DisplayName et ServiceName appropriées soient configurées au moment de l’exécution. Celles-ci pourraient facilement être lues à partir d’un fichier de configuration au lieu d’être codées en dur.

Au lieu d’utiliser Environment.GetCommandLineArgs(); la classe Installer a une propriété appelée Context partir de laquelle vous pouvez accéder aux arguments de ligne de commande passés à InstallUtil structurés dans un SsortingngDictionary agréable.