从表单应用程序调用控制台应用程序的“Main”方法(通过按钮单击事件)

时间:2012-10-02 12:35:42

标签: c# winforms

如何从Windows窗体访问和运行控制台应用程序,这是同一项目的一部分。我有一个Windows窗体和一个控制台应用程序。我认为我可以发布控制台应用程序,然后使用Process.Start(path to console app),但这不是我想要的。我想在我的表单项目中访问和使用控制台应用程序的Main方法。只需单击按钮即可运行此方法。

这会产生以下错误。

  

InvalidOperationException未处理   当任一应用程序没有控制台时,无法读取密钥   或者从文件重定向控制台输入时。试试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) { }

1 个答案:

答案 0 :(得分:7)

如果您需要在没有WinForms应用程序的情况下运行您的控制台应用程序,有时您想在不运行控制台应用程序的情况下执行某些控制台代码,我会向您提出建议:

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

  1. WinForms部分
  2. 控制台部分
  3. Dll library。
  4. 将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

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

    我刚检查过 - 它有效。