Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
C# Konvertierung einer FormApp in eine KonsolenApp
TomRie
myCSharp.de - Member



Dabei seit:
Beiträge: 14
Herkunft: Schweiz

Themenstarter:

C# Konvertierung einer FormApp in eine KonsolenApp

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
Duesmannr
myCSharp.de - Member



Dabei seit:
Beiträge: 122
Herkunft: Münster

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
JimStark
myCSharp.de - Member

Avatar #dOpLzh7hN1az1g0eGRc0.jpg


Dabei seit:
Beiträge: 210

beantworten | zitieren | melden

Genau deswegen [Artikel] Drei-Schichten-Architektur. Da ist es am Ende egal wie du es präsentierst.
private Nachricht | Beiträge des Benutzers
TomRie
myCSharp.de - Member



Dabei seit:
Beiträge: 14
Herkunft: Schweiz

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1766
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
TomRie
myCSharp.de - Member



Dabei seit:
Beiträge: 14
Herkunft: Schweiz

Themenstarter:

beantworten | zitieren | melden

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 ?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von TomRie am .
private Nachricht | Beiträge des Benutzers
TomRie
myCSharp.de - Member



Dabei seit:
Beiträge: 14
Herkunft: Schweiz

Themenstarter:

beantworten | zitieren | melden

Ist das über XML am besten zu lösen? Oder gibt es eine besser Empfehlung?
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3946

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1411
Herkunft: NRW

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palladin007 am .
private Nachricht | Beiträge des Benutzers
TomRie
myCSharp.de - Member



Dabei seit:
Beiträge: 14
Herkunft: Schweiz

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1411
Herkunft: NRW

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palladin007 am .
private Nachricht | Beiträge des Benutzers
TomRie
myCSharp.de - Member



Dabei seit:
Beiträge: 14
Herkunft: Schweiz

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers