关闭使用AllocConsole
或获得的控制台窗口AttachConsole
时,相关进程将退出。没有办法逃脱。
在 Windows Vista 之前,关闭控制台窗口会向用户显示一个确认对话框,询问他是否应该终止进程,但 Windows Vista 和更高版本不提供任何此类对话并且进程被终止。
解决此问题的一种可能解决方案是完全避免 AttachConsole 并通过其他方式实现所需的功能。
例如,在 OP 描述的情况下,需要控制台窗口才能使用Console
静态类在控制台上输出一些文本。
这可以很容易地使用进程间通信来实现。例如,可以开发控制台应用程序来充当回显服务器
namespace EchoServer
{
public class PipeServer
{
public static void Main()
{
var pipeServer = new NamedPipeServerStream(@"Com.MyDomain.EchoServer.PipeServer", PipeDirection.In);
pipeServer.WaitForConnection();
StreamReader reader = new StreamReader(pipeServer);
try
{
int i = 0;
while (i >= 0)
{
i = reader.Read();
if (i >= 0)
{
Console.Write(Convert.ToChar(i));
}
}
}
catch (IOException)
{
//error handling code here
}
finally
{
pipeServer.Close();
}
}
}
}
然后不是将控制台分配/附加到当前应用程序,而是可以从应用程序内部启动回显服务器,并且Console's
可以重定向输出流以写入管道服务器。
class Program
{
private static NamedPipeClientStream _pipeClient;
static void Main(string[] args)
{
//Current application is a Win32 application without any console window
var processStartInfo = new ProcessStartInfo("echoserver.exe");
Process serverProcess = new Process {StartInfo = processStartInfo};
serverProcess.Start();
_pipeClient = new NamedPipeClientStream(".", @"Com.MyDomain.EchoServer.PipeServer", PipeDirection.Out, PipeOptions.None);
_pipeClient.Connect();
StreamWriter writer = new StreamWriter(_pipeClient) {AutoFlush = true};
Console.SetOut(writer);
Console.WriteLine("Testing");
//Do rest of the work.
//Also detect that the server has terminated (serverProcess.HasExited) and then close the _pipeClient
//Also remember to terminate the server process when current process exits, serverProcess.Kill();
while (true)
continue;
}
}
这只是可能的解决方案之一。本质上,解决方法是将控制台窗口分配给它自己的进程,以便它可以在不影响父进程的情况下终止。