C# Konsolen-App und Windows-Dienst

Squicky

Lt. Commander
Registriert
Sep. 2002
Beiträge
1.405
Hallo

Ist es in C# möglich eine Anwendung zu programmieren, die als normale Konsolen-App und als Windows-Dienst benutzt werden kann?

Wenn der user die exe-Datei ganz normal per Doppelklick startet, dann soll die Anwendung normal funktionieren ("Main"-Funktion).

Diese exe-Datei soll man aber auch mit Installutil.exe als Windows Dienst installieren können (, so dass "OnStart" und "OnStop" ausgeführt werden.

Bis jetzt habe ich keine Anleitung oder Hinweise gefunden, die erklärt, wie beide Möglichkeiten gleichzeitig funktionieren.

Danke
 
Ja, das geht.
C#:
public partial class WindowsService : ServiceBase
{
    Timer ServiceTimer;

    static void Main(string[] args)
    {
        WindowsService service = new WindowsService();
        if (Environment.UserInteractive)
        {
            service.OnStart(args);
            Console.WriteLine("Press any key to stop program");
            Console.Read();
            service.OnStop();
        }
        else
        {
            ServiceBase.Run(service);
        }
    }

    public WindowsService()
    {
        InitializeComponent();
    }

    protected override void OnStart(String[] args)
    {
        ServiceTimer = new Timer(new TimerCallback(OnTimerElapsed), null, 100, Timeout.Infinite);
    }

    protected override void OnStop()
    {
        ServiceTimer.Dispose();
    }
}
 
Hi.

Welche Art von Projektvorlage soll man für dieses Beispiel nutzen?
Konsolen-App (.NET Framework) oder Windows-Dienst (.NET Framework)


Beides verursacht zwei Fehler:

Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand

Fehler CS0103 Der Name "OnTimerElapsed" ist im aktuellen Kontext nicht vorhanden. WindowsServiceConsoleApp C:\Users\testuser\source\repos\WindowsServiceConsoleApp\WindowsServiceConsoleApp\Program.cs 38 Aktiv

Fehler CS0103 Der Name "InitializeComponent" ist im aktuellen Kontext nicht vorhanden. WindowsServiceConsoleApp C:\Users\testuser\source\repos\WindowsServiceConsoleApp\WindowsServiceConsoleApp\Program.cs 33 Aktiv
 
Erstell einen Windows-Dienst. Dort dann die Programm.cs mit der Main löschen. Der ebenso angelegt Service1.cs ist der eigentliche Windows-Service mit besagter InitializeComponent-Methode. Den wie oben beschrieben aufbohren. Eigentlich wird fast alles schon richtig angelegt, wenn man einen Windows-Dienst erstellt.

Und OnTimerElapsed ist die eigentliche Methode, um regelmäßig irgendwas zu tun. Die wirst du schon selbst implementieren müssen.

Code:
private void OnTimerElapsed(Object state)
{
}
 
Wenn es dir nur darum geht, keine Logik/Code zu duplizieren, würde ich die Logik in eine Class library auslagern. Dann kannst du 2 Projekte anlegen für den Win Service und die Console App, in denen du die Class library referenzierst und hast dann jeweils nur eine andere "Hülle".

Alternativ hab ich noch kurzem googlen eine Diskussion auf stackoverflow gefunden (https://stackoverflow.com/questions/7764088/net-console-application-as-windows-service)
 
@pvc-junkie
Nun läuft dein Beispiel.

Wenn ich aber die exe per Doppelklick oder per cmd-Konsole starte, dann bekomme ich keine Ausgabe von
Console.WriteLine("Press any key to stop program");

:-(

Wenn die exe von User normal gestartet wird, dann soll sich eine Konsole öffnen und die Console.WriteLine Ausgaben soll dem User angezeigt werden.
Ist dies gleichezitig mit mit einee Windows-Dienst-exe-Datei möglich?
 
Du musst als Ausgabetyp vom Projekt noch "Konsolenanwendung" einstellen (Projekt --> Rechtklick --> Eigenschaften --> Anwendung).
Und änder mal noch 2 Sachen:
C#:
protected override void OnStart(String[] args)
{
    ServiceTimer = new Timer(new TimerCallback(OnTimerElapsed), null, 100, 3000);
}

private void OnTimerElapsed(object state)
{
    Console.WriteLine("tick");
}
Die Sache mit dem Timer solltest du dir vielleicht noch mal bei MDSN oder dergleichen anschauen. Ansonsten tickt die Anwendung bei mir fleißig, wenn ich es über die Konsole starte.
 
Zurück
Oben