Noi*_*ves 6 c# windows .net-3.5
我需要为与命令行应用程序紧密交互的应用程序编写组件.命令行应用程序询问一系列问题,执行一些计算,然后终止(我需要检测).本质上,我想在包装类中包含这种交互.
过去有没有人取得过相似的成绩?如果是这样,你是怎么做到的?您是否注意到一个模式,或者可能在类中使用一些好的构建?干杯!
Mar*_*ell 15
您需要重定向输入和输出流,使用Process
; 处理两者都稍微复杂一些,因为你需要注意缓冲区中的东西不会丢失(导致死锁).
您可能还希望查看OutputDataReceived以获取基于事件的响应.
当我的回复只是其他地方的链接时,我会感到很沮丧。我不认为 C# 角文章的链接有多大帮助。
这个问题已经有 10 年历史了,但它应该得到澄清。该问题未指定每个问题末尾是否有行结尾 (CrLf)。假设有,如下:
string Answer;
Console.Out.WriteLine("First question: ");
Answer = Console.In.ReadLine();
Console.Out.WriteLine("Another question: ");
Answer = Console.In.ReadLine();
Console.Out.WriteLine("Final question: ");
Answer = Console.In.ReadLine();
Run Code Online (Sandbox Code Playgroud)
然后可以使用以下内容来响应它:
class Program
{
const string FirstQuestion = "First question: ";
const string SecondQuestion = "Another question: ";
const string FinalQuestion = "Final question: ";
static AutoResetEvent Done = new AutoResetEvent(false);
static void Main(string[] args)
{
const string TheProgram = @" ... ";
Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo(TheProgram);
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;
p.StartInfo = psi;
Console.WriteLine("Executing " + TheProgram);
p.Start();
DoPromptsAsync(p);
Done.WaitOne();
}
private static async Task DoPromptsAsync(Process p)
{
StreamWriter sw = p.StandardInput;
StreamReader sr = p.StandardOutput;
string Question;
Question = await sr.ReadLineAsync();
if (Question != FirstQuestion)
return;
sw.WriteLine("First answer");
Console.WriteLine(Question + "answered");
Question = await sr.ReadLineAsync();
if (Question != SecondQuestion)
return;
sw.WriteLine("Second answer");
Console.WriteLine(Question + "answered");
Question = await sr.ReadLineAsync();
if (Question != FinalQuestion)
return;
sw.WriteLine("Final answer");
Console.WriteLine(Question + "answered");
Done.Set();
}
}
Run Code Online (Sandbox Code Playgroud)
以下内容适用于 WPF 应用程序;我使用双击事件进行测试,但这也可以在其他 WPF 事件中使用。
const string TheProgram = @" ... ";
Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo(TheProgram);
psi.UseShellExecute = false;
//psi.CreateNoWindow = true;
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;
p.StartInfo = psi;
p.Start();
const string FirstQuestion = "First question: ";
const string SecondQuestion = "Another question: ";
const string FinalQuestion = "Final question: ";
StreamWriter sw = p.StandardInput;
StreamReader sr = p.StandardOutput;
string Question;
StringBuilder sb = new StringBuilder("Executing " + TheProgram + "\r\n");
Question = await sr.ReadLineAsync();
if (Question != FirstQuestion)
return;
sw.WriteLine("First answer");
sb.Append(Question + "answered\r\n");
Question = await sr.ReadLineAsync();
if (Question != SecondQuestion)
return;
sw.WriteLine("Second answer");
sb.Append(Question + "answered\r\n");
Question = await sr.ReadLineAsync();
if (Question != FinalQuestion)
return;
sw.WriteLine("Final answer");
sb.Append(Question + "answered\r\n");
ResultBox.Text = sb.ToString();
Run Code Online (Sandbox Code Playgroud)
我认为如果每个问题后面没有换行符,事情会更复杂。
归档时间: |
|
查看次数: |
4352 次 |
最近记录: |