IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Windows services & passage argument


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Par défaut Windows services & passage argument
    Bonjour,

    Je commence à me mettre aux services windows, et j'aimerai installer un service (service.exe) avec une conf & un nom donné.

    Ex avec InstallUtil :
    InstallUtil service.exe /nom=appli1 /conf=conf1

    et

    InstallUtil service.exe /nom=appli2 /conf=conf2

    J'aurai alors 2 services mais qui feront des choses differentes en fonction de la conf.

    Le problème est que je n'arrive pas a passer les arguments.... enfin pas tous

    J'ai un ProjectInstaller.cs & un service.cs

    Dans mon project installer, si je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     public ProjectInstaller()
            {
                InitializeComponent();
     
                string[] commandlineArgs = Environment.GetCommandLineArgs();
                System.Console.WriteLine("test....");
     
                fichierConf = commandlineArgs[2];
     
                serviceInstaller1.ServiceName = splitage(commandlineArgs[2]);
                serviceInstaller1.DisplayName = splitage(commandlineArgs[3]);
                serviceInstaller1.Description = "La conf est "+ splitage(commandlineArgs[4]);
     
            }

    Ici cela fonctionne, j'arrive bien a donner un nom au service, description....
    Mais je n'arrive pas a passer mon fichier de conf...

    Dans la methode Onstart de service.cs est ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            protected override void OnStart(string[] args)
            {
            }
    Je peux faire quelque chose avec le string[] args ? la taille est toujours de 0....


    En gros je ne sais pas comment procéder, chacun y va de sa sauce (gui qui installe des services, registry...).

    Existe-t-il un moyen plus simple de lier une conf a un service?
    une idée?

    Merci par avance, pke là je suis un peu dans les chouxxx

    Manu

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Par défaut
    Je viens peut être de trouver un début de piste : le contexte d'installation.

    Dans mon project installer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            public ProjectInstaller()
            {
                InitializeComponent();
                this.BeforeInstall += new InstallEventHandler(AvantInstall);
            }
     
     
            void AvantInstall(object sender, InstallEventArgs e)
            {
                System.Console.WriteLine("AVANT------------------....");
                string dbName = Context.Parameters["DataBase"];
                Context.Parameters["assemblypath"] = string.Format("{0} -c -db {1}", Context.Parameters["assemblypath"], dbName);
            }

    J'installe avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InstallUtil /DataBase=MyData /i fichier.exe
    ça s'installe et j'ai dans la commande dos:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Les paramètres affectés sont*:
       logtoconsole =
       database = MyData
       assemblypath = D:\service\fichier.exe
       logfile = D:service\fichier.InstallLog
    Maintenant...
    Comment je peut recuperer ce contexte et l'utiliser dans le service ??

  3. #3
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Salut.

    Pour réussir ce que tu cherches à faire, tu peux utiliser un "App.config" dans ton service et le modifier à la volée dans ton ProjectInstaller. L'exemple qui va suivre affecte la valeur de l'assembly path dans une clé "yourAppConfigKey" :

    Le App.config du service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <appSettings>
    	<add key="yourAppConfigKey" value="" />
    </appSettings>
    Dans le Project Installer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public override void Install(IDictionary stateSaver) {
    	base.Install(stateSaver);
    	try {
    		string installFolder = Context.Parameters["assemblypath"];
    		// Modifying the App.config file
    		XmlDocument xmlDoc = new XmlDocument();
    		xmlDoc.Load(Path.Combine(installFolder, "myService.exe.config"));
     
    		// Modifying XML nodes
    		XmlNode pathNode = xmlDoc.SelectSingleNode(string.Format("//appSettings/add[@key='{0}']", "yourAppConfigKey"));
    		pathNode.Attributes["value"].InnerText = installFolder;
     
    		// Validate the changes
    		xmlDoc.Save(Path.Combine(installFolder, "myService.exe.config"));    
    	}
    	catch (Exception exception) {
    		// Special exception that abort the installation process
    		throw new InstallException(exception.Message);
    	}
    }
    Après, je ne sais pas comment définir de nouvelles clés de contexte et utiliser InstallUtil, mais avec un Setup Project qui génère un MSI pour installer un service, ce n'est pas sorcier.

    Bon courage

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Par défaut
    Merci pour cette réponse eusebe19 !

    Si je comprends bien , le app.config sera lié à l'exe? je ne pourrais pas faire plusieur app.config pour un exe?

    Sinon j'ai trouve une solution (peut être pas la propre) :
    Je suis resté sur l'idée des contextes
    Ma ligne de commande pour insataller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    InstallUtil /NomService= svcName CR /NomAffichageService=svcNameDisplay  /FichierConfig=D:\service\conf\fichier.ini /i "chemini_fichier.exe"

    Dans mon project installer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
            public ProjectInstaller()
            {
                InitializeComponent();
                System.Console.WriteLine("== Début du paramétrage....");
     
                this.BeforeInstall += new InstallEventHandler(AvantInstall);
                this.AfterInstall += new InstallEventHandler(AprèsInstall);
            }
     
            void AvantInstall(object sender, InstallEventArgs e)
            {
                System.Console.WriteLine("== Avant l'installation, on MAJ le nom du service...");
                serviceInstaller1.ServiceName = Context.Parameters["NomService"];
                serviceInstaller1.DisplayName = Context.Parameters["NomAffichageService"];
                serviceInstaller1.Description = "Génère les fichier RDV#" + Context.Parameters["FichierConfig"];
            }
     
            void AprèsInstall(object sender, InstallEventArgs e)
            {
                System.Console.WriteLine("== Après l'installation, on MAJ la registry...");
                RegistryKey system = Registry.LocalMachine.OpenSubKey("System");
                RegistryKey currentControlSet = system.OpenSubKey("CurrentControlSet");
                RegistryKey servicesKey = currentControlSet.OpenSubKey("Services");
                RegistryKey serviceKey = servicesKey.OpenSubKey(serviceInstaller1.ServiceName, true);
                serviceKey.SetValue("ImagePath", (string)serviceKey.GetValue("ImagePath") + " " + Context.Parameters["FichierConfig"]);
            }
    Je donne donc un bon, description au service. De plus, dans la registry je met en param le nom du fichier de conf.

    Il me reste donc a recuperer le nom :
    Dans le main de program.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            static void Main(string[] args)
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] 
    	{ 
    	     new Service1(args)                 
    	};
                ServiceBase.Run(ServicesToRun);
            }
    Ensuite dans le service, je traite les arg pour initialiser mon fichier ini!

    Je peux ensuite installer un second service a partir du même exe, avec un autre nom et une autre conf.

    Je vais me pencher sur le app.config.


    Merci !!

Discussions similaires

  1. [Lazarus] [Windows] [OpenOffice] LoadComponentFromURL : Passage d'arguments
    Par obleneau dans le forum Lazarus
    Réponses: 0
    Dernier message: 06/07/2011, 17h29
  2. Windows Service Demarre et Arrête sans rien faire
    Par Bobafett dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/02/2007, 17h32
  3. Probleme passage argument thread
    Par Leguerinos dans le forum POSIX
    Réponses: 3
    Dernier message: 15/02/2007, 15h29
  4. window.open et passage de variable
    Par SoGood dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/07/2005, 19h18
  5. [C#] [Windows service] Rendre Word Visible ?
    Par chris92 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 26/07/2004, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo