winform启动控制台程序

背景:
winform 的项目。一个解决方案下面有两个程序:一个winform项目,一个控制台项目。在winform 中有两个按钮,按钮A是开始,按钮B 是结束。按钮 A 可以启动控制台程序。
在控制台项目中,有三个方法,一个是连接,一个是登录,一个是发送。 当点击winform 上的按钮A 后,会启动 控制台项目,然后执行连接,登录,发送操作。

问题:
问题一:当按钮A 执行完控制台之后,控制台依旧不关闭,等待下一次输入。 按按钮B 时,不会启动一个新的控制台程序,而是使用之前的控制台。
问题二:按钮B启动之后,连接和登录保持,所以不需要操作,只需要执行发送命令
问题三:控制台如何保持等待输入状态,直到手动关闭控制台程序。

代码:
winform:
butonA:

   Process cmd = new Process();
            cmd.StartInfo.FileName = @"xxxxx";
            cmd.Start();

控制台:

class Test
{
public void Connection(){}
public striing login(){}
public void send(){}
}
class Program
    {
        static void Main(string[] args)
       {
       }
}

求一个思路!

控制台

using System;
using System.Runtime.InteropServices;

namespace WindowsFormsApp1
{
    class Test
    {
        public void Connection() { Console.WriteLine("Conn"); }
        public string login() { Console.WriteLine("Login"); return "OK"; }
        public void send() { Console.WriteLine("send"); }
    }
    public class cmdApp
    {
        Test test;
        //static Test test = new Test();
        public cmdApp() { test = new Test(); }
        public void Connection() { test.Connection(); }
        public string login() { return test.login(); }
        public void send() { test.send(); }
        /// <summary>
        /// 启动控制台
        /// </summary>
        /// <returns></returns>
        [DllImport("kernel32.dll")]
        public static extern bool AllocConsole();
        /// <summary>
        /// 释放控制台
        /// </summary>
        /// <returns></returns>
        [DllImport("kernel32.dll")]
        public static extern bool FreeConsole();
        public static void Main()
        { }
    }

}




form

using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        cmdApp cmdapp = new cmdApp();
        private void button1_Click(object sender, System.EventArgs e)
        {
            cmdApp.AllocConsole();
            cmdapp.Connection();
            cmdapp.login();
        }
        private void button2_Click(object sender, System.EventArgs e)
        {
            cmdapp.send();
        }
    }
}

你把项目B改成类库项目,项目A直接调用项目B里的方法而不是整个控制台弹出来,就全解决了

public static string InvokeExcute(string Command)
 {
     Command = Command.Trim().TrimEnd('&') + "&exit";
     using (Process p = new Process())
     {
         p.StartInfo.FileName = "cmd.exe";
         p.StartInfo.UseShellExecute = false;        //是否使用操作系统shell启动
         p.StartInfo.RedirectStandardInput = true;   //接受来自调用程序的输入信息
         p.StartInfo.RedirectStandardOutput = true;  //由调用程序获取输出信息
         p.StartInfo.RedirectStandardError = true;   //重定向标准错误输出
         p.StartInfo.CreateNoWindow = true;          //不显示程序窗口
         p.Start();//启动程序
         //向cmd窗口写入命令
         p.StandardInput.WriteLine(Command);
         p.StandardInput.AutoFlush = true;
         //获取cmd窗口的输出信息
         StreamReader reader = p.StandardOutput;//截取输出流
         StreamReader error = p.StandardError;//截取错误信息
         string str = reader.ReadToEnd() + error.ReadToEnd();
         p.WaitForExit();//等待程序执行完退出进程
         p.Close();
         return str;
     }
 }

参考下这段代码,调用Windows自带的cmd,并进行输出。

通过winfrom 控制控制台程序的启动和关闭 不就是调用 exe程序运行吗 。要么就是两者有通信,可以发送信号控制窗体的显示或者关闭