OVH Cloud OVH Cloud

NullReferenceException & COM

1 réponse
Avatar
Stephane
Bonjour,

Lors de l'appel à une méthode d'un objet COM j'obtiens une exception de
type NullReferenceException alors que toutes les variables utilisées
sont correctement initialisées. Cette erreur survient après un délai
aléatoire de bon fonctionnement comprenant plusieurs appels à la
fonction concernée.

Si je place des traces dans le bloc catch où l'exception est levée, je
ne détecte aucune variable non initialisée, l'objet COM est non null et
l'utilisation de reflection (GetMembers) sur ce dernier fait bien
apparaitre la methode appelée.

Cette erreur peut-elle provenir du composant COM lui-même ?
Comment puis-je obtenir plus de renseignements sur cette exception ?
Dois-je utiliser un keepalive ? Si oui dans quel cas ?

Merci pour votre aide...
Toute proposition est la bienvenue... je seche complètement

Stéphane

PS : Voici la portion de code concernée (il s'agit d'une méthode appelée
régulièrement par un objet de type threading.timer):

...

Hashtable Liste = new Hashtable();
int Id = 2;

...

private void Scrute(object objet) {
try {
// instance du composant COM
ComposantCOM Com = new ComposantComClass();

// codeRetour du composant COM
int CodeRetour;

DateTime dateDebut = System.DateTime.Now; // date de début
DateTime dateFin = dateDebut.AddHours(3); // date de fin

try {
Monitor.Enter(this.MonitorListe);
foreach (DictionaryEntry elt in this.Liste) {
if (ConsultDonneesSympo == null)
object evolution = null;
try {
evolution = Com.methode(dateDebut, dateFin,
int.Parse(elt.Key.ToString()), this.Id, out CodeRetour);
}
catch (Exception exp) {
// c'est ici qu'une exception NullReferenceException est levée
EventLog.WriteEntry("Service", exp.ToString());

CodeRetour = ECHEC_CONSULTATION;
throw new Exception(exp.Message, exp);
}

if (CodeRetour == SUCCES_CONSULTATION) {
...
}
}
}

}
catch (Exception exp) {
...
throw new Exception(exp.Message, exp);
}
finally {
Monitor.Exit(this.MonitorListe);
}

...

}
catch (Exception exp) {
EventLog.WriteEntry("Service", exp.ToString(),
EventLogEntryType.Error, 2);
throw new Exception(exp.Message, exp);
}

1 réponse

Avatar
Simon Mourier [SoftFluent]
Oui en général, un NullReferenceException qui n'a à priori rien à voir avec
une référence nulle .NET, c'est une erreur qui se produit dans un composant
externe (COM ici). Ca veut dire que le composant est buggé, que par exemple
il écrit dans une zone mémoire protégée, il détruit la pile, etc...

Ca peut aussi arriver dans environement multithread (par exemple web, ou
service) si le composant ne s'y attendait pas. (bien que les wrappers .NET
sont compatibles avec les modèles de threading COM et sont censés éviter ce
genre de pb)

Pour savoir exactement pourquoi et comment cela se produit, il faut débugger
tout cela, y compris le code Natif, mais c'est potentiellement complexe.

Simon.
www.softfluent.com


"Stephane" a écrit dans le message de news:

Bonjour,

Lors de l'appel à une méthode d'un objet COM j'obtiens une exception de
type NullReferenceException alors que toutes les variables utilisées sont
correctement initialisées. Cette erreur survient après un délai aléatoire
de bon fonctionnement comprenant plusieurs appels à la fonction concernée.

Si je place des traces dans le bloc catch où l'exception est levée, je ne
détecte aucune variable non initialisée, l'objet COM est non null et
l'utilisation de reflection (GetMembers) sur ce dernier fait bien
apparaitre la methode appelée.

Cette erreur peut-elle provenir du composant COM lui-même ?
Comment puis-je obtenir plus de renseignements sur cette exception ?
Dois-je utiliser un keepalive ? Si oui dans quel cas ?

Merci pour votre aide...
Toute proposition est la bienvenue... je seche complètement

Stéphane

PS : Voici la portion de code concernée (il s'agit d'une méthode appelée
régulièrement par un objet de type threading.timer):

...

Hashtable Liste = new Hashtable();
int Id = 2;

...

private void Scrute(object objet) {
try {
// instance du composant COM
ComposantCOM Com = new ComposantComClass();

// codeRetour du composant COM
int CodeRetour;

DateTime dateDebut = System.DateTime.Now; // date de début
DateTime dateFin = dateDebut.AddHours(3); // date de fin

try {
Monitor.Enter(this.MonitorListe);
foreach (DictionaryEntry elt in this.Liste) {
if (ConsultDonneesSympo == null)
object evolution = null;
try {
evolution = Com.methode(dateDebut, dateFin, int.Parse(elt.Key.ToString()),
this.Id, out CodeRetour);
}
catch (Exception exp) {
// c'est ici qu'une exception NullReferenceException est levée
EventLog.WriteEntry("Service", exp.ToString());

CodeRetour = ECHEC_CONSULTATION;
throw new Exception(exp.Message, exp);
}

if (CodeRetour == SUCCES_CONSULTATION) {
...
}
}
}

}
catch (Exception exp) {
...
throw new Exception(exp.Message, exp);
}
finally {
Monitor.Exit(this.MonitorListe);
}

...

}
catch (Exception exp) {
EventLog.WriteEntry("Service", exp.ToString(), EventLogEntryType.Error,
2);
throw new Exception(exp.Message, exp);
}