C#关闭标准输出

时间:2012-03-28 17:57:45

标签: c# console redirectstandardoutput

我希望能够像wget -b一样从控制台分离我的程序。代码片段可能看起来像

static void Main(string[] args)
{
    var settings = new Settings(args);
    if (settings.Background)
    {
        /*Tell the user what's going on.*/
        System.Console.WriteLine("Detatching from console. The program will still be running.");
        System.Console.Out.Close();
    }
    /*do work then exit.*/
}

但是System.Console.Out.Close();没有做正确的事。

澄清一下,“正确的事情”是,当从控制台运行此程序时,应该重新出现提示。或者,从explorer.exe运行此程序时,控制台窗口应该关闭。

如果我不清楚,请告诉我。

4 个答案:

答案 0 :(得分:1)

为任何运行的控制台应用程序打开3个通道:STDIN,STDOUT,STDERR。传统上,所有3个都需要关闭才能让应用程序释放控制台。

在Windows中,似乎有一种API方法:FreeConsole ...和pinvoke.net

编辑:另一篇SO帖子说没有开始后台流程是不可能的:How to make a windowless / command-line application return but continue executing in background? ...在Unix中,fork();就足够了。

答案 1 :(得分:1)

您所引用的wget的来源可用here。您会注意到在mswindows.c第193-314行中,实现了一个fork过程。它们生成wget的新实例并将相同的参数传递给它。

这些评论也很有用:

  

Windows不支持fork()调用;所以我们通过调用我们被调用的相同参数的另一个Wget副本来伪造它。

在第102行:

  

在Windows 9x下,如果我们是从16位进程启动的......父进程应立即恢复。在NT ...这是一个徒劳的姿态,因为父母将等待我们终止,然后才能恢复。

简短的回答似乎是“不要这样做。”

答案 2 :(得分:1)

您可以通过创建使用FreeConsole的普通Windows应用程序(无需使用GUI)来获取您想要的内容,而不是创建控制台应用程序,然后调用AllocConsoleAttachConsole根据需要。

这样你就有了一个可以在后台运行的应用程序,但可以根据需要显示和隐藏控制台窗口。虽然据我所知,这些控制台窗口和普通的Windows命令提示之间存在一些差异,因此它可能无法满足您的需求。

答案 3 :(得分:0)

  

澄清一下,“正确的事情”是,当从控制台运行此程序时,应该重新出现提示。或者,当从explorer.exe运行此程序时,控制台窗口应该关闭。

这不是你想要“控制台窗口[关闭]”,你希望它不存在。有一种非常简单的方法可以获得你想要的东西:不要构建一个控制台应用程序。 : - )

如果从命令行构建,请使用CSC /target:winexe ...。这将创建一个永远不会与任何命令行关联的Windows程序。