Как определить, вызывается ли метод из службы Windows в .Net (управляемом) коде - PullRequest
1 голос
/ 26 мая 2009

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

Ответы [ 5 ]

1 голос
/ 26 мая 2009

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

1 голос
/ 26 мая 2009

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


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

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

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

0 голосов
/ 26 мая 2009

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

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

0 голосов
/ 26 мая 2009

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

0 голосов
/ 26 мая 2009

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

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