J'ai été confronté recemment à un cas de figure , je devais installer un serivce NT sur un serveur et faire tourner celui-ci pour differents clients de manière cloisonnée (Une installation par client). Il existe plusieures solutions pour resoudre ce problème
- Faire de telle sorte que le service prenne via un fichier de config ou autre tous les clients
Avantage, un seul service (bien pour l'administrateur du serveur), façile a mettre en oeuvre
Inconvenient (tous les clients utilisent les memes versions d'assemblies)
A cause de l'inconvenient je ne pouvais pas utiliser cette solution
- Compiller un service avec nom par client.
Avantage façile a mettre en oeuvre
Inconvenient (Si beaucoup de client très fastidieux a maintenir)
- Trouver un moyen de changer le nom d'un service lors de son installation.
C'est la solution que j'ai retenu.
Le projet de depart :
donc le service et son installer, c'est lui qui nous interesse, on peut voir la propriété ServiceName, a laquelle j'ai associé el nom MyService
Le code de l'installer est le suivant :
1: namespace MyService
2: {
3: [RunInstaller(true)]
4: public partial class Installer1 : Installer
5: {
6: public Installer1()
7: {
8: InitializeComponent();
9: }
10: }
11: }
Nous ajoutons un fichier de configuration pour la solution (app.config)
1: <?xml version="1.0" encoding="utf-8" ?>
2: <configuration>
3: <appSettings>
4: <add key="serviceName" value="MyService1"/>
5: </appSettings>
6: </configuration>
Maintenant au moment de l'installation il va falloir aller lire dans le fichier de configuration :
voici le fichier Installer1.cs complet et commenté
1: using System;
2: using System.Collections;
3: using System.Collections.Generic;
4: using System.ComponentModel;
5: using System.Configuration.Install;
6: using System.Linq;
7:
8:
9: namespace MyService
10: {
11: [RunInstaller(true)]
12: public partial class Installer1 : Installer
13: {
14: string m_ServiceName = null;
15:
16: public Installer1()
17: {
18: InitializeComponent();
19: // lecture du fichier de config de myservice.exe
20: // soit myservice.exe.config
21: string exePath = System.IO.Path.Combine(Environment.CurrentDirectory, "MyService.exe");
22: System.Configuration.Configuration config
23: = System.Configuration.ConfigurationManager.OpenExeConfiguration(exePath);
24: // recuperation du nom du service dans la section appSettings
25: m_ServiceName = config.AppSettings.Settings["serviceName"].Value;
26: }
27:
28: protected override void OnBeforeInstall(IDictionary savedState)
29: {
30: // on affecte au savedState le nom du service récupéré
31: // dans le fichier de config
32: savedState["ServiceName"] = m_ServiceName;
33: // et on affecte la valeur "nom du service" au composant d'installation du service
34: this.MyServiceInstaller.DisplayName = m_ServiceName;
35: this.MyServiceInstaller.ServiceName = m_ServiceName;
36:
37: base.OnBeforeInstall(savedState);
38: }
39:
40: protected override void OnBeforeUninstall(IDictionary savedState)
41: {
42: // On recupere le nom de serivce indiqué dans le state
43: string serviceName = (string)savedState["ServiceName"];
44: // on réaffecte au composant d'installation le nom du service
45: // pour qu'il retrouve quel service il doit desinstaller
46: this.MyServiceInstaller.DisplayName = serviceName;
47: this.MyServiceInstaller.ServiceName = serviceName;
48:
49: base.OnBeforeUninstall(savedState);
50: }
51: }
52: }
Pour installer le service une fois compilé il suffit de lancer la commande suivante dans le repertoire du service :
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil.exe" "MyService.exe"
J'ai installé le meme service dans 2 repertoires differents voici le resultat :
pour desinstaller toujours dans le repertoire du service :
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil.exe" /u "MyService.exe"
Voici le code complet :
Aucun commentaire:
Enregistrer un commentaire