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

6
我如何从Windows窗体访问和运行控制台应用程序,这些应用程序是同一项目的一部分。我有一个Windows窗体和一个控制台应用程序。我认为我可以发布控制台应用程序,然后使用Process.Start(路径到控制台应用程序),但这不是我想要的。我想在我的窗体项目中访问和使用控制台应用程序的Main方法。这个方法会在单击按钮时运行。
这会导致以下错误。

InvalidOperationException未处理 当应用程序没有控制台或控制台输入已被重定向到文件时,无法读取键。尝试Console.Read。

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

这里是方法。
控制台应用程序:
namespace Ch15Extra_2
{
  public class Program
  {
    public static void Main()
    {
      Console.WriteLine("Here the app is running");
      Console.ReadKey();
    }
  }
}

表单1:

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

2
不清楚您期望发生什么。您说您不想将控制台应用程序作为独立进程启动,但如果按原样调用该方法,显然它不会起作用,因为您不在控制台应用程序中。您希望在WinForms应用程序中如何使用Console.ReadKey()呢? - Tudor
@Tudor 我想应该在表单上使用Console.ReadKey()不会有太大作用。好的,那么表单应用程序无法调用打开另一个进程的控制台应用程序吗?这个进程将来自于被调用的控制台应用程序的主方法。 - somethingSomething
@Tudor 当我写表单应用时,我的意思是表单控件(一个按钮)。 - somethingSomething
1个回答

8
如果您需要在没有WinForms应用程序的情况下运行控制台应用程序,有时候想执行一些控制台代码而不运行控制台应用程序,我有一个建议:
您可以将解决方案分为三个部分。
1. WinForms部分 2. 控制台部分 3. DLL库。
将DLL连接到第一和第二个项目。
然后,如果您需要从WinForms应用程序运行共享代码,可以执行以下操作:
private void buttonApplication_Click(object sender, EventArgs e)
{
    var shared = new SharedClass();
    shared.Run();
}

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


更新

项目1: ClassLibrary。

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

Proj 2. WinForms. 引用了 Proj 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();
        }
    }

我刚刚检查过——它有效。


你比我快了一分钟...因为想出了相同的答案,所以加1分 :) - Gene S
无法从表单中运行控制台应用程序吗?当我使用ClassLibrary时,出现相同的错误“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.” 我可以使用代码System.Diagnostics.Process.Start(Path-to-exeFile),但我只想要一个库或代码,当我在表单上按下按钮时启动控制台应用程序。 - somethingSomething
如果你使用WinForms,为什么要使用Console.Read? - Anton Sizikov
1
你可以从你的应用程序中运行控制台或任何其他应用程序。你可以使用Process.Start来实现。但是,如果你想从中调用一个方法,你只需要将其作为库使用。 - Anton Sizikov
1
你的目标是什么?是显示黑色窗口还是运行有用的代码?如果是前者-使用process.run。但是你不能直接与控制台交互。如果是后者-将有用的代码提取到dll中(不要使用Console.Read方法,你需要它吗?)。 - Anton Sizikov
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接