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

Services Windows Discussion :

[C#] Service Windows et méthode static d'une dll précompilée


Sujet :

Services Windows

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut [C#] Service Windows et méthode static d'une dll précompilée
    Bonjour à tous !

    Voila maintenant près de deux jours que je bloque sur ce problème, je viens donc chercher un peu d'aide vers vous.
    Voici mon souci :
    J'ai un projet de site web assez conséquent avec des classes et les méthodes pour chacune de ces classes. Lorsque je publie mon site web j'obtiens "App_Code.dll" que je référence dans mon second projet Windows Service.

    Dans ce service, j'ai une boucle qui doit récupérer une liste d'objets grâce à une méthode static d'une de mes classe (que j'ai placé dans un try/catch avec des entrée de log pour vérifier le bon fonctionnement de mon service). Jusque là, tout se passe bien, je peux générer ma solution, installer mon service et le démarrer sans incident. Cependant, lors de l'appel à cette fonction, une exception est levée: "La référence d'objet n'est pas définie à une instance d'un objet." ce que je ne comprend pas.

    Si quelqu'un pouvais m’éclairer sur le sujet ça me sauverais la vie, je suis sur le point de tenter la conversion du site web vers une application web sans certitude que cela fonctionne et je préférerais m'en passer (surtout si c'est inutile ^^)

    Merci d'avance,
    François

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Ce message :
    "La référence d'objet n'est pas définie à une instance d'un objet."
    Correspond à NullReferenceException, ça veux dire que quelques part tu a une variable à null. Ca peut être avant l'appel de ta méthode static, pendant l'exécution de cette méthode, après cette l'appel de cette méthode.
    Regarde les détails de l'exception pour savoir quel variable est en cause, et surtout à quel ligne de code.

    PS : Site Web, Web Service, Service Windows sont complètement différent, dans quel cas es-tu?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour Antoine !

    Déjà merci de venir proposer ton aide

    Pour l'exception NullReference, c'est exactement ce que je ne comprend pas. Voici mon trycatch:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try
    {
     
              List<WorkflowEnCours> list1 = new List<WorkflowEnCours>();
     
              list1 = WorkflowEnCours.getAllActiveWfEnCours();
     
    }
    catch (Exception e)
    {
              this.serviceEventLog.WriteEntry("catch " + e.TargetSite + e.Source + e.Message, EventLogEntryType.Information);
    }
    Et j'ai en résultat cette ligne dans le log:
    System.Collections.Generic.List`1[PortailBCRMA_Code.WorkflowEnCours] getAllActiveWfEnCours()App_Code
    La référence d'objet n'est pas définie à une instance d'un objet.


    Et la méthode getAllActiveWfEnCours() fonctionne très bien dans mon site web lorsque je l'utilise, ce qui m’amène à penser que c'est l'appel dans le service Windows qui fait défaut. Et je ne vois définitivement pas ce qui peut être null dans tout ça...

    PS: je suis dans le cas ou j'ai une solution constituée d'un site web (pas une appli web) avec mes classes et un projet de service windows (pas un service web). Je cherche à pouvoir utiliser mes classes dans ces deux projets en référençant la dll obtenue en publiant mon site web. Note que je suis inexpérimenté en .net dans l'ensemble et ce n'est peut-être pas la bonne manière de faire

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Au vu du TargetSite, je dirais que l'exception est lancé à l'appel du constructeur de la liste. l'appel qui se situe dans la méthode getAllActiveWfEnCours.

    Si tu mets les pdb à coté de ton service, la propriété StackTrace sera correctement renseigné, tu pourra avoir le ligne exacte de code concerné.

    Tu peux aussi forcer l'attachement d'un Debugger à ton service en rajoutant le code suivant dans celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #if DEBUG
                if (!Debugger.IsAttached)
                    Debugger.Launch();
    #endif

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Ahh bien pratique pour attacher le debugger au démarrage, j'utilisais "attacher au processus ..." avant et j'étais vraiment pas convaincu par l'efficacité de ma méthode

    Après quelques essais avec des breakpoints, la valeur null qui me gène vient en fait de cette ligne dans ma méthode:
    string conn_string = System.Configuration.ConfigurationManager.ConnectionStrings["PortailBCRMA_ConnectionString"].ToString();
    qui fait référence à une connection string définie dans mon projet de site web et qui ne doit pas être accessible dans mon projet de service...

    J'ai aussi cette chaîne de connexion dans les ressources de mon service windows mais j'imagine que ça ne va pas être magiquement considéré comme la même chaîne
    Y a t'il un moyen pour permettre à mon service d'accéder à la configuration du site web pour obtenir cette ConnectionString où dois-je changer mes accès à la base de données dans toutes mes classes (avec la chaîne définie dans le code sans passer par le fichier de config) ?

    Encore merci pour ton aide, j'ai au moins réussi à mettre le doigt sur le véritable problème

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    La "connection string" doit être stocker dans le fichier .config lié à l’exécutable.
    Alors que dans un site web, elle est stocker dans le fichier web.config

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'ai changé le nom de la connection string que j'utilisais dans le service pour correspondre à celui dans web.config mais je trouve ça un peu sale quand même ^^

    Disons que ça fonctionne, je vais continuer mon service pour qu'il soit fonctionnel et je verrai plus tard comment faire ça autrement si c'est possible

    En tout cas merci grandement pour ton aide, j'aurais pas réussi sans toi (pas aussi vite ça c'est sûr).

    A la prochaine pour d'autres folles aventures
    François

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/02/2012, 09h57
  2. Réponses: 1
    Dernier message: 23/04/2010, 11h34
  3. Service Windows arrêté à la fermeture d'une session Windows
    Par dlayla4 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 19/02/2008, 16h53
  4. Appel d'une méthode static d'une autre classe
    Par Mooneer dans le forum Langage
    Réponses: 2
    Dernier message: 30/01/2008, 20h05
  5. Réponses: 16
    Dernier message: 26/10/2006, 17h17

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