2012-10-02 10 views
6

同じプロジェクトの一部であるWindowsフォームからコンソールアプリケーションにアクセスして実行するにはどうすればいいですか?私はWindowsフォームとコンソールアプリケーションを持っています。私はコンソールアプリケーションを公開してからProcess.Start(path to console app)を使うことができると思いますが、これは私が望むものではありません。私はアクセスし、私のフォームプロジェクトでコンソールアプリケーションのMainメソッドを使用します。このメソッドは、ボタンをクリックするだけで実行されます。(ボタンクリックイベントによる)フォームアプリケーションからのコンソールアプリケーションの `main`メソッドの呼び出し

これは、次のエラーを示します。ここで

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(); 
} 

メソッドです。

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

あなたは何が起こると予想されているかは不明です。コンソールアプリケーションをスタンドアロンプ​​ロセスとして起動したくないと言っていますが、そのままメソッドを呼び出すと、コンソールアプリケーションにはないので、明らかに動作しません。 'Console.ReadKey()'がWinFormsアプリケーションでどのように動作すると思いますか? – Tudor

+0

@ Tudor私はConsoleと仮定します。ReadKey()はフォーム上で多くを行いません。それでは、フォームアプリケーションがコンソールアプリケーションを呼び出すことはできないのですか?コンソールアプリケーションのメインメソッドから呼び出される別のプロセスが呼び出されます。 – somethingSomething

+0

@ Tudor私はフォームアプリケーションを書いたときにフォームコントロール(ボタン)を – somethingSomething

答えて

7

あなたは、WinFormsのアプリなしであなたのコンソールアプリケーションを実行する必要があり、時にはあなたは、コンソールアプリケーションを実行せずに、いくつかのコンソールのコードを実行したい場合は、I

解決策を3つの部分に分けることができます。

  1. WinFormsの一部
  2. コンソールの一部
  3. DLLライブラリ。

最初のプロジェクトと2番目のプロジェクトにdllをリンクします。

あなたはWinFomrsアプリから共有コードを実行する必要がある場合次に、あなたが行うことができます:

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

SharedClassは3番目のプロジェクトで実装されます。 コンソールアプリからでも呼び出すことができます。


UPD

プロジェクト1:ClassLibrary。

public class SharedClass 
{ 
    public int DoLogic(int x) 
    { 
     return x*x; 
    } 
} 

Proj 2. WinForms。プロジェクトへの参照があります。

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.コンソールアプリケーション

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(); 
     } 
    } 

私がチェックしました - それは動作します。

+0

で1分掛けました。同じ答えを考えて+1しました:) –

+0

コンソールアプリケーションを形?クラスライブラリを使用すると、同じエラーが発生する "InvalidOperationExceptionが処理されなかった。アプリケーションがコンソールを持たないか、コンソール入力がファイルからリダイレクトされたときにキーを読み取れない。Console.Readを試してみる。 System.Diagnostics.Process.Start(Path-to-exeFile)というコードを使用できますが、フォーム上のボタンを押したときにコンソールアプリケーションを起動するライブラリやコードを指定したかっただけです。 – somethingSomething

+0

WinFormsを使用する場合、なぜConsole.Readを使用しますか? –

関連する問題