为什么PowerShell ISE在运行这个C#程序时会挂起?

5
如果我将这个c#代码编译成一个EXE文件并在Windows命令行中运行,它可以正常运行:输出提示,等待用户输入,然后回车,回显该输入。在PowerShell v3 shell中运行也可以正常运行。但是,如果我在PowerShell ISE V3中运行同一个EXE文件,则不会从Write中发出输出,并且会在ReadLine上停顿。(顺便说一下,如果后面跟着WriteLine,则它将从Write中发出输出。)
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Console.Write("invisible prompt: ");
            var s = System.Console.ReadLine();
            System.Console.WriteLine("echo " + s);
        }
    }
}

这是ISE的bug吗?还是有一些属性可以调整使其正常工作...?


不确定是否相关,但在Powershell中有时称为“键盘轮询”,可能会导致某些问题。因此,当调用Console.ReadLine()时,由于Powershell使用该轮询,可能会引起冲突。 - Greg
3个回答

4

安迪:你让我意识到,我应该问的问题取决于答案:如果有解决方法/设置等,则此问题将很好,但由于你指出没有,因此更好的问题应该是:“是否有一种方法可以在不使用控制台的情况下从ISE中读取C#输入?”但我事先不知道。无论如何,你按要求回答了它,所以你得到了勾选标记--谢谢! - Michael Sorens

4

作为解决方法,在powershell ise中,不要调用.\ConsoleApplication1.exe,而是调用start .\ConsoleApplication1.exe。这将在一个新的命令提示符中启动应用程序,该提示符将接受来自stdin的输入。


+1 这是一个方便的解决方法 - 感谢您的建议! - Michael Sorens

0

Powershell 的 read-host 命令可以从控制台读取数据。您可以在 C# 中执行 read-host 命令。在 MSDN 上关于 Powershell 主机的部分中有记录如何从 C# 执行 PS 命令。以下演示了使用 Powershell 脚本的方法调用,应该很容易转换为 C# 代码。请注意,$host 必须传递到 C# 程序中。因此,您需要将 C# 程序作为程序集加载到 ISE 中,并像这样调用 Main():[myclass]::Main($host)(而不是将 EXE 作为独立程序调用)。

[powershell]::create().AddScript('param($ho) $ho.ui.readline()').AddArgument($host).Invoke()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接