我正在尝试使用Mono中的GTK#运行“dh_make”shell命令。问题是:dh_make要求进程开始工作,按键。我不知道是否可以使用C#。你能帮助我吗?
答案 0 :(得分:1)
正如我所评论的那样,您需要使用g_spawn_async_with_pipes让管道与dh_make
进程通信。使用Gtk,您可能需要掌握main event loop并使用g_child_watch_add添加观看儿童,并使用g_io_add_watch进行频道观看。您可能必须使用两个通道(即管道),一个用于输入dh_make
,另一个用于输出。
如果您不清楚pipes是什么,请考虑阅读好的advanced linux programming或advanced unix programming书。 Gtk的主循环是为你做多路复用poll。
如果您想了解这些低级Gtk / Glib函数如何粘合到Gtk#,请研究Gtk#文档并最终查看其源代码(可能在源代码上使用grep
Gtk#
)。 Gtk#可能有一些与之相关的测试或演示或示例代码。
答案 1 :(得分:1)
是的,绝对可以模仿对进程的“输入”按压作为用户的输入。下面的代码就是这样,通过将dh_make作为一个单独的进程启动,将其标准输入引导到创建进程的输出中,并将'enter'作为输入发送到dh_make进程:
System.Diagnostics.Process myProcess = new System.Diagnostics.Process();
myProcess.StartInfo.FileName = "dh_make";
myProcess.StartInfo.Arguments = "(put here any command line arguments you need)";
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.RedirectStandardInput = true;
myProcess.Start();
System.IO.StreamWriter myStreamWriter = myProcess.StandardInput;
// The following will put an 'Enter' on the first dh_make request for user input
myStreamWriter.WriteLine(" ");
我目前在几段代码中使用它,它运行得很好。
希望有所帮助!
答案 2 :(得分:1)
process.StartInfo.WorkingDirectory = "'/home/"+user+"/pacotes/"+nome_pacote.Text+"-1.0/'";
process.StartInfo.FileName="dh_make";
process.StartInfo.Arguments="-n -s";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.Start();
System.IO.StreamWriter myStreamWriter = process.StandardInput;
myStreamWriter.WriteLine(" ");
process.WaitForExit();
在调试时,我收到以下错误:奇数字符'>',预期在元素'filename 的属性名称'unknown'之后'='。你知道可能是什么吗?