2010-06-11 44 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

相關問題