none
Konsole verstecken RRS feed

  • Frage

  • Ich habe eine C# Konsolenanwendung. Ich brauche dazu aber nicht zwingend ein Konsolenfenster, da mein Programm nur informationen aus Dateien ausliest. Wie kann ich diese Konsolenanwendung verstecken?
    VisualCPlusPlus
    Montag, 7. November 2011 16:27

Antworten

  • Hi,

    öffne die Properties Deines Projektes und clicke auf den Reiter Anwendung. Hier änderst Du dann den Ausgabetyp auf Windows-Anwendung.


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/
    • Als Antwort markiert KK Senior Donnerstag, 17. November 2011 13:41
    Montag, 7. November 2011 17:04
  • Hallo VisualCPlusPlus,

    > aber was macht das für einen Sinn eine Konsole zu erstellen, die am Ende als Windowsfenster angezeigt werden soll?

    Es muss ja kein "Windowsfenster" angezeigt werden, die Option in den Projekteigenschaften ändert nur die Einstellungen des C#-Kompilers und bestimmt in welchem Subsystem die Anwendung ausgeführt werden wird.

    Wenn Du dir die Optionen des C#-Compilers (csc.exe) ansieht, wirst Du sehen, dass es für "/target" vier Optionen gibt: exe (Konsole), winexe (Windows Anwendung), library (Klassenbibliothek) und module (Modul). Nach dem Kompilieren enthält deine Assembly ein eingebettetes Manifest in dem u.a. je nach gewählter "/target-Option" der Eintrag ".subsystem 0x2" (winexe) oder 0x3 (exe, library) steht. Dieser Eintrag sagt der CLR in welchem Windows-Subsystem die Anwendung ausgeführt werden soll. Konsolenanwendungen werden im CSRSS-Subsystem und die Windows-Anwendungen im Win32-Subsystem ausgeführt, wobei mit den Konsolenanwendungen automatisch ein Konsolenfenster assoziiert wird. Möchtest Du letzteres nicht, dann kannst Du im Sourcecode darauf verzichten ein Application-Object oder eine Form zu erstellen und anzuzeigen. Du schreibst einfach deinen festerlosen Code und kompilierst dann mit /target: winexe (od. entspr. Projekteigenschaften-Option). Wie Du siehst, hat das Ganze weniger mit Eleganz zu tun, als damit, in welchem Subsystem die Anwendung letztendlich laufen soll.

    Natürlich kannst Du Konsolenanwendungen auch fensterlos aus einer Windows-Anwendung ausführen.
    Dazu verwendet man die Klasse Process. Hier ein kleines Beispiel:

    using System;
    using System.Windows.Forms;
    using System.Diagnostics;
    
    namespace WindowsFormsApplication1 {
        static class Program {
            [STAThread]
            static void Main() {
                string exePath = "ConsoleApplication1.exe";
                string arguments = "";
    
                Process process = new Process();
                process.StartInfo.FileName = exePath;
                process.StartInfo.Arguments = arguments;
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.CreateNoWindow = true;
                process.StartInfo.RedirectStandardOutput = true;
                process.Start();
                process.WaitForExit();
                string result = process.StandardOutput.ReadToEnd();
    
                MessageBox.Show(result);
            }
        }
    }
    
    


    Gruß
    Marcel

    • Als Antwort markiert KK Senior Donnerstag, 17. November 2011 13:41
    Dienstag, 8. November 2011 10:56
    Moderator

Alle Antworten

  • Hi,

    öffne die Properties Deines Projektes und clicke auf den Reiter Anwendung. Hier änderst Du dann den Ausgabetyp auf Windows-Anwendung.


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/
    • Als Antwort markiert KK Senior Donnerstag, 17. November 2011 13:41
    Montag, 7. November 2011 17:04
  • Danke es funktioniert, aber was macht das für einen sinn eine Konsole zu erstellen, die am Ende als Windowsfenster angezeigt werden soll? Rein Theoritisch macht es ja sinn, da man ja kein Fenster anzeigen kann, wenn es keins gibt. Nur das wirkt einfach nicht so "elegant" wie sonst immer alles beim programmieren.
    VisualCPlusPlus
    Montag, 7. November 2011 19:28
  • Hi,

    wenn du keine Konsole brauchst, wäre vielleicht ein Windows Service das richtige für dich. Hier ein kleines Tutorial - http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

    Es ist zwar ein bisschen älter, aber das Grundprinzip passt immer noch.


    Best Regards. Please Mark Answered, If my solution solves your problem.
    Montag, 7. November 2011 22:00
  • Hallo VisualCPlusPlus,

    > aber was macht das für einen Sinn eine Konsole zu erstellen, die am Ende als Windowsfenster angezeigt werden soll?

    Es muss ja kein "Windowsfenster" angezeigt werden, die Option in den Projekteigenschaften ändert nur die Einstellungen des C#-Kompilers und bestimmt in welchem Subsystem die Anwendung ausgeführt werden wird.

    Wenn Du dir die Optionen des C#-Compilers (csc.exe) ansieht, wirst Du sehen, dass es für "/target" vier Optionen gibt: exe (Konsole), winexe (Windows Anwendung), library (Klassenbibliothek) und module (Modul). Nach dem Kompilieren enthält deine Assembly ein eingebettetes Manifest in dem u.a. je nach gewählter "/target-Option" der Eintrag ".subsystem 0x2" (winexe) oder 0x3 (exe, library) steht. Dieser Eintrag sagt der CLR in welchem Windows-Subsystem die Anwendung ausgeführt werden soll. Konsolenanwendungen werden im CSRSS-Subsystem und die Windows-Anwendungen im Win32-Subsystem ausgeführt, wobei mit den Konsolenanwendungen automatisch ein Konsolenfenster assoziiert wird. Möchtest Du letzteres nicht, dann kannst Du im Sourcecode darauf verzichten ein Application-Object oder eine Form zu erstellen und anzuzeigen. Du schreibst einfach deinen festerlosen Code und kompilierst dann mit /target: winexe (od. entspr. Projekteigenschaften-Option). Wie Du siehst, hat das Ganze weniger mit Eleganz zu tun, als damit, in welchem Subsystem die Anwendung letztendlich laufen soll.

    Natürlich kannst Du Konsolenanwendungen auch fensterlos aus einer Windows-Anwendung ausführen.
    Dazu verwendet man die Klasse Process. Hier ein kleines Beispiel:

    using System;
    using System.Windows.Forms;
    using System.Diagnostics;
    
    namespace WindowsFormsApplication1 {
        static class Program {
            [STAThread]
            static void Main() {
                string exePath = "ConsoleApplication1.exe";
                string arguments = "";
    
                Process process = new Process();
                process.StartInfo.FileName = exePath;
                process.StartInfo.Arguments = arguments;
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.CreateNoWindow = true;
                process.StartInfo.RedirectStandardOutput = true;
                process.Start();
                process.WaitForExit();
                string result = process.StandardOutput.ReadToEnd();
    
                MessageBox.Show(result);
            }
        }
    }
    
    


    Gruß
    Marcel

    • Als Antwort markiert KK Senior Donnerstag, 17. November 2011 13:41
    Dienstag, 8. November 2011 10:56
    Moderator