【问题标题】:Calling `Main` method of a console application from a form application (by a button click event)从表单应用程序调用控制台应用程序的“Main”方法(通过按钮单击事件)
【发布时间】:2012-10-02 12:35:41
【问题描述】:

如何从 Windows 窗体访问和运行控制台应用程序,它是同一项目的一部分。我有一个 Windows 窗体和一个控制台应用程序。我认为我可以发布控制台应用程序,然后使用Process.Start(path to console app),但这不是我想要的。我想在我的表单项目中访问和使用控制台应用程序的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) { }

【问题讨论】:

  • 不清楚您期望发生什么。您说您不想将控制台应用程序作为独立进程启动,但如果您按原样调用该方法,那么显然它不会工作,因为您不在控制台应用程序中。您希望Console.ReadKey() 在 WinForms 应用程序中表现如何?
  • @Tudor 我想 Console.ReadKey() 在表单上不会做太多事情。好的,那么表单应用程序是否不可能调用控制台应用程序打开另一个进程,这将来自被调用的控制台应用程序的 main 方法。
  • @Tudor 当我写表单应用程序时我提到表单控件(一个按钮)

标签: c# winforms


【解决方案1】:

如果您需要在没有 WinForms 应用的情况下运行控制台应用,并且有时您想在不运行控制台应用的情况下执行一些控制台代码,我有一个建议给您:

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

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

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

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

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

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


更新

项目 1:类库。

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

项目 2. WinForms。参考项目 1

使用共享;

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

我刚刚检查过 - 它有效。

【讨论】:

  • 比我早了 1 分钟...+1 给出了相同的答案 :)
  • 不能从表单运行控制台应用程序吗?当我使用 classLibrary 时,出现相同的错误“当应用程序没有控制台或控制台输入已从文件重定向时,InvalidOperationException 未处理无法读取密钥。尝试 Console.Read。”我可以使用代码 System.Diagnostics.Process.Start(Path-to-exeFile) 但我只想说一个库或代码,当我按下表单上的按钮时会启动控制台应用程序。
  • 如果您使用 WinForms - 为什么要使用 Console.Read?
  • 您可以从您的应用程序运行控制台或任何其他应用程序。您可以使用 Process.Start 。但是,如果您想从中调用方法 - 您只需将其用作库即可。
  • 你的目标是什么?显示黑色窗口或运行有用的代码?如果首先 - 使用 process.run。但是你不能直接与控制台交互。如果第二个 - 将有用的代码提取到 dll 中(并且不要使用 Console.Read 方法。为什么需要它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 2018-09-17
相关资源
最近更新 更多