我正在尝试通过C#应用程序启动游戏服务器(Game:Ark Survival Evolved)。 (某种包装)。
此游戏服务器是一个控制台应用程序,其中包含有关服务器当前状态的一些输出。 我想读取输出以便对它作出反应。这就是读取必须异步发生的原因。 (我不能等到服务器停止了)
我目前的做法如下:
public void RunServer()
{
if (Process.GetProcessesByName("ShooterGameServer").Length <= 0)
{
Process p = new Process();
// redirect output stream
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.EnableRaisingEvents = true;
p.OutputDataReceived += (sender, args) => Display(args.Data);
// set Server.exe path
p.StartInfo.FileName = path_server;
// run server
p.Start();
// reading the console
p.BeginOutputReadLine();
p.WaitForExit(); // I've tried it without this line but it doesn't really help
}
}
// Show the console output
void Display(string output)
{
Console.Out.WriteLine(output);
}
服务器exe启动完全正常,但只要StdOut出现就停止写入控制台。 (在控制台窗口中仍显示StdOut消息之前有一些StdErr消息。)
这是可以理解的,因为我只在我的代码中启用了p.StartInfo.RedirectStandardOutput = true,所以StdErr通道不受它的影响。
问题是重定向的输出永远不会出现在显示功能中。它只是消失在空气中。
如果我在Display功能中设置了一个断点,它就永远不会被调用,直到我关闭server.exe。之后调用它,但参数为null。
不幸的是,我对游戏服务器exe没有任何进一步的了解。 我错过了什么?
编辑:结果是重定向其他exe文件的输出(例如cmd exe)工作得很好。有没有其他方法可以在我的C#应用程序中读取控制台?也许只是“复制”输出而不是完全重定向?