none
Consolen-Ausgabe zu einer WinForm-Applikation RRS feed

  • Frage

  • Hallo

    ich habe eine bestehende WinForm-Applikation, in der ich in meinem Main-Programm einen Zusatz entwickelt habe, der via CommandArgument gestartet werden kann. In diesem Fall startet sich dann nicht die WinForm-Applikation, sondern es soll eben nur der Prozess (für Export von Daten) ausgeführt werden.

    Ich möchte dazu aber eine Console.WritLine() aktivieren - besser gesagt, hätte ich das schon eingebaut - aber die Console geht beim Start der Applikation nie auf.

    Was muss ich denn in meinem Fall noch einstellen bei der Applikation, dass ich für diese Export-Funktion eine Consolen-Ausgabe habe ???

    Kann mir dazu bitte jemand einen Rat geben.

    Danke & schönen Gruß

    Michael


    Michael Erlinger
    Dienstag, 19. April 2011 09:08

Antworten

  • Hallo Michael,
    eine Möglichkeit zum Beispiel auch:

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WinKonsole
    {
     static class Program // im Programm.cs im Windows Forms-Projekt
     {
      /// <summary>Der Haupteinstiegspunkt für die Anwendung.</summary>
      [STAThread]
      static void Main(string[] args)
      {
       if (args.Length > 0) // wenn Du also das Programm mit Parameter aufrufst ...
       {
        AllocConsole(); // Kommandozeile, Console anzeigen
        KonsolenStart(args);
       }
       else
       {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
       }
      }
    
      private static void KonsolenStart(string[] args)
      {
       Console.WriteLine("Kommandozeile = {0}", Environment.CommandLine);
       for (int i = 0; i < args.Length; ++i)
        Console.WriteLine("Argument{0} = {1}", i + 1, args[i]);
       Console.ReadLine();
      }
    
      [DllImport("kernel32.dll")]
      private static extern bool AllocConsole();
     }
    }

    ciao Frank

    • Als Antwort vorgeschlagen Konrad Neitzel Dienstag, 19. April 2011 12:22
    • Als Antwort markiert M.Erlinger Mittwoch, 20. April 2011 06:56
    Dienstag, 19. April 2011 11:23

Alle Antworten

  • Hallo Michael,

    ich fürchte, Du hast hier ein kleines Problem, denn das Verhalten ist eben mehr oder weniger fest vorgegeben.

    Du kannst den "Output Type" auswählen als Windows Application oder Console Application.

    Bei einer Windows Application hast Du kein Konsolen Fenster und bei einer Console Application hast Du halt immer ein Konsolen Fenster. Du kannst den Ausgabe Typ jederzeit umstellen, aber dann hast Du bei der Nutzung als Windows Program leider immer das Konsolen Fenster mit offen, was ich als störend empfinde.

    Eine Möglichkeit, dies beim Start der Applikation auszuwählen in Main() kenne ich nicht und ich fürchte, dass dies auch nicht möglich ist, da es von Windows gesteuert wird über den hinterlegten Typ in der erstellten Datei (PE32 bzw. PE32+ Header enthält halt solche Informationen). Ich bin jetzt nicht der große PE32 Spezialist, daher mag ich mich irren, aber derzeit ist dies mein Wissenstand.

    Wir lösen diese Thematik immer wie folgt:

    - Business-Logik getrentn in einer Class-Library
    - Eigene Projekte für entsprechende Executables. Also mehrere Projekte für z.B. eine Windows Forms Anwendung und für ein Kommandozeilentool. Gemeinsamer Code wandert halt wirklich konsequent in eine gemeinsam genutzte Library.

    Ich hoffe, ich konnte etwas helfen.

    Mit den besten Grüßen,

    Konrad

     

     

    Dienstag, 19. April 2011 10:20
  • Hallo Michael,
    eine Möglichkeit zum Beispiel auch:

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WinKonsole
    {
     static class Program // im Programm.cs im Windows Forms-Projekt
     {
      /// <summary>Der Haupteinstiegspunkt für die Anwendung.</summary>
      [STAThread]
      static void Main(string[] args)
      {
       if (args.Length > 0) // wenn Du also das Programm mit Parameter aufrufst ...
       {
        AllocConsole(); // Kommandozeile, Console anzeigen
        KonsolenStart(args);
       }
       else
       {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
       }
      }
    
      private static void KonsolenStart(string[] args)
      {
       Console.WriteLine("Kommandozeile = {0}", Environment.CommandLine);
       for (int i = 0; i < args.Length; ++i)
        Console.WriteLine("Argument{0} = {1}", i + 1, args[i]);
       Console.ReadLine();
      }
    
      [DllImport("kernel32.dll")]
      private static extern bool AllocConsole();
     }
    }

    ciao Frank

    • Als Antwort vorgeschlagen Konrad Neitzel Dienstag, 19. April 2011 12:22
    • Als Antwort markiert M.Erlinger Mittwoch, 20. April 2011 06:56
    Dienstag, 19. April 2011 11:23
  • Hallo Frank,

    das ist eine sehr schöne Lösung. AllocConsole kannte ich bisher noch gar nicht. Wieder etwas sehr interessantes dazu gelernt.

    Mit den besten Grüßen,

    Konrad

    Dienstag, 19. April 2011 12:23
  • Hallo Frank

    danke für Deine Hilfe und dem Beispiel-Code!!!

    Schönen Gruß

    Michael


    Michael Erlinger
    Mittwoch, 20. April 2011 06:55
  • Hallo Konrad und Michael,

    • das ist eine sehr schöne Lösung ..

    das hört man gern, danke :-)
    Deine saubere Trennung der Prozesse hat aber auch Charme.  ... ~ Separation of Concerns.

     

     


    ciao Frank
    Donnerstag, 21. April 2011 17:47