2012-10-02 51 views
6

如何从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我会想到那个控制台。ReadKey()在表单上不会做太多工作。好的,那么表单应用程序无法调用控制台应用程序来打开另一个进程,这个进程可能来自调用的控制台应用程序的主要方法。 – somethingSomething

+0

@Tudor当我写表单应用程序I ment表单控件(一个按钮) – somethingSomething

回答

7

如果需要,而不WinForms应用程序运行你的控制台应用程序,有时你不想运行一个控制台应用程序来执行一些控制台代码,我有一个建议你:

你可以将你的解决方案分为三个部分。

  1. 的WinForms部分
  2. 控制台部分
  3. dll库。

将dll链接到第一个和第二个项目。

然后,如果你需要运行从WinFomrs应用程序共享代码,你可以这样做:

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

SharedClass将在第三个项目来实现。 您也可以从控制台应用程序调用它。


UPD

项目1:ClassLibrary。

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

Proj 2. WinForms。有参考项目1

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

凸出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

是不是可以从一个控制台应用程序运行形成?当我使用classLibrary时,出现同样的错误“InvalidOperationException未处理当任一应用程序没有控制台或控制台输入已从文件重定向时无法读取密钥,请尝试Console.Read。”我可以使用代码System.Diagnostics.Process.Start(Path-to-exeFile),但我只想说一个库或代码,当我按下窗体上的按钮时将启动控制台应用程序。 – somethingSomething

+0

如果您使用WinForms - 为什么要使用Console.Read? –

相关问题