Laden...

C# Konvertierung einer FormApp in eine KonsolenApp

Erstellt von TomRie vor 3 Jahren Letzter Beitrag vor 3 Jahren 630 Views
T
TomRie Themenstarter:in
14 Beiträge seit 2021
vor 3 Jahren
C# Konvertierung einer FormApp in eine KonsolenApp

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!

D
161 Beiträge seit 2017
vor 3 Jahren

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

309 Beiträge seit 2020
vor 3 Jahren

Genau deswegen [Artikel] Drei-Schichten-Architektur. Da ist es am Ende egal wie du es präsentierst.

T
TomRie Themenstarter:in
14 Beiträge seit 2021
vor 3 Jahren

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?

T
2.219 Beiträge seit 2008
vor 3 Jahren

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.

T
TomRie Themenstarter:in
14 Beiträge seit 2021
vor 3 Jahren

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 ?

T
TomRie Themenstarter:in
14 Beiträge seit 2021
vor 3 Jahren

Ist das über XML am besten zu lösen? Oder gibt es eine besser Empfehlung?

4.931 Beiträge seit 2008
vor 3 Jahren

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?

2.078 Beiträge seit 2012
vor 3 Jahren

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.

T
TomRie Themenstarter:in
14 Beiträge seit 2021
vor 3 Jahren

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.

2.078 Beiträge seit 2012
vor 3 Jahren

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.

T
TomRie Themenstarter:in
14 Beiträge seit 2021
vor 3 Jahren

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.