如何在C#dll中将其作为进程运行时获取控制台应用程序输出

时间:2011-09-20 01:51:40

标签: c# dll process console-application

我正在研究DLL中的方法。在我的方法中,我一直在写事件日志,以便让我确定事情是否按预期工作。我在该方法中执行的任务之一是创建进程并运行命令行应用程序,我希望能够捕获通常写入控制台并将其写入事件日志的输出。

代码:

Process getNextIons = new Process();
getNextIons.StartInfo.FileName = @"""C:\Program Files\OpenMS-    1.6\PrecursorIonSelector.exe""";
getNextIons.StartInfo.Arguments = @"-ini ""C:\Program Files\OpenMS-1.6\precursorionselector.ini""";
getNextIons.StartInfo.UseShellExecute = false;
getNextIons.StartInfo.RedirectStandardOutput = true;
getNextIons.Start();
getNextIons.WaitForExit();
System.Diagnostics.EventLog.WriteEntry("FMANWiff", "IPS: " + getNextIons.StandardOutput.ReadToEnd());

我有一个调用我的方法的控制台测试应用程序,当我这样做时,我能够看到该进程已启动并正确运行,但是当我实际尝试使用DLL时,不使用测试应用程序,我最终看到的只是一个条目:

IPS: 并没有输出。我可以告诉它正在运行,因为我可以看到许多输出文件正在更新。

有谁知道为什么我没有得到任何输出以及我如何纠正这个?

2 个答案:

答案 0 :(得分:1)

在您的图书馆中,而不是直接写入您应该使用的选择位置 System.Diagnostics.Trace。通过使用Trace,您可以使用TraceListener来使用外部控制台应用程序或任何订阅Trace事件。

通过使用Trace和TraceListeners,您可以使应用程序适应您需要的任何日志记录情况,而无需在每次要更改日志记录系统时修改库。

下面是另一个关于跟踪日志记录的StackOverflow线程的链接,其中包含一些很好的示例和信息。

How to add (simple) tracing in C#?

答案 1 :(得分:1)

根据Process.StandardOutput documentation您的代码存在潜在的死锁。

  

当调用者从子进程的重定向流中读取时,它依赖于子进程。调用者等待读操作,直到子进程写入流或关闭流。当子进程写入足够的数据来填充其重定向流时,它依赖于父进程。子进程等待下一个写操作,直到父进程从完整流中读取或关闭流。当调用者和子进程等待彼此完成操作时,会导致死锁条件,并且两者都无法继续。

为避免可能的死锁,应切换示例代码的最后两行。您还应该考虑重定向StandardError。