Service Windows qui ne veut pas démarrer

Résolu
0nn2belle Messages postés 16 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 28 juin 2011 - 29 avril 2010 à 19:47
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 - 29 avril 2010 à 21:58
Bonsoir tout le monde,
Je suis débutante en C# et je suis confrontée à un souci qui, je l'espère, n'est pas de taille !!
En fait je dois créer un service Windows qui doit bloquer des processus (des applications en gros).

Pour ça, j'ai déjà un code en vb.net, qui fonctionne. Ce code est constitué d'une BDD Access qui contient une table avec un identifiant et un champ contenant le nom du processus, une DLL et le service Windows.

J'ai réussi à générer la dll et le service Windows. Le seul hic est que le service ne veut pas démarrer ! Et je ne sais pas d'où vient le souci, mais alors vraiment pas du tout, et je suis sur ce problème depuis ce matin, 8h30...
Je vous expose mes fichiers.cs :
Idata et CLdata, les fichiers de ma dll
Idata.cs, mon interface
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LIB_data
{
    //Création de l'interface
    public interface Idata
    {
        /*string IfileTYPE
        {
            get;
        }*/
        string IfileDB
        {
            get;
        }
        System.Data.DataSet getExE();
    }
}


CLdata, ma classe
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
using System.Data.OleDb;

namespace LIB_data
{
    public class CLdata : Idata
    {
        #region Private Members
            private System.IO.StreamReader oSR;
            private IDbConnection oCNX;
            private IDbCommand oCMD;
            private IDbDataAdapter oDA;
            private System.Data.DataSet oDS;
            private string R_sql;
            //private string DBTYPE;
            //private string SQLSERVER = "MSSQLSERVER";
            //private string MSACCESS = "MSACCESS";
        #endregion

        #region Interface CLdata
        public CLdata()
        {
            this.R_sql = "SELECT * FROM TB_INTERDIT";
            /*this.oSR = new System.IO.StreamReader(((Idata)this).IfileTYPE);
            this.DBTYPE = this.oSR.ReadToEnd();*/
            // C'est ici que le coté générique de notre classe prend forme
            //if ((this.DBTYPE == this.MSACCESS))
            {
                this.oSR = new System.IO.StreamReader(((Idata)this).IfileDB);
                this.oCNX = new System.Data.OleDb.OleDbConnection(this.oSR.ReadLine());
                this.oCMD = new System.Data.OleDb.OleDbCommand();
                this.oDA = new System.Data.OleDb.OleDbDataAdapter();
            }
            /*if ((this.DBTYPE == this.SQLSERVER))
            {
                this.oSR = new System.IO.StreamReader(((Idata)this).IfileDB);
                this.oCNX = new System.Data.SqlClient.SqlConnection(this.oSR.ReadLine());
                this.oCMD = new System.Data.SqlClient.SqlCommand();
                this.oDA = new System.Data.SqlClient.SqlDataAdapter();
            }*/
            {
                this.oCMD.CommandText = this.R_sql;
                this.oCMD.CommandType = CommandType.Text;
                this.oCMD.Connection = this.oCNX;
            }
            {
                this.oDA.SelectCommand = this.oCMD;
            }
            this.oDS = new System.Data.DataSet();
        }

        #endregion

        #region Idata Members
        string LIB_data.Idata.IfileDB
        {
            get
            {
                return "C:\\Users\\Annabelle\\Desktop\\Projet Archi.net\\Test des tutos sur les services windows\\LIB_data\\data\\connectionString.dat";
            }
        }

        /*string LIB_data.Idata.IfileTYPE
        {
            get
            {
                return "C:\\Users\\Annabelle\\Desktop\\Projet Archi.net\\Test des tutos sur les services windows\\LIB_data\\data\\typeDB.dat";
            }
        }*/
        #endregion

        #region Function of Idata
        System.Data.DataSet Idata.getExE()
        {
            this.oCMD.CommandText = this.R_sql;
            this.oDA.Fill(this.oDS);
            return this.oDS;
        }
        #endregion
    }
}


Service1.cs, le code de mon service windows (à côté j'ai un projectinstaller et un eventlog, mais on s'en moque pour le coup)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace Service_windows
{
    public partial class Service1 : ServiceBase
    {

        private int i;
        private LIB_data.Idata oDATA;
        private System.Data.DataSet oDS;
        private Process[] all_process = new Process[11];
        private Process process;
        private string PROCCESS_NAME;
        private int count_proccess_interdit;
        private short countPassage;
        private System.Timers.Timer tim = new System.Timers.Timer(5000);

        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            tim.Elapsed += mvTimer_Elapsed;
            this.i = 0;
            this.countPassage = 0;
            this.oDATA = new LIB_data.CLdata();
            this.oDS = this.oDATA.getExE();
            this.count_proccess_interdit = this.oDS.Tables[0].Rows.Count;
            this.tim.Enabled = true;
            this.evt_interdit.WriteEntry("Service Windows démarré");
        }

        protected override void OnStop()
        {
        }

        protected override void OnPause()
        {
            base.OnPause();
            this.evt_interdit.WriteEntry("Service Windows en pause");
        }

        private void mvTimer_Elapsed(object pSender, System.Timers.ElapsedEventArgs ByValpArgs)
        {
            this.PROCCESS_NAME = this.oDS.Tables[0].Rows[i].ItemArray[1].ToString();
            this.all_process = System.Diagnostics.Process.GetProcessesByName(PROCCESS_NAME);
            if (all_process.Length > 0)
            {
                this.process = all_process[0];
                this.process.Kill();
            }
            this.i += 1;
            if (this.i == this.count_proccess_interdit)
            {
                i = 0;
            }
            this.countPassage += 1;
            if (this.countPassage == 10)
            {
                this.countPassage = 0;
                GC.Collect();
            }
        }

    }
}


Voilà !
Je ne demande pas à ce que l'on me demande la réponse sur un plateau d'argent (sauf si vous l'avez :D) mais au moins si vous avez des pistes de solution !!
Je précise que je n'ai pas le choix sur les technologies utilisées (dll, service windows et access) et aussi que je suis desespérée

Merci d'avance !!
Annabelle

2 réponses

0nn2belle Messages postés 16 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 28 juin 2011 1
29 avril 2010 à 20:59
C'est bon problème résolu, le code est tout à fait fonctionnel
En fait le souci venait de.... l'eventlog, j'avais oublié de renseigner la source.
Je ne sais pas pourquoi mais du coup le service ne voulait pas démarrer.
Mais le service fonctionne correctement c'est l'essentiel

Je suis contente
3
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
29 avril 2010 à 21:58
Salut,

Peux-tu mettre des commentaires pour comprendre ton code?

Et faire l'algo sur un papier, il me semble que ton algo n'est pas correct.

Pour débugger, il faut s'abonner aux processus.
Ou essayer de faire une application windows sinon, pour détecter ce qui ne va pas?

Enleve le GC.collect, ca doit bouffer en ressource (toutes les 5 sencondes, c'est beaucoup)

Si je comprends, le truc si tu as 10 applications interdites il faut 50 secondes pour les parcourir.

Proposition (algo rapide)
Faire un list<String>
if list.contains(processname)
{
process.kill();
}



Il y a possibilité de s'abonner sur du WMI pour
faire ce traitement aussi.

http://www.codeproject.com/KB/system/win32processusingwmi.aspx
0
Rejoignez-nous