如何在C#/.NET中捕获二进制进程输出

3
我想启动一个外部应用程序,并捕获其输出。使用 Diagnostics.Process 和它的 OutputStream 就很容易实现。但是,我生成的进程产生了二进制数据,我需要将其作为 Stream 捕获,而不是文本的 StreamWriter。
有没有办法获取底层的原始二进制流?
目前,我通过启动一个类似以下批处理文件的方式来解决这个问题:
myapplication | socat stdin tcp-connect:localhost:12345
在我的代码中,我创建并监听一个 TCP socket。虽然这种方法可以解决问题,但它有点丑陋,我更喜欢直接使用外部进程。
(我不能使用本地文件,因为数据是实时的)
3个回答

4

提供一个完整的答案怎么样? - SerG
1
@SerG:这是一个完整的回答。唯一的问题是“有没有办法获取底层的原始二进制流?” - Ben Voigt

1
我使用了以下代码从程序的标准输出中读取二进制数据:
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "yourProcess";
info.Arguments = "blah";
info.StandardOutputEncoding = System.Text.Encoding.GetEncoding("latin1");//important part
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
Process p = Process.Start(info);
FileStream fs = new FileStream("outputfile.bin", FileMode.Create);

while((val = p.StandardOutput.Read())!= -1){
    fs.WriteByte((byte)val);
}

p.WaitForExit();
fs.Close();

1
你可以使用命名管道,类似于但比 Process 的 OutputStream 功能更深入(基本上是 StandardOutput 的监听器)。命名管道可使用流访问,而不做任何关于内容为 Unicode 字符数据的假设。它们也不会占用网络端口,除非你想远程连接到一个管道(这也是可能的)。

1
但是你需要修改子进程,使其使用管道,否则可以使用p/invoke CreateProcess将管道作为子进程的标准输出句柄传递。 - Ben Voigt

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