-1

我正在尝试在 Mono 中使用 GTK# 运行“dh_make”shell 命令。问题是: dh_make 要求进程开始工作,按 键。我不知道是否可以使用 C#。你能帮助我吗?

4

3 回答 3

4

是的,绝对有可能模拟“输入”到进程的按下作为来自用户的输入。下面的代码可以做到这一点,将 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(" "); 

我目前在几段代码中使用它,它工作得很好。

希望有帮助!

于 2012-09-01T05:02:12.933 回答
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();

在调试时出现以下错误: 奇数字符“>”,在元素“文件名”的属性名称“未知”之后需要一个“=”。你知道可能是什么吗?

于 2012-10-28T20:19:00.450 回答
1

正如我评论的那样,您需要让管道使用g_spawn_async_with_pipesdh_make与进程通信。使用 Gtk,您可能需要掌握主事件循环并使用g_child_watch_add添加儿童观看和使用g_io_add_watch观看频道。您可能必须使用两个通道(即管道),一个用于输入,另一个用于输出。dh_make

如果您不知道什么是管道,请考虑阅读一本好的高级 linux 编程高级 unix 编程书籍。Gtk 的主循环正在为您进行多路复用轮询

如果您想了解这些低级 Gtk/Glib 函数是如何与 Gtk# 粘合的,请研究Gtk#文档并最终查看其源代码(可能使用grep的源代码Gtk#)。Gtk# 可能有一些与此相关的测试或演示或示例代码。

于 2012-07-30T05:22:25.123 回答