Hallo Allerseits
Für ein Businessprojek habe ich eine WINForm Applikation erstellt. Diese empfängt über TCPSocket Abrechnungen von einem Client die als XML deherkommen, übersetzt sie in CSV und speichert diese dann in ferei definierbaren Pfaden ab.
Nun soll diese Applikation neu auf einem WinServer 2019 laufen. Das Problem ist nun, dass die App nicht als Service ausgeführt werden kann, und dass ab dem Build 1803 keine interaktiven Dienste mehr zugelassen sind. Somit kann die App auch nicht mehr über z.B AlwaysUp betrieben werden.
Einzige Lösung die ich sehe, ist die Konvertierung in eine Konsolen Applikation.
Da ich aber bislang mit C# nur WINForm Applikation entwickelt habe und mit Konsole eher wenig Erfahrung habe, die Frage an Euch, bzw. an den Mann, der das im Handumdrehen erledigen kann:
Hat jemand etwas Kapazität, genügend Erfahrung und Lust auf einen Nebenverdienst ?
Wäre super wenn sich da jemand finden würde!
Moin,
WinForms ist eine Konsolenanwendung.
Es gibt in deinem Projekt die Program.cs, die die Form aufruft.
Das ist der Einstiegspunkt in deiner WinForms Anwendung und in einer Konsolenanwendung ist es ebenfalls der Einstiegspunkt.
Da du die GUI dann nicht brauchst, kannst du die Logic in die Program.cs implementieren die dann 24/7 läuft oder immer wieder ausgeführt wird.
Erstell doch mal eine Konsolenanwendung und guck es dir an, ist sehr einfach.
Grüße
Genau deswegen [Artikel] Drei-Schichten-Architektur. Da ist es am Ende egal wie du es präsentierst.
Hallo Duesmannr
Danke für die Antwort! Ich habe den Ausgabetyp in den Einstellungen mal von Windows-Anwendung auf Konsolenanwendung umgestellt. Hat das nicht die selbe Auswirkung? Danach erscheint das GUI allerdings nach wie vor.
Wie sieht die zu implementierende Logik genau aus? Habe mal Application.EnableVisualStyles(); auskommentiert, ohne Erfolg. In der "Program.cs" einer Konsolenanwendung erkenne ich natürlich den Unterschied zur Form "Main.cs", mit der "public partial class Main : Form" und der "InitializeComponent();" Meinst Du ich soll das analog "Program.cs" der Konsolenapplikation umbauen?
In der Program.cs wird dein MainForm eigentlich erst instanziert, was deine WinForms UI "startet".
Ich würde aber, wie es auch JimStark empfiehlt, erst einmal deinen Code aufräumen und in eine saubere Architektur bringen.
Dann kannst du die UI einfach durch ein neues Konsolenprogramm austauschen ohne großen Aufwand betreiben zu müssen.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Hallo T-Virus
Ja, das ist ja der Hacken an der Sache. In der FormApp wurden z.B Properies.Settings usw. verwendet damit der User Einstellungen und Pfade definieren kann. Um das über eine KonsolenApp zu realisieren fehlt mir wie gesagt die Erfahrung damit. Klar bekomme ich das irgendwann dann auch irgendwie mal hin, es sollte aber leider (wie immer) auch noch schnell gehen.
Das Problem ist nicht das anpassen des Codes ansich, der ist eigentlich bereits Konsolenkonform. Das Problem ist mehr der Bereich der Settings. Wenn eine Einstellungsmaske für Speicherpfade und Dateinamen so erstellt werden kann, dass diese über Konsolenbefehle aufgerufen, abgefüll und gespeichert werden kann, habe ich das Problem gelöst. Dann ist der Rest eigentlich keine Hexerei mehr.
In der FormApp werden über eine Maske alle Daten erfasst und in den Properties.Settings.Default gespeichert. Die App greift dann darauf zu. Lediglich dieser Teil müsste neu, Konsolenkonform realisiert werden. Welcher Weg ist dafür der Sinnfollste ?
Die Settings können auch genauso über eine Konsolenapplikation angesprochen werden.
Du bräuchtest dann nur ein klassiches Konsolenmenü erstellen (s. z.B. Tutorial: Erstellen einer einfachen C#-Konsolen-App in Visual Studio den Code mit Kommentar "// Ask the user to choose an option.").
Ich frage mich nur, was der Unterschied dann sein soll, ob der User nun eine Konsolen- oder eine WinForms-Anwendung bedient?
Das Windows-Server OS unterscheidet sich diesbzgl. nicht vom "normalen" Windows, s. Was ist Windows Server und was ist der Unterschied zum normalen Windows?
Die Benutzeroberfläche an sich zum Einstellen der Settings ist in WinForms implementiert und die möchtest Du als Konsolenanwendung?
Also die Settings unter Properties sind in Ordnung, die landen in der app.config und können überall genutzt werden.
Außer Du nutzt .NET Core/Standard/5, da läuft das mit der Konfiguration etwas anders, aber das scheinst Du nicht zu nutzen.
Das ganze aus der Konsole heraus nutzbar zu machen, ist aber eine Neuentwicklung, ein einfaches "Konvertieren" gibt es nicht.
Du kannst zwar WinForms abschalten und die Konsole dazu holen (auch beides gleichzeitig), aber dann hört die Konsole immer noch nicht auf die Befehle zum setzen/ändern der Einstellungen, das musst Du selber implementieren.
Für ein rein per Konsole aufzurufendes Programm gibt's aber Frameworks, die dir entsprechende Parameterfunktionalitäten recht einfach einrichten, dann musst Du nur noch verhältnismäßig wenig tun.
Ein Beispiel für so ein Framework wäre z.B. der CommandLineParser
Es gibt auch komplexere Systeme, z.B. gibt's ein Framework, was eine komplette mehr oder weniger normale UI in der Konsole nachbaut, allerdings ist das natürlich aufwändiger in der Nutzung, als simple Parameter.
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
Ich sage mal recht herzlichen Dank!! Ich denke es zeichnet sich dadurch langsam ein Weg ab den ich gehen kann, vielleicht schneller als gedacht. Es muss auf jeden Fall eine Neuentwicklung her. Und wenn ich diesen Weg schon gehe, stellt sich noch eine weitere Herausforderung, denn wenn schon, dann auch gleich mit integriertem ServiceController zum starten und stopen.
ServiceController? Erinnert mich an einen Windows-Dienst, liege ich richtig?
In dem Fall gibt's für das klassische .NET Framework eine eigene Projektvorlage, einfach mal danach suchen.
Für alles, was .NET Standard 2.0 (guckst Du hier) unterstützt, gibt's noch Microsoft.Extensions.Hosting.WindowsServices, das wiederum auf dem Framework Microsoft.Extensions.Hosting, das ebenfalls von ASP.NET Core genutzt wird.
Es muss aber auch nicht zwingend ASP.NET Core oder ein Windows-Dienst sein, das "Microsoft.Extensions.Hosting" ist generisch aufgebaut und eine unabhängige Grundlage für alle service-basierten Anwendungen und erspart einiges an Grundlagen-Arbeit.
Aber generell, wenn es sowohl ein Konsolenprogramm als auch ein GUI-Programm gibt, lohnt sich natürlich eine klug aufgebaute gemeinsame Bibliothek, die dann von beiden Programmen genutzt werden kann.
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
Hallo Palladin007
Genau, vielen Dank für die Hinweise! Ich bin mit dem Umbau bereits auf der Zielgerade. Nur mit den Timern hatte ich noch einiges zu tun. Die lassen sich jetzt aber auch schon beliebig starten und stoppen. Für die Settings habe ich mich für die XML (System.Configuration) Variante entschieden, da die Einstellungen ja auch über die Laufzeit hinaus verfügbar sein sollen.