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

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

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

Количество ответов:5

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


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

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

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

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

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

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

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

Не знаю, есть ли возможность builtin, но посмотрите на System.Diagnostics.Process class. It has, among other things, a класса. Он имеет, среди прочего, GetService() method, maybe that will help you. If that fails, there is the метод, может быть, что поможет вам. Если это не удается, есть StartInfo member which may contain helpful information. член, который может содержать полезную информацию.

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