Как определить тип проекта C # и / или как определить доступность консоли - PullRequest
0 голосов
/ 11 марта 2010

У меня есть две службы 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).

Ответы [ 2 ]

1 голос
/ 11 марта 2010
  1. Службы Windows не должны иметь пользовательского интерфейса. Это включает в себя консоли и ящики сообщений.

С этим с дороги ...

Рассматривали ли вы подключение соответствующего слушателя трассировки к System.Diagnostics.Trace.TraceListeners? Исходя из вашей командной строки, вы можете добавить трассировщик MessageBox или трасселистер, который выводит сообщения трассировки на консоль? Вы будете использовать встроенные механизмы отладки, которые были тщательно протестированы и, по-своему, также чрезвычайно расширяемы. Вы также сможете неявно различать сообщения, отображаемые в режиме выпуска, и сообщения, отображаемые в режиме отладки (через System.Diagnostics.Trace.Write() или System.Diagnostics.Debug.Write()).

0 голосов
/ 27 мая 2011

При работе с библиотекой классов я передаю объект пользовательского интерфейса в зависимости от среды, которая вызывает библиотеку.

public interface IAlerts { 
    void Show(string message);
}

public class EventLogAlerts : IAlerts { ... }

public class WindowsAlerts : IAlerts { ... }

public class ConsoleAlerts : IAlerts { ... }

public class MyLibrary {
    private IAlerts alertImpl = new EventLogAlerts();
    public void SetUserInterface(IMyUserInterface impl) 
    {
        this.alertImpl = impl;
    }

    public void DoSomething()
    {
        try 
        {
            ...
        }
        catch (Exception)
        {
            this.alertImpl.Show("Whoops!");
        }  
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...