繁体   English   中英

在Linux上的Wine下使用C#System.Diagnostics.Process

[英]Using C# System.Diagnostics.Process under Wine on Linux

我正在尝试移植在Visual Studio C#下开发的GUI应用程序,以便在Linux上的Wine下运行。 我在使用Process类时遇到问题。 当使用mcs编译并使用mono运行时,以下程序可以按预期工作:

using System.Diagnostics;
using System;

class TestProcess {
  static void Main() {
    Process process = new Process();
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.FileName = "/usr/bin/find";
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.Arguments = "/sys";

    process.ErrorDataReceived += new DataReceivedEventHandler(output);
    process.OutputDataReceived += new DataReceivedEventHandler(output);

    process.Start();
    process.BeginErrorReadLine();
    process.BeginOutputReadLine();
    process.WaitForExit();
  }

  static void output(object sender, DataReceivedEventArgs e) {
    Console.WriteLine(e.Data);
  }
}

但是,当我使用wine运行它时(我已经在Wine下安装了Mono for Windows),但由于以下异常而失败:

Unhandled Exception: System.InvalidOperationException: Standard error has not been redirected or process has not been started.
  at System.Diagnostics.Process.BeginErrorReadLine () [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) System.Diagnostics.Process:BeginErrorReadLine ()
  at TestProcess.Main () [0x00000] in <filename unknown>:0 

我究竟做错了什么?

这是由于Wine的局限性无法解决的。

尽管在Wine下运行的Windows进程可以启动本机进程,但它们无法等待本机进程启动后就可以通过管道与之交互。

有很多解决方法,但是它们都涉及您的一些工作。 您可以,例如:

  • 使用您需要使用的程序的Windows构建(我认为可能不是一种选择)。
  • 使用.sh脚本执行所需的程序,并使用文件重定向输入/输出。
  • 编写一个winelib程序,作为本机Linux进程的代理,在Wine和Linux管道之间传递信息。
  • 使用Windows ssh客户端在本地主机上运行Linux程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM