Как узнать, вызывается ли метод из службы Windows в .Net (управляемом) коде

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

  •  06-09-2019
  •  | 
  •  

Вопрос

Как определить, вызывается ли метод, который я пишу в управляемом коде, из интерактивного приложения или из службы Windows?

Это было полезно?

Решение 2

Я думаю, что, возможно, понял это (по крайней мере, это работает для моих нужд - ваш опыт может варьироваться в зависимости от того, что вы пытаетесь сделать).У объекта Environment есть свойство под названием UserInteractive.Он сообщает вам, работаете ли вы в контексте с доступом к рабочему столу.

Другие советы

О какой части службы Windows вы хотите узнать?Или о какой части интерактивного приложения вы не хотите знать?Что для вас на самом деле важно?


Каждый раз, когда я слышу подобный запрос, это почти всегда ошибка в дизайне.Я бы предложил несколько ответов:

  1. Позвольте вызывающему абоненту сообщить вам, какой форматтер использовать, или
  2. Поместите имя класса форматтера в файл конфигурации.Пусть все форматтеры реализуют один и тот же интерфейс.Во время выполнения, когда вам впервые понадобится форматтер, создайте экземпляр того, который указан в файле конфигурации, и вызовите его через общий интерфейс.
  3. Не изобретайте велосипед.Используйте классы System.Diagnostics, которые по сути очень похожи на мой №2.

Чувствительность кода к контексту, в котором он был вызван, почти всегда является ошибкой.

Есть как минимум 2 способа сделать это:

  1. «System.Reflection.Assembly.GetCallingAssembly().FullName» вернет имя сборки, вызывающей ваш код.
  2. «Environment.StackTrace» вернет полную трассировку стека для того, кто вызывает ваш код.В строке вы должны увидеть имя вызывающего метода.

Вы можете определить два разных регистратора:один для интерактивных приложений и один для службы Windows.и позвольте клиенту выбрать, какой регистратор он хочет использовать, используя файл конфигурации.Вы также можете использовать регистратор по умолчанию, если клиенты выбирают неправильный регистратор или забывают его настроить.Я думаю, что было бы лучше иметь такие функции, как ведение журнала и форматирование сообщений, которые можно было бы настраивать.

Не знаю, есть ли встроенная возможность, но взгляните на System.Diagnostics.Process сорт.Он имеет, среди прочего, GetService() метод, возможно, это вам поможет.Если это не помогло, есть StartInfo член, который может содержать полезную информацию.

Если вы не против использовать PInvoke, вы можете получить родительский процесс текущего процесса.Если он работает под учетной записью NT AUTHORITY\СИСТЕМА и это имя сервис.exe, текущий процесс (скорее всего) является сервисом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top