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

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

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


person Community    schedule 07.10.2008    source источник


Ответы (4)


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

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

person Adam Bellaire    schedule 07.10.2008
comment
Это ответ. Рефакторинг всего использования окна сообщений в классах вашей библиотеки. Ответственность за интерпретацию результатов и информирование пользователей лежит на вызывающих абонентах. - person ; 07.10.2008

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

person leppie    schedule 07.10.2008

Вы можете использовать свойство Environment.UserInteractive.

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

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

person GvS    schedule 07.10.2008
comment
Однако обратите внимание, что этот Environment.UserInteractive будет истинным для любого приложения, связанного с дисплеем. Сюда также входят консольные приложения (которые, конечно, также могут отображать окна сообщений, но вы можете этого не захотеть). - person Christian.K; 08.10.2008
comment
Также в этом случае HttpContext.Current будет нулевым. - person GvS; 08.10.2008

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

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

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

person Corey Trager    schedule 07.10.2008