Как узнать, вызывается ли метод из службы Windows в .Net (управляемом) коде
Вопрос
Как определить, вызывается ли метод, который я пишу в управляемом коде, из интерактивного приложения или из службы Windows?
Решение 2
Я думаю, что, возможно, понял это (по крайней мере, это работает для моих нужд - ваш опыт может варьироваться в зависимости от того, что вы пытаетесь сделать).У объекта Environment есть свойство под названием UserInteractive.Он сообщает вам, работаете ли вы в контексте с доступом к рабочему столу.
Другие советы
О какой части службы Windows вы хотите узнать?Или о какой части интерактивного приложения вы не хотите знать?Что для вас на самом деле важно?
Каждый раз, когда я слышу подобный запрос, это почти всегда ошибка в дизайне.Я бы предложил несколько ответов:
- Позвольте вызывающему абоненту сообщить вам, какой форматтер использовать, или
- Поместите имя класса форматтера в файл конфигурации.Пусть все форматтеры реализуют один и тот же интерфейс.Во время выполнения, когда вам впервые понадобится форматтер, создайте экземпляр того, который указан в файле конфигурации, и вызовите его через общий интерфейс.
- Не изобретайте велосипед.Используйте классы System.Diagnostics, которые по сути очень похожи на мой №2.
Чувствительность кода к контексту, в котором он был вызван, почти всегда является ошибкой.
Есть как минимум 2 способа сделать это:
- «System.Reflection.Assembly.GetCallingAssembly().FullName» вернет имя сборки, вызывающей ваш код.
- «Environment.StackTrace» вернет полную трассировку стека для того, кто вызывает ваш код.В строке вы должны увидеть имя вызывающего метода.
Вы можете определить два разных регистратора:один для интерактивных приложений и один для службы Windows.и позвольте клиенту выбрать, какой регистратор он хочет использовать, используя файл конфигурации.Вы также можете использовать регистратор по умолчанию, если клиенты выбирают неправильный регистратор или забывают его настроить.Я думаю, что было бы лучше иметь такие функции, как ведение журнала и форматирование сообщений, которые можно было бы настраивать.
Не знаю, есть ли встроенная возможность, но взгляните на System.Diagnostics.Process
сорт.Он имеет, среди прочего, GetService()
метод, возможно, это вам поможет.Если это не помогло, есть StartInfo
член, который может содержать полезную информацию.
Если вы не против использовать PInvoke, вы можете получить родительский процесс текущего процесса.Если он работает под учетной записью NT AUTHORITY\СИСТЕМА и это имя сервис.exe, текущий процесс (скорее всего) является сервисом.