Précédent   Forum du club des développeurs et IT Pro > Dotnet > Développement Windows > Services Windows
Services Windows Forum d'entraide sur le développement de services Windows.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/07/2012, 15h07   #1
CaptainFrakas
Invité de passage
 
Homme
Ingénieur développement logiciels
Inscription : 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 : 0
Points : 0
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
CaptainFrakas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2012, 16h54   #2
antoine.debyser
Membre éprouvé
 
Homme
Ingénieur développement logiciels
Inscription : mars 2011
Messages : 258
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 : 258
Points : 418
Points : 418
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?
antoine.debyser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2012, 17h35   #3
CaptainFrakas
Invité de passage
 
Homme
Ingénieur développement logiciels
Inscription : 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 : 0
Points : 0
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 :
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
CaptainFrakas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2012, 08h05   #4
antoine.debyser
Membre éprouvé
 
Homme
Ingénieur développement logiciels
Inscription : mars 2011
Messages : 258
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 : 258
Points : 418
Points : 418
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 :
1
2
3
4
#if DEBUG
            if (!Debugger.IsAttached)
                Debugger.Launch();
#endif
antoine.debyser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2012, 12h07   #5
CaptainFrakas
Invité de passage
 
Homme
Ingénieur développement logiciels
Inscription : 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 : 0
Points : 0
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
CaptainFrakas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2012, 13h48   #6
antoine.debyser
Membre éprouvé
 
Homme
Ingénieur développement logiciels
Inscription : mars 2011
Messages : 258
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 : 258
Points : 418
Points : 418
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
antoine.debyser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2012, 14h53   #7
CaptainFrakas
Invité de passage
 
Homme
Ingénieur développement logiciels
Inscription : 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 : 0
Points : 0
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
CaptainFrakas est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h37.


 
 
 
 
Partenaires

Hébergement Web