【问题标题】:How can I obtain console application output when running it as a process in a C# DLL file?在 C# DLL 文件中将控制台应用程序作为进程运行时,如何获取控制台应用程序输出?
【发布时间】:2011-09-20 01:51:39
【问题描述】:

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

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

【问题讨论】:

  • 什么是“IPS”?进程间 ?

标签: c# dll process console-application


【解决方案1】:

根据Process.StandardOutput documentation,您的代码可能存在死锁。

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

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

【讨论】:

    【解决方案2】:

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

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

    下面是另一个 Stack Overflow 线程的链接,其中包含一些很好的示例和信息。

    How can I add (simple) tracing in C#?

    【讨论】:

    • 遗憾的是我无法访问调用我的库的应用程序,它是封闭源代码,他们基本上提供了一个挂钩到他们的软件,但我无法进入该软件并添加跟踪。跨度>
    • 你在什么操作系统上运行这个?我问的原因是 Windows Server 2008 和 Vista 有一些关于写入事件日志的新权限,如果运行应用程序的进程没有权限,那么您将无法获得输出。您可以尝试将输出写入“所有用户”区域或“程序数据”区域中的文本文件,其中权限不会成为问题。
    • 我正在为此使用 Windows XP。我将尝试写入文件,看看是否有帮助。我想要这个输出的原因是,当我使用我的测试应用程序进行测试时,通过控制台运行它,它可以工作,我可以在事件日志中看到输出。但是,当它实际上在此测试之外运行时(我的方法由另一个 dll 中的函数调用,该函数由其他一些软件调用)平台该进程似乎没有正确运行(它产生一个输出文件,但它从未被创建)但由于我无法获得该过程的输出,所以我不知道出了什么问题。
    • 没有控制台打开会导致这种情况吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2019-01-30
    • 2011-01-22
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多