У меня есть две службы Windows, написанные на C #. Один сервис - «Консольное приложение», а второй - «Приложение Windows» (не может изменить его).
Оба приложения-службы могут выполняться в нескольких режимах (в зависимости от аргументов командной строки и флага Environment.UserInteractive
):
- когда (
Environment.UserInteractive == false
) и ...
- когда не указан параметр cmd-line - выполняется стандартный сгенерированный код (требуется для SCM) -
ServiceBase.Run(ServicesToRun)
- когда (
Environment.UserInteractive == true
) и ...
- когда указан параметр "-i" cmd-line - приложение-служба устанавливает себя (что-то вроде installutil -i [scv_app] )
- когда указан параметр "-u" cmd-line - приложение-служба удаляет себя (что-то вроде installutil -u [scv_app] )
- если указан параметр -cd-строки "-c" - служба выполняется в "консольном" режиме (для целей отладки)
Обе службы используют статический метод из библиотеки классов для выбора и обработки описанного пути выполнения.
Однако у меня есть одна проблема в этой библиотеке классов - когда приложение имеет тип «Приложение Windows», Console.WriteLine()
не имеет видимого эффекта. В этом случае я мог бы использовать Win32 AttachConsole()
или что-то в этом роде, но я предпочитаю показывать сводные сообщения через MessageBox.Show()
.
Таким образом, я думаю, что в библиотеке классов мне нужно знать, является ли приложение «Консольное приложение» или «Приложение Windows» ... У вас есть идеи, как это сделать?
В начале, вместо того, чтобы пытаться определить тип приложения, я пытался написать что-то вроде этого:
if (string.IsNullOrEmpty(Console.Title) == false) Console.WriteLine(msg);
Он работает в Win7, но не работает под Win2k3. Так, может быть, есть лучший способ определить, работает ли Console.WriteLine(msg)
/ Console.ReadLine
, как ожидалось?
Я видел некоторые другие предложения ( здесь ссылки ), но ни одно из них не выглядит мне хорошо. Я ищу "хорошее" решение (! = P / invoke;! = Доступ к любому свойству объекта консоли (например, заголовку) внутри блока try / catch).