Как найти сборку используется в приложении Windows или службы Windows - PullRequest
0 голосов
/ 19 ноября 2011

В настоящее время у меня есть сборка, используемая для приложения с пользовательским интерфейсом Windows, в котором много встроенной логики, и в случае ошибок он показывает сообщения пользователю с помощью метода ShowError (), который внутренне использует Messagebox.Show (..), а затем записывать ошибки в файл журнала / базу данных.

А вот и моя проблема. Я хочу использовать ту же сборку для службы Windows. Но когда я использую эту сборку в службе Windows, она будет аварийно завершена в Messagebox.show (..), поскольку служба Windows не разрешает взаимодействие с пользовательским интерфейсом в обычном режиме (я знаю параметр «Разрешить службе взаимодействовать с рабочим столом», но это не так. вариант для меня).

Так что я хочу сделать что-то вроде этого.

if(!IsWindowsService()) MessageBox.Show("Message"); Logger.Log("Message");

Здесь IsWindowsService () должен возвращать true, если сборка используется службой Windows, и false, если используется приложением Windows.

Есть идеи, как это получить?

Ответы [ 3 ]

1 голос
/ 19 ноября 2011

Обратите внимание на свойство Environment.UserInteractive .Он должен точно сказать вам, что вы хотите.

0 голосов
/ 19 ноября 2011

Одним из способов решения этой проблемы является абстрагирование вашего сообщения (и ведение журнала и т. Д.), А затем подключение соответствующих классов для них через загрузчик с использованием контейнера Inversion Of Control.Для службы Windows ваш класс сообщений может ничего не делать, и просто следуйте шаблону null .

. Я использовал Autofac для нескольких проектов и один раз.Вы сосредоточены вокруг DI / IoC, это мощный инструмент.

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

0 голосов
/ 19 ноября 2011

Все решения, которые я видел, в основном читерские и проверяют параметр командной строки, передаваемый в исполняющую сборку.Environment.UserInteractive отмечен как ненадежный, вы можете возиться с WMI и посмотреть, если сервис, который вы ожидаете, будет работать там, где он есть, и имеет ли идентификатор процесса смысл, но это много работы для сомнительного теста.Этот параметр также облегчит возможную отладку и юнит-тестирование для обоих сценариев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...