C# 读取管道输入后接收用户输入

C# 读取管道输入后接收用户输入,c#,.net,io,console-application,stdin,C#,.net,Io,Console Application,Stdin,我正在用.NET4编写一个小型的交互式控制台应用程序。我想扩展它,以便能够处理可选的重定向输入,如: echo hello | myapp.exe 问题当然是重定向的输入窃取了“键盘流”,所以对Console.Read*()的任何调用都返回null 我目前的情况是: // Read piped input try { bool keyAvailable = Console.KeyAvailable; } catch { string redirected = Console.I

我正在用.NET4编写一个小型的交互式控制台应用程序。我想扩展它,以便能够处理可选的重定向输入,如:

echo hello | myapp.exe
问题当然是重定向的输入窃取了“键盘流”,所以对Console.Read*()的任何调用都返回null

我目前的情况是:

// Read piped input
try
{
    bool keyAvailable = Console.KeyAvailable;
}
catch
{
    string redirected = Console.In.ReadToEnd();
    // Need to do something here to "un-redirect" stdin back to keyboard
}

// Always returns null
String userInput = Console.ReadLine();
在UNIX上,我可以打开一个到/dev/tty的流来获取用户输入,但是如何在Windows上实现这一点呢

谢谢

[编辑]

基于Craig回答的工作解决方案:

首先,我必须使用

FreeConsole().
我可以选择使用

AllocConsole()
但这会创建另一个控制台窗口,这是我不想要的。相反,我使用

我只能推测.NET类控制台持有对先前stdin流的引用,但只有在调用
Console.SetIn()
之后,
Console.ReadLine()
才返回到其阻塞行为,等待用户输入

现在,我们来研究如果我在运行时重定向了应用程序的标准输出,会发生什么情况:

echo hello | myapp.exe | somewhere ...

该函数应该可以完成这项工作,尽管我只使用它来恢复输出,而不是输入。

使用p/Invoke ofFreeConsole()/AttachConsole()和Console.SetIn()的组合确实有效,谢谢!!(我将更新原始帖子以显示完整的代码)
AttachConsole(-1) // -1 = "Parent".
echo hello | myapp.exe | somewhere ...