2012-10-02 16 views
6

Jak uzyskać dostęp do aplikacji konsolowej i uruchomić ją z formularza Windows, który jest częścią tego samego projektu. Mam formularz okna i aplikację konsoli. Myślę, że mogę opublikować aplikację konsoli, a następnie użyć Process.Start(path to console app), ale to nie jest to, czego chcę. Chcę uzyskać dostęp i korzystać z metody Main aplikacji konsoli w moim projekcie formularza. Ta metoda uruchomiłaby się po kliknięciu przycisku.Wywołanie metody "Main" aplikacji konsoli z poziomu aplikacji formularza (zdarzenie click button)

Daje to następujący błąd.

InvalidOperationException was unhandled Cannot read keys when either application does not have a console or when console input has been redirected from a file. Try Console.Read.

private void buttonApplication_Click(object sender, EventArgs e) 
{ 
    Ch15Extra_2.Program.Main(); 
} 

Oto sposoby.

ConsoleApp:

namespace Ch15Extra_2 
{ 
    public class Program 
    { 
    public static void Main() 
    { 
     Console.WriteLine("Here the app is running"); 
     Console.ReadKey(); 
    } 
    } 
} 

Form1:

private void buttonApplication_Click(object sender, EventArgs e) { } 
+2

Nie jest jasne, czego się spodziewać. Mówisz, że nie chcesz uruchamiać aplikacji konsoli jako samodzielnego procesu, ale jeśli wywołasz tę metodę tak jak jest, to oczywiście nie zadziała, ponieważ nie masz aplikacji konsolowej. Jak można się spodziewać, że 'Console.ReadKey()' zachowa się w aplikacji WinForms? – Tudor

+0

@ Tudor Przypuszczam, że konsola.ReadKey() nie zrobi wiele na formularzu. OK, to czy aplikacja formularzy nie może wywołać aplikacji konsoli otwierającej inny proces, który pochodziłby z głównej metody wywoływanej aplikacji konsoli. – somethingSomething

+0

@Tudor Kiedy pisałem formularz aplikacji formant formularza (przycisk) – somethingSomething

Odpowiedz

7

Jeśli trzeba uruchomić aplikację konsoli bez WinForms aplikacji, a czasami chcesz wykonać jakiś kod konsoli bez konieczności uruchamiania aplikacji konsoli I masz dla ciebie propozycję:

Możesz podzielić swoje rozwiązanie na trzy części.

  1. WinForms część
  2. część
  3. Konsola
  4. biblioteki dll.

Łączenie biblioteki dll z pierwszym i drugim projektem.

Następnie, jeśli trzeba uruchomić wspólny kod z WinFomrs aplikacji, można zrobić:

private void buttonApplication_Click(object sender, EventArgs e) 
{ 
    var shared = new SharedClass(); 
    shared.Run(); 
} 

SharedClass będą realizowane w trzecim projekcie. Możesz również zadzwonić z aplikacji konsoli.


UPD

Projekt 1: ClassLibrary.

Proj 2. WinForms. Czy odniesienie do projektu 1

przy użyciu Shared;

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     TextBox textBox = new TextBox(); 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      var shared = new SharedClass(); 
      textBox.Text = shared.DoLogic(10).ToString(); 
     } 
    } 
} 

proj 3. Konsola App

public class Program 
    { 
     public static void Main() 
     { 
      Console.WriteLine("Here the app is running"); 
      var shared = new Shared.SharedClass(); 
      Console.WriteLine(shared.DoLogic(10)); 
      Console.ReadKey(); 
     } 
    } 

Właśnie sprawdzone - działa.

+0

pokonał mnie przez 1 minutę ... + 1 za wymyślanie z tą samą odpowiedzią :) –

+0

Czy nie można uruchomić aplikacji konsolowej od Formularz? Gdy używam biblioteki klasy, pojawia się ten sam błąd "Nieobsługiwany wyjątek InvalidOperationException Nie można odczytać kluczy, gdy któraś aplikacja nie ma konsoli lub gdy wejście konsoli zostało przekierowane z pliku." "Spróbuj Console.Read." Mogę użyć kodu System.Diagnostics.Process.Start (Path-to-exeFile), ale chciałem tylko powiedzieć bibliotekę lub kod, który uruchamia aplikację konsoli po naciśnięciu przycisku na formularzu. – somethingSomething

+0

Jeśli używasz WinForms - dlaczego używasz Console.Read? –

Powiązane problemy