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) {
...
}
}
}
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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) { ... } } }
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" <no.spam@merci.com> a écrit dans le message de news:
uRriLq18GHA.3264@TK2MSFTNGP04.phx.gbl...
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) {
...
}
}
}
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) { ... } } }