Jako zasada kciuka usług nie powinna mieć jakiegokolwiek UI. Dzieje się tak dlatego, że usługi zwykle działają z bardzo wysokimi uprawnieniami, a złe rzeczy mogą się zdarzyć, jeśli nie jesteś bardzo ostrożny z danymi wejściowymi. (Wydaje mi się, że najnowsze wersje systemu Windows nie pozwalają na utworzenie interfejsu użytkownika z usługi, ale nie jestem w 100% pewny.)
Jeśli potrzebujesz komunikować się z usługą, powinieneś użyć jakiejś formy IPC (WCF, rury, gniazda, ...). Jeśli chcesz prosty program konsoli, który może być również usługę, znam trick ustawić, że się:
class MyExampleApp : ServiceBase
{
public static void Main(string[] args)
{
if (args.Length == 1 && args[0].Equals("--console"))
{
new MyExampleApp().ConsoleRun();
}
else
{
ServiceBase.Run(new MyExampleApp());
}
}
private void ConsoleRun()
{
Console.WriteLine(string.Format("{0}::starting...", GetType().FullName));
OnStart(null);
Console.WriteLine(string.Format("{0}::ready (ENTER to exit)", GetType().FullName));
Console.ReadLine();
OnStop();
Console.WriteLine(string.Format("{0}::stopped", GetType().FullName));
}
//snip
}
Jeśli wystarczy uruchomić program, uruchomi jako usługa (i krzyczeć na ciebie, jeśli uruchamiasz go z konsoli), ale jeśli dodasz parametr --console
podczas uruchamiania, program uruchomi się i poczeka na naciśnięcie klawisza Enter, aby zamknąć.
To jest dobre dla CLI i usługi. –
Dzięki za kod. W celu zrozumienia części OnStop musisz zagłębić się w tematykę usług. – Remy