如何在 .NET 中生成进程并捕获其 STDOUT? [复制]

2023-12-28

我需要生成一个作为控制台应用程序的子进程,并捕获其输出。

我为一个方法编写了以下代码:

string retMessage = String.Empty;
ProcessStartInfo startInfo = new ProcessStartInfo();
Process p = new Process();

startInfo.CreateNoWindow = true;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardInput = true;

startInfo.UseShellExecute = false;
startInfo.Arguments = command;
startInfo.FileName = exec;

p.StartInfo = startInfo;
p.Start();

p.OutputDataReceived += new DataReceivedEventHandler
(
    delegate(object sender, DataReceivedEventArgs e)
    {
        using (StreamReader output = p.StandardOutput)
        {
            retMessage = output.ReadToEnd();
        }
    }
);

p.WaitForExit();

return retMessage;

但是,这不会返回任何内容。我不相信OutputDataReceived事件正在被回调,或者WaitForExit()命令可能会阻塞线程,因此它永远不会回调。

有什么建议吗?

EDIT:看起来我在回调方面太努力了。正在做:

return p.StandardOutput.ReadToEnd(); 

看起来工作正常。


这是我已经验证可以工作的代码。我用它来生成 MSBuild 并监听其输出:

process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.OutputDataReceived += (sender, args) => Console.WriteLine("received output: {0}", args.Data);
process.Start();
process.BeginOutputReadLine();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 .NET 中生成进程并捕获其 STDOUT? [复制] 的相关文章

随机推荐

  • 如何避免shared_ptr内存泄漏?

    考虑以下代码 using boost shared ptr struct B struct A A std cout lt lt A lt lt std endl shared ptr b b struct B B std cout lt
  • c# Visual Studio ...以编程方式添加引用

    无论如何 是否可以通过编程方式将引用添加到解决方案中 我有一个加载项按钮 当用户按下它时 我想要添加一个引用 原因是 我创建了一个软件 我想将其集成到任何给定的 VS 程序中 如果开发人员需要的话 他们只需单击加载项按钮 引用就会加载到当前
  • Twitter Bootstrap 上的语法突出显示

    我试图使用 Google prettify 突出显示一些语法 但到目前为止 它不起作用 pre class prettyprint code class language css Some source code class Foo pub
  • 单例中的实体框架上下文

    我正在构建一个在单例模式中使用 EF 上下文的应用程序 例如 NHibernate 与会话一起使用 public class DbContextFactory private static volatile DbContextFactory
  • 客户端找不到 {} 的调度方法

    我有这个示例代码 private static final String endpoint https www 443 WSEndUser wsdl public static void main String args throws SO
  • 实体框架 5 软删除

    我试图防止对我的数据库表进行任何删除 目前使用实体框架 5 首先这是我的代码 public override int SaveChanges var Changed ChangeTracker Entries if Changed null
  • 将意图从服务发送到活动

    我正在尝试返回结果IntentSerivce to the mainactivity使用意图 但我无法让它发挥作用 这IntentService毫无问题地从活动中接收意图 执行它的操作并获得JSONstring 现在剩下的唯一问题是将这个字
  • 修改 servlet 上下文初始化参数() 值

    我正在经历一个 Web 开发过程 其中有两个参数 即用户名和密码作为 web xml 文件中的上下文参数 例如
  • jqgrid 删除时出现错误消息

    我为我的 jqgrid 添加了以下代码 changeTextFormat function data return Activity or one from the same price group already used jQuery
  • java.net.BindException:绑定失败:EADDRINUSE(地址已在使用中)

    我有一个服务 它启动线程在套接字上执行一些操作 代码如下 public class ServerRunnable implements Runnable Override public void run ServerSocket serve
  • 联合仅选择一行

    我有一个带有两个 Select 子句与 UNION 组合的查询 我只想选择顶部第一行 我该如何使用 Union 来做到这一点 Select Fault OccurredOn From ATMStatus Where Ticket 18970
  • 如何在weblogic中远程部署应用程序?

    我有两台计算机 我不想在我的开发计算机上安装weblogic和oracle 它们消耗太多内存 问题是我如何将开发计算机上的应用程序部署到另一台安装了oracle和weblogic的空闲计算机上 我使用的是weblogic 10 3 我不想在
  • Ionic2/Angular2 - 读取自定义配置文件

    我正在开发 ionic2 项目 需要创建一个新的自定义 JSON 配置文件 我找到了一些教程来创建一个并通过 http get 访问它 但我认为通过 get 请求调用它很奇怪 我希望它位于根文件夹 所有配置 JSON 都在其中 然后我直接打
  • jQuery 电子邮件验证要求

    我使用 jQuery Validation 插件进行客户端验证 除其他外 我还验证电子邮件地址 现在我还想在服务器端进行验证 对于没有 javascript 等的用户 由于缺乏更好的想法 我开始使用正则表达式 但很快我意识到我想要重要的是使
  • SVG 画一个有 4 个扇形的圆

    我需要画一个有 4 个扇形的圆 我正在尝试绘制这样的扇区
  • WinSock recv()超时:setsockopt()-设置值+半秒?

    我正在编写一个跨平台库 除其他外 它提供了一个套接字接口 在运行我的单元测试套件时 我注意到通过设置超时有一些奇怪的事情setsockopt 在 Windows 上 阻塞recv 调用似乎始终比通过指定的时间晚大约半秒 500 毫秒 返回S
  • 有人对在 Rails 3 中管理多态嵌套资源有什么建议吗?

    在config routes rb中 resources posts do resources comments end resources pictures do resources comments end 我也希望允许对更多事情进行评
  • ReSharper 换行和换行

    所以这 cmd new OdbcCommand string Format SELECT FROM Bobby Tables WHERE Name 0 Little Bobby Drop Tables odbcConnection 被格式化
  • 如何在显示 Inno Select 语言对话框之前执行代码

    我需要在显示 选择安装语言 对话框之前执行 pascal 代码 不幸的是初始化设置事件在之后执行 function InitializeSetup Boolean This event occurs to late begin DoSome
  • 如何在 .NET 中生成进程并捕获其 STDOUT? [复制]

    这个问题在这里已经有答案了 我需要生成一个作为控制台应用程序的子进程 并捕获其输出 我为一个方法编写了以下代码 string retMessage String Empty ProcessStartInfo startInfo new Pr