如何从C#/ Mono调用linux程序?

时间:2010-06-11 17:49:22

标签: c# mono nant monodevelop

我一直在使用MonoDevelop和Make在linux下的C项目上执行一些构建,但我决定放弃Make并切换到NAnt,因为我比编写Make / shell脚本更熟练编写C#程序,所以我决定在C#中编写一个自定义的NAnt任务来替换我的Makefile。那么,我如何从C#调用GCC或其他shell命令?

我还需要知道在GCC返回之前如何阻止执行。

2 个答案:

答案 0 :(得分:3)

与Windows相同 - 使用System.Diagnostics.Process。请注意,如果你重定向stdout / stderr并且缓冲区填满(这完全可以使用GCC),它可能会死锁,所以将它们收集到StringBuilders中。

var psi = new Process.StartInfo ("gcc", "-gcc -arguments") {
    RedirectStandardError = true,
    RedirectStandardOutput = true,
    UseShellExecute = false,
};
var error  = new System.Text.StringBuilder ();
var output = new System.Text.StringBuilder ();

var p = Process.Start (psi);
p.EnableRaisingEvents = true;
p.OutputDataReceived +=
    (object s, DataReceivedEventArgs e) => output.Append (e.Data);
p.ErrorDataReceived  +=
    (object s, DataReceivedEventArgs e) => output.Append (e.Data);

p.WaitForExit ();

FWIW,您可能会考虑使用MSBuild的自定义任务(即Mono的“xbuild”)而不是NAnt,因为MonoDevelop的项目文件是MSBuild文件,而MonoDevelop有xbuild集成。

答案 1 :(得分:0)

也许这会有所帮助:

http://mono-project.com/Howto_PipeOutput

它与Windows上的.NET基本相同。