Как определить, используется ли DLL .Net в приложении с графическим интерфейсом или веб-службе?

#.net #web-services #user-interface #dll

Вопрос:

Как определить в библиотеке DLL .Net, выполняется ли она в приложении с графическим интерфейсом Windows или в веб-службе? У меня есть класс низкого уровня, который используется совместно двумя приложениями, и мне нужно отключить окна сообщений, когда он используется в веб-службе.

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

Ответ №1:

Просто один из общих советов: ваш класс низкого уровня, вероятно, не должен использовать сами поля сообщений, но должен позволить промежуточному (ближе к интерфейсу) классу обрабатывать случаи, когда вам может понадобиться ящик для сообщений.

Если бы вы сделали это, то вы бы просто использовали разные классы более высокого уровня для Интернета, чем для рабочего стола, и у каждого были бы средства уведомления, соответствующие его контексту.

Комментарии:

1. Это и есть ответ. Выполните рефакторинг всего использования messagebox в ваших библиотечных классах. Абоненты несут ответственность за интерпретацию результатов и информирование пользователей.

Ответ №2:

Если он выполняется в веб-контексте, HttpContext.Current не будет равен нулю.

Ответ №3:

Вы могли бы использовать окружающую среду.Интерактивное свойство пользователя.

Свойство userInteractive сообщает значение false для процесса Windows или службы, такой как IIS, которая работает без пользовательского интерфейса. Если это свойство имеет значение false, не отображайте модальные диалоговые окна или окна сообщений, поскольку для взаимодействия с пользователем отсутствует графический пользовательский интерфейс.

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

Комментарии:

1. Однако обратите внимание, что эта Среда. userInteractive будет верен для любого приложения, которое «связано с дисплеем». Это также включает консольные приложения (которые, конечно, также могут отображать окна сообщений, но вам это может не понадобиться).

2. Также HttpContext.Current в этом случае будет равен нулю.

Ответ №4:

Я не знаю, сработает ли это, но может быть. Используйте эти вызовы Win32:

GetModuleFileNameEx, чтобы получить исполняемый файл dll и сохранить его для последующего сравнения.
Перечисляет окна, чтобы получить все окна верхнего уровня.
GetWindowModuleFileName, чтобы перевести дескрипторы окон из перечисляющих окон в имена модулей.

Если вы можете найти свой собственный exe-файл среди результатов GetWindowModuleFileName, то ваша библиотека dll работает в приложении с графическим интерфейсом.