2010-06-11 42 views
2

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

我还需要知道如何阻止执行,直到GCC返回。

回答

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而不是恶性的自定义任务(即单声道的“xbuild”),因为MonoDevelop中的项目文件的MSBuild文件和MonoDevelop的已xbuild整合。

+0

伟大的代码人,我不知道MsBuild允许自定义任务,并且一定会考虑到这一点。 – 2010-06-11 19:31:00

+0

MonoDevelop有C项目类型,所以它必须已经有执行gcc的任务吗?如果是这样,我如何在自己的自定义任务中以主动方式访问该任务?更重要的是,如何将我自己的自定义任务插入到MonoDevelop项目中? – 2010-06-11 19:56:58

相关问题