Pourquoi mon service Windows .NET ne démarre-t-il pas automatiquement parfois?

J’ai modifié un service Windows qui fonctionnait depuis toujours. Après l’ajout de la référence System.Management, il est parfois impossible de démarrer automatiquement. Je reçois l’erreur suivante:

Le service ne peut pas être démarré. System.Runtime.InteropServices.COMException (0x80010002): L’appel a été annulé par le filtre de messages. (Exception de HRESULT: 0x80010002 (RPC_E_CALL_CANCELED))

J’ai trouvé un autre article ici sur SO avec quelqu’un ayant le même problème.

Pourquoi mon service .Net Windows ne démarre-t-il pas automatiquement après un redémarrage?

Cependant, la solution proposée était de démarrer le service après le démarrage des services dont il dépend. Cependant, quand je vais à l’onglet Dépendances pour mon service, je vois:

texte alt

Dois-je simplement utiliser la méthode de contournement pour mettre le thread en veille, ou existe-t-il une méthode plus appropriée pour que ce service démarre correctement? Est-ce que cela se produit parce que .NET n’a pas démarré avant le démarrage de mon service?

Merci,

Tomek

EDIT: J’ai ajouté une instruction try-catch pour attraper l’exception. Voici le code que j’ai ajouté à la méthode OnStart () de mon service (où l’exception est générée)

try { _watcher = new ManagementEventWatcher(query); _watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived); _watcher.Start(); } catch (Exception ex) { EventLog.WriteEntry("Could not create Sleep/Resume watcher" + ex.Message); } 

Le service démarre maintenant mais sans les fonctionnalités que j’ai ajoutées. Je suis nouveau sur .NET, mais j’ai pris le code de l’observateur d’un échantillon que j’ai trouvé en ligne, alors je suis sûr que c’est correct. Le journal des événements affiche la même exception:

Impossible de créer le mode veille / reprise d’appel L’appel a été annulé par le filtre de messages. (Exception de HRESULT: 0x80010002 (RPC_E_CALL_CANCELED))

J’ai eu ce problème moi-même et apparemment, cela ne se produit que sous Windows XP (pas sur Vista ou Win 7). Pour résoudre ce problème, vous devez append une dépendance au service Windows Management Instrumentation. L’ajout de cette dépendance à votre service existant se fait en trois étapes simples:

  1. Ouvrez l’invite de commande (Windows + R -> cmd -> enter)
  2. Tapez: sc config “NAME_OF_YOUR_SERVICE” depend = winmgmt
  3. Appuyez sur Entrée, vous devriez voir: [SC] ChangeServiceConfig SUCCESS

Redémarrez votre ordinateur et votre service devrait maintenant démarrer correctement.

Le problème ne vient pas du service lui-même, mais du nouveau composant que vous avez ajouté, qui renvoie une exception non gérée (l’appel a été annulé par le filtre de messages). Résolvez ce message d’erreur avec le code que vous avez ajouté et / ou améliorez la gestion des erreurs afin qu’une erreur dans ce composant ne vienne pas en haut et que le service s’arrête 🙂

Si vous dépendez d’un autre service, utilisez-nous sc.exe pour configurer votre service afin qu’il démarre après la dépendance. Cela ne peut pas être fait via l’applet Services.

J’ai fini par utiliser Thread.Sleep (10000) juste avant de créer ManagementEventWatcher (avant l’instruction try)

C’est une sorte de solution de contournement, mais cela a corrigé le problème.