如何在c# DLL文件中将控制台应用程序作为进程运行时获得它的输出?

本文关键字:运行时 进程 输出 应用程序 DLL 文件 控制台 | 更新日期: 2023-09-27 18:09:08

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

代码:

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:没有输出。但是,我可以看出它正在运行,因为我可以看到许多输出文件正在更新。

为什么我没有得到任何输出,我该如何纠正这个?

如何在c# DLL文件中将控制台应用程序作为进程运行时获得它的输出?

按流程。您的代码有潜在的死锁。

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

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

在您的库中,而不是直接写入您应该使用的位置System.Diagnostics.Trace。通过使用Trace,您可以让您的外部控制台应用程序或其他应用程序使用TraceListener订阅Trace事件。

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

下面是关于跟踪日志的另一个Stack Overflow线程的链接,其中有一些很好的例子和信息。

如何在c#中添加(简单)跟踪?