2010-06-11 1 views
2

Я использую MonoDevelop и Make для выполнения некоторых build taks в проекте C под linux, но я решил отказаться от Make и переключиться на NAnt, так как я более разбираюсь в написании программ на C#, чем в сценариях Make/shell, поэтому решил написать пользовательскую задачу NAnt в C# для замены моего Makefile. Итак, как я могу вызвать GCC или другие команды оболочки из C#?Как я могу вызвать Linux-программы из C#/Mono?

Мне также нужно знать, как заблокировать выполнение до тех пор, пока 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») вместо NAnt, потому что файлы проекта Monodevelop являются MSBuild файлы, и MonoDevelop имеет xbuild интеграции.

+0

Отличный человек кода, я не знал, что MsBuild разрешил настраиваемые задачи и, конечно же, рассмотрит это. –

+0

MonoDevelop имеет типы проектов C, поэтому у него уже должна быть задача для выполнения gcc. Если да, то каким образом я могу получить доступ к этой задаче пропорционально моей собственной пользовательской задаче? И что еще более важно, как я могу вставить свою собственную задачу в проект MonoDevelop? –