1

Linux上のWineで実行するためにVisualStudioC#で開発されたGUIアプリケーションを移植しようとしています。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 

私は何が間違っているのですか?

4

1 に答える 1

2

これは、修正されないWineの制限によるものです。

Wineで実行されているWindowsプロセスはネイティブプロセスを開始できますが、ネイティブプロセスを待機したり、開始後にパイプを介してプロセスと対話したりすることはできません。

これを回避する方法はたくさんありますが、それらはすべてあなたの側でいくつかの作業を伴います。たとえば、次のようになります。

  • 使用する必要のあるプログラムのWindowsビルドを使用します(おそらくオプションではありません、私はそれを取ります)。
  • 必要なプログラムを実行し、ファイルを使用して入力/出力をリダイレクトする.shスクリプトを使用します。
  • ネイティブLinuxプロセスのプロキシとして機能するwinelibプログラムを作成し、WineパイプとLinuxパイプの間で情報を集中させます。
  • Windows sshクライアントを使用して、ローカルホストでLinuxプログラムを実行します。
于 2012-11-15T20:13:15.867 に答える