我一直在使用MonoDevelop和Make在Linux下的C项目上执行一些构建taks,但是我决定放弃Make并切换到NAnt,因为我比Make/shell脚本更能熟练地编写C#程序,所以我决定在C#中编写自定义的NAnt任务来替换我的Makefile。那么,我如何从C#中调用GCC或其他shell命令呢?如何从C#/ Mono调用Linux程序?
我还需要知道如何阻止执行,直到GCC返回。
我一直在使用MonoDevelop和Make在Linux下的C项目上执行一些构建taks,但是我决定放弃Make并切换到NAnt,因为我比Make/shell脚本更能熟练地编写C#程序,所以我决定在C#中编写自定义的NAnt任务来替换我的Makefile。那么,我如何从C#中调用GCC或其他shell命令呢?如何从C#/ Mono调用Linux程序?
我还需要知道如何阻止执行,直到GCC返回。
它与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整合。
伟大的代码人,我不知道MsBuild允许自定义任务,并且一定会考虑到这一点。 – 2010-06-11 19:31:00
MonoDevelop有C项目类型,所以它必须已经有执行gcc的任务吗?如果是这样,我如何在自己的自定义任务中以主动方式访问该任务?更重要的是,如何将我自己的自定义任务插入到MonoDevelop项目中? – 2010-06-11 19:56:58