Comment savoir si la méthode est appelée à partir du service Windows dans le code .Net (géré)

StackOverflow https://stackoverflow.com/questions/911921

  •  06-09-2019
  •  | 
  •  

Question

Comment puis-je savoir si une méthode que je suis en train d'écrire dans le code managé est appel étant d'une application interactive vs un service Windows?

Était-ce utile?

La solution 2

Je pense que je l'ai compris cela (au moins cela fonctionne pour mes besoins - votre kilométrage peut varier en fonction de ce que vous essayez de le faire). Il y a une propriété pendaient de l'objet de l'environnement appelé « UserInteractive ». Il vous dit que vous êtes ou non en cours d'exécution dans un contexte d'accès au bureau.

Autres conseils

Quelle partie d'un service Windows est ce que vous voulez savoir? Ou quelle partie d'une application interactive vous ne voulez pas savoir? Ce qui compte réellement pour vous?


Chaque fois que j'entends une telle demande, il est presque toujours une erreur dans la conception. Je suggère quelques réponses:

  1. Laissez l'appelant vous dire qui formatter à utiliser, ou
  2. Placez le nom de la classe dans un fichier formatter de configuration. Demandez à tous les formatteurs mettre en œuvre la même interface. Lors de l'exécution, la première fois que vous avez besoin d'un formatter, créez une instance de celui spécifié dans le fichier de configuration, et l'appeler via l'interface commune.
  3. Ne pas réinventer la roue. Utilisez les classes System.Diagnostics, qui, en fait, configurer beaucoup comme mon # 2.

Il est presque toujours une erreur de code pour être sensible au contexte, il a été appelé.

Il y a au moins 2 façons de le faire:

  1. "System.Reflection.Assembly.GetCallingAssembly (). FullName" retourne le nom de l'assemblée qui appelle votre code.
  2. « Environment.StackTrace » retournera la trace complète de la pile pour la personne qui appelle votre code. Vous devriez voir votre nom de la méthode d'appel dans la chaîne.

Vous pouvez définir deux logger différentes: l'une pour les applications interactives et un pour le service Windows. et laisser le client choisir quel enregistreur il veut utiliser l'aide d'un fichier de configuration. Vous pouvez également avoir un enregistreur par défaut si les clients choisit un mauvais enregistreur ou oublie de configurer. Je pense que ce devrait être une meilleure idée d'avoir des fonctionnalités telles que l'enregistrement et le message de mise en forme pour être configurable.

Je ne sais pas s'il y a une possibilité builtin, mais un coup d'oeil à la classe System.Diagnostics.Process. Il a, entre autres, une méthode de GetService(), peut-être que vous aidera. Si cela échoue, il est le membre de StartInfo qui peut contenir des informations utiles.

Si vous ne me dérange pas en utilisant PInvoke, vous pouvez obtenir le processus parent du processus en cours. Si elle est en cours d'exécution sous le compte NT AUTHORITY \ SYSTEM et son nom est service.exe , le processus en cours est (très probablement) un service.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top