C#与CLI进程交互-StandardInput停止执行

C#与CLI进程交互-StandardInput停止执行,c#,asp.net,.net,command-line,command-line-interface,C#,Asp.net,.net,Command Line,Command Line Interface,我正在尝试使用C#StandardInputs和StandardOutput与CLI交互 我在process.StandardInput.WriteLine()之前和之后以及StandardOutput循环之后插入了断点 当我进入process.StandardInput.WriteLine()时,代码立即停止执行,焦点返回到我的主窗体(winform)。process.StandardInput.WriteLine()之后的断点(或任何其他代码)永远不会执行 在循环中调用最后一个进程.Stan

我正在尝试使用C#StandardInputs和StandardOutput与CLI交互

我在process.StandardInput.WriteLine()之前和之后以及StandardOutput循环之后插入了断点

当我进入process.StandardInput.WriteLine()时,代码立即停止执行,焦点返回到我的主窗体(winform)。process.StandardInput.WriteLine()之后的断点(或任何其他代码)永远不会执行

在循环中调用最后一个进程.StandardOutput.WriteLine()时也会发生同样的情况

        Process process = new Process();
        process.StartInfo.FileName = @"C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\vpncli.exe";
        process.StartInfo.RedirectStandardInput = true;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.CreateNoWindow = true;
        process.Start();

        process.StandardInput.AutoFlush = true;
        process.StandardInput.WriteLine("connect vpn.service.domain.com");
        ...Additional code below
如果在process.StandardInput.WriteLine()之前使用此循环读取StandardOutput,也会发生同样的情况:

我还注意到,如果使用普通GUI命令提示符运行Cisco VPN CLI,则会得到以下输出:

  Copyright (c) 2004 - 2015 Cisco Systems, Inc.  All Rights Reserved.


  >> state: Disconnected
  >> state: Disconnected
  >> notice: Ready to connect.
  >> registered with local VPN subsystem.
  VPN>
但当我运行process.StandardOutput.ReadLine()循环时,我得到了这个输出。您可以看到所有额外的空行和额外的“VPN>”提示:


process.StartInfo.FileName=@“C:\Program Files(x86)\Cisco\Cisco AnyConnect安全移动客户端\vpncli.exe”;
process.StartInfo.Arguments=“connect vpn.service.domain.com-s”;
...
process.StandardInput.WriteLine(userDetails.UserName);
process.StandardInput.WriteLine(userDetails.Password);


我添加了-s,它对我起了作用(这将stdin扩展到了控制台)。

我不信任AutoFlush。尝试使用process.StandardInput.Flush()。自动刷新使用的计时器在调试时可能会停止。有趣的是,它解决了process.StandardInput.WriteLine()的问题;但是它没有解决process.StandardOutput.ReadLine()循环的问题。这肯定不是循环本身的问题,因为如果我只是列出一堆process.StandardOut.ReadLine()而不是循环,那么它在命中最后一个后仍然会停止执行代码。您永远不希望在不是文件的流上测试null。您正在读取流中的所有数据并获取EOF,EOF设置了空条件,因此您永远不会进入while循环。基本上,您希望连接到VPN,对吗?如果您有Cisco的
vpnclient.exe
,您可以更轻松地实现所需way@jdweng这个循环实际上运行得很好。它循环阅读,直到尝试阅读最后一行。就像我说的,如果我移除循环,就像取出25行Console.WriteLine(process.StandardOutput.ReadLine());它将通过24个,但在最后一个代码爆发。
  Copyright (c) 2004 - 2015 Cisco Systems, Inc.  All Rights Reserved.


  >> state: Disconnected
  >> state: Disconnected
  >> notice: Ready to connect.
  >> registered with local VPN subsystem.
  VPN>
Cisco AnyConnect Secure Mobility Client (version 3.1.10010) .


Copyright (c) 2004 - 2015 Cisco Systems, Inc.  All Rights Reserved.




  >> state: Disconnected


VPN> 
  >> state: Disconnected


VPN> 
  >> notice: Ready to connect.


VPN> 
  >> registered with local VPN subsystem.