Member 11168540 Ответов: 3

Услуга или приложение


Привет,

Я использую dll как в службе, так и в приложении.
Как я могу найти в функции dll, используется ли она на самом деле в службе или в приложении (например, для использования MessageBox.Шоу)?

Спасибо, Джеральд

Что я уже пробовал:

Не могу найти никакой помощи для этой проблемы ...

PIEBALDconsult

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

Я нашел метод, который написал, чтобы определить, является ли процесс интерактивным, который использует System.Environment.UserInteractive (как указано ниже), но он также определяет, перенаправлена ли консоль (на канал), что может быть не тем, что вам нужно.

3 Ответов

Рейтинг:
2

OriginalGriff

Вы не можете использовать MessageBox.Показать в сервисе - у них нет пользовательского интерфейса.

Если сервис и приложение имеют разные имена, вы можете использовать приложение.ExecutablePath, который возвращает путь к EXE-файлу, запустившему приложение.

Кроме того, можно получить идентификатор GUID приложения "startup application", но это совсем немного сложнее.


Member 11168540

- Ты не можешь пользоваться мессенджером.Показать в сервисе - у них нет пользовательского интерфейса."
Вот почему, хотя я и хочу знать, если функция используется в сервисе или приложении, то я мог бы справиться с MessageBox.
Таким образом, нет более простого способа, чем различать службу и приложение по имени или GUID?
Если Dll используется во множестве сервисов и приложений, то этот способ кажется не очень удобным.

Рейтинг:
2

Chris Copeland

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

1. Использование System.Environment.UserInteractive который, возвращаясь true, указывает на то, что текущий процесс не может быть службой.

2. Использование Console.In при попытке присвоить его переменной в try блок, и если возникает исключение, то нет никакого консольного ввода, и поэтому процесс, скорее всего, будет службой.

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


Member 11168540

Ладно, спасибо. Я думаю, тогда я мог бы лучше установить непосредственно MessageBox.Показать в блоке try.

Рейтинг:
0

Richard MacCutchan

Самый простой ответ-не использовать a MessageBox в библиотеку DLL, которая является общей для неинтерактивных приложений. Если dll должна сообщить что-то, то она должна сделать это, вернув информацию вызывающему процессу (статус, текст и т. д.). Затем абонент может решить, какие действия предпринять: услуги лесозаготовки использовать вашу систему для Windows-приложения использовать MessageBox, или для консольного приложения a Console.WriteLine.