使用C#,Mono 3.5(Unity),OSX中的Process.Start进行字符串引用

时间:2016-06-06 14:15:23

标签: c# macos unity3d mono

搜索stackoverflow和Google这个问题仅在Windows和.NET的上下文中得到解答,而不是在OSX上的Unity3D中使用的Mono版本。无论出于何种原因,我发现的解决方案或答案都没有在Unity3D的OSX Mono上发挥作用。我有可能做一些令人难以置信的愚蠢的事情,或者可能是Unity3D的Mono + OSX上出现了根本性的问题。因此这个问题

我正在尝试使用C#,Mono(Unity3D),OSX执行一个简单的命令。为了简单起见,这是来自shell的命令

/bin/sh -c "echo \"hello world\""

有效。这是我的C#代码

// original working line
// /bin/sh      -c "echo \"hello world\""
string args = @"-c ""echo \""hello world\""""";

var proc = new System.Diagnostics.Process {
    StartInfo = new System.Diagnostics.ProcessStartInfo {
        FileName = "/bin/sh",
        Arguments = args,
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        CreateNoWindow = true
    },
};
proc.Start();
string result = proc.StandardOutput.ReadToEnd();
result += proc.StandardError.ReadToEnd();
Debug.Log(proc.ExitCode);
Debug.Log(result);

失败了

Win32Exception: ApplicationName='/bin/sh', CommandLine='-c "echo \"hello world\""', CurrentDirectory=''

您可以看到参数(即CommandLine=)似乎是正确的

删除内部引号有效

string args = @"-c ""echo hello world""";

但当然我最终需要引用我的实际用例。

如何在Mono(Unity3D)OSX上将引号传递给Process.Start

更新

事实证明,这是Unity3D中Mono特有的一些问题。如果在Xamarin Studio中运行相同的代码,它将按预期工作。

仍在寻找可能的解决方法。

1 个答案:

答案 0 :(得分:0)

[“]符号通知有关开始或结束字符串,因此需要将此处理为简单符号,只要需要使用[\]字符,或者使用unicode / ascii代码。

你的例子:

// -c "echo \"hello world\""
string args = "-c \"echo \"hello world\"\"";

为了能够从IO流中读取,您需要确保该过程正确启动。 您可以通过以下方式完成此操作:

proc.WaitForInputIdle();

然后你应该能够从它的IO中读取。