Konsolen- bzw. Windows-Anwendung
-
Ganz kurze Frage: Man muss ja wenn man ein neues Projekt erstellt, auch angeben was für ein Typ das sein soll, z.B. Konsolenanwendung oder normale Win-Form-Anwendung.
Kann man dann wenn man eine normal Form-Anwendung hat, trotzdem noch das Konsolenfenster irgendwie benutzen?
Bei Java geht das ja z.B., in dem man eben einfach Ausgaben auf die Konsole macht und keine Fenster erzeugt. Wie siehts hier bei C# aus? Gibts da evtl. irgendwelche Tricks oder so?
-
nep schrieb:
Kann man dann wenn man eine normal Form-Anwendung hat, trotzdem noch das Konsolenfenster irgendwie benutzen?
Jein. Auch in einer Windows-Anwendung kann man das Console-Objekt verwenden, allerdings landet die Ausgabe nicht auf der aktuellen Konsole. Mit dem PInvoke-Aufruf 'AllocConsole' kann man sich eine eigene Konsole erstellen. 'AttachConsole' müsste theoretisch auch funktionieren, das habe ich jetzt aber nicht hinbekommen. Folgendes funktioniert also, erstellt aber in jedem Fall eine neue Konsole:
public partial class Form1 : Form { [DllImport("kernel32.dll")] private static extern bool AllocConsole(); [DllImport("kernel32.dll")] private static extern bool FreeConsole(); public Form1() { InitializeComponent(); FormClosed += new FormClosedEventHandler(Form1_FormClosed); } void Form1_FormClosed(object sender, FormClosedEventArgs e) { FreeConsole(); } private void Form1_Load(object sender, EventArgs e) { AllocConsole(); Console.WriteLine("Hallo"); } }
-
also ich erzeuge alle meine windowsanwendungen als consoleanwendung, damit ist die console immer verfügbar, das freeconsole und allocconsole benutze ich nur, um die console in der releaseversion auszuschalten!
-
ser1al_ausgeloggt schrieb:
also ich erzeuge alle meine windowsanwendungen als consoleanwendung, damit ist die console immer verfügbar, das freeconsole und allocconsole benutze ich nur, um die console in der releaseversion auszuschalten!
Okay, das geht natürlich auch, wenn man die Konsole braucht. Wenn man die Konsole nicht braucht, wie das bei Dir der Fall zu sein scheint, ist das Vorgehen grundsätzlich falsch und sollte nicht verwendet werden. Das Windows-System unterscheidet nämlich prinzipiell zwischen Windows- und Konsolenanwendungen und diese Unterscheidung sollte man nicht unterwandern.
-
Konrad Rudolph schrieb:
Wenn man die Konsole nicht braucht, wie das bei Dir der Fall zu sein scheint, ist das Vorgehen grundsätzlich falsch und sollte nicht verwendet werden. Das Windows-System unterscheidet nämlich prinzipiell zwischen Windows- und Konsolenanwendungen und diese Unterscheidung sollte man nicht unterwandern.
da gebe ich dir absolut recht, da ich mich mit dem thema garnicht so beschäftigt habe bis jetzt, frag ich dich auch gleich mal:
Zur Debug(Trace) Ausgebe meines programmes, ist da meine Version eigentlich auch wirklich die bessere, oder doch lieber AllocConole??
Bin mir grad unsicher
-
Für Trace/Debug gibt es doch in .NET ein eigenes Framework (System.Diagnostics.Debug/Trace). Ist das nicht sowieso besser geeignet? Da kann man ja durchaus auch die Konsole als Listener registrieren.
-
richtig, nun ist jedoch die frage (habs noch nicht getestet), ob die konsole auch angezeigt wird, wenn ich es nicht als konsolenanwendung compiliere?
-
Hab das so gemacht wie du beschrieben hast Konrad und hat geklappt.
Vielen Dank