【问题标题】:C# Class Process - Control C++ application, impossibility Read OutputC# 类进程 - 控制 C++ 应用程序,不可能读取输出
【发布时间】:2017-06-08 10:55:46
【问题描述】:

我需要从 C# 应用程序控制用 C++ 编写的控制台应用程序。 C# 应用程序无法从 C++ 应用程序的输出中读取任何内容。使用函数process.StandardOutput.ReadLine() 时应用程序冻结。我尝试仅使用 printf("Test sample\r\n") 和 Console.WriteLine("Test sample") 在 C#、C++ 中创建简单的控制台应用程序。示例 C# 应用程序运行良好,但 C++ 不行。所以我不知道我在哪里犯了错误。可能 C++ 应用程序写错了行尾,但我不知道如何解决。

用 C# 编写的主应用程序代码示例,用于控制用 C++ 或 C# 编写的另一个应用程序。

            process= new Process()
            {
                StartInfo = new ProcessStartInfo(@"testApp")
                {
                    RedirectStandardInput = true,
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    UseShellExecute = false,
                    CreateNoWindow = false,
                    WindowStyle = ProcessWindowStyle.Hidden
                }
            };

            process.Start();                
            inputWriter = process.StandardInput;                
            string text =process.StandardOutput.ReadLine();//C++ app freezes here    

还有两个测试应用

在 C++ 中

int main(){
while (true) {
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
    printf("Test send data\r\n");               

}
return 0;}

在 C# 中

static void Main(string[] args)
    {
        while (true)
        {
            Thread.Sleep(500);
            Console.WriteLine("Test send data");
        }
    }

【问题讨论】:

  • 只是为了测试一下,如果你在 C++ 程序中写了一个像普通的"\n" 这样的换行符呢?没有回车(应该由底层库代码自动添加)?
  • 我试过了,还是一样的问题。
  • 您的 C++ 应用程序会在其输出被重定向时自动将 stdout 置于缓冲模式。在填满或关闭标准输出之前,该缓冲区不会被刷新,并且其内容对您的 C# 应用程序可用。当你睡那么多,至少一两分钟时,这将需要相当长的时间。使用 fflush() 或 std::flush。
  • @HansPassant 感谢您的帮助。效果很好! :)

标签: c# c++ controls


【解决方案1】:

看看这些答案:ProcessStartInfo hanging on "WaitForExit"? Why?StandardOutput.ReadLine() hang the application using c#, 它们都可以提供解释和解决方案。

我也尝试过使用 ReadLineAsync:

while ((line = await process.StandardOutput.ReadLineAsync()) != null)
    Console.WriteLine(line);

它奏效了。请注意,如果您选择此解决方案,则必须对代码进行一些更改以使其成为 async(您也可以将其包装在任务中,这完全取决于您的需要)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    相关资源
    最近更新 更多