C#进程:使用管道/文件描述符

6
我正在尝试连接到Chromium,以与NodeJS中的Puppeteer相同的方式进行连接
在NodeJS中,这看起来非常简单。您只需向stdio数组添加两个参数即可使用管道。
但我无法在Puppeteer-Sharp中实现相同的逻辑。我花了一些时间阅读这里的许多问题和答案。我了解了AnonymousPipeServerStream,但没有成功。
以下是我无法使其工作的一个示例:
AnonymousPipeServerStream streamReader = new AnonymousPipeServerStream(PipeDirection.In, HandleInheritability.Inheritable);
AnonymousPipeServerStream streamWriter = new AnonymousPipeServerStream(PipeDirection.Out, HandleInheritability.Inheritable);

var chromeProcess = new Process();
chromeProcess.EnableRaisingEvents = true;
chromeProcess.StartInfo.UseShellExecute = false;
chromeProcess.StartInfo.FileName = "/.local-chromium/MacOS-536395/chrome-mac/Chromium.app/Contents/MacOS/Chromium";
chromeProcess.StartInfo.Arguments = 
    "--MANY-MANY-ARGUMENTS  " +
    "--remote-debugging-pipe  " +
    "--user-data-dir=/var/folders/0k/4qzqprl541b74ddz4wwj_ph40000gn/T/mz0trgjc.vlj " +
    "--no-sandbox " +
    "--disable-dev-shm-usage " + 
    streamReader.GetClientHandleAsString() +
    streamWriter.GetClientHandleAsString();

chromeProcess.Start();

streamReader.DisposeLocalCopyOfClientHandle();
streamWriter.DisposeLocalCopyOfClientHandle();

Task task = Task.Factory.StartNew(async () =>
{
    var reader = new StreamReader(streamReader);
    while (true)
    {
        var response = await reader.ReadToEndAsync();

        if (!string.IsNullOrEmpty(response))
        {
            Console.WriteLine(response);
        }
    }
});

Console.ReadLine();

许多示例表明,您必须将GetClientHandleAsString()作为参数传递,但我不知道它如何连接到进程。
这是一个包含完整示例的要点。
1个回答

1
答案在于使用具有设置了 RedirectStandardInputRedirectStandardOutput 和/或 RedirectStandardError 属性的 ProcessStartInfo 启动 Process,然后使用 Process.StandardInputProcess.StandardOutput 和/或 Process.StandardError 属性访问管道。

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