1

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

代码:

进程getNextIons=新进程();获取NextIons。StartInfo。FileName=@“”“C:\Program Files\OpenMS-1.6\PrecursorIonSelector.exe”“”;获取NextIons。StartInfo。Arguments=@“-ini”“C:\Program Files\OpenMS-1.6\precursorionselector.ini”“”;获取NextIons。开始信息。UseShellExecute=false;获取NextIons。StartInfo。重定向StandardOutput=true;获取NextIons。开始();获取NextIons。等待退出();系统。诊断。事件日志。WriteEntry(“FMANWiff”,“IPS:”+getNextIons.StandardOutput.ReadToEnd());

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

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

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

1
  • 什么是“IPS”?进程间<something>? 评论 2020年8月21日13:42

2个答案2

重置为默认值
1

根据过程。StandardOutput文档您的代码可能存在死锁。

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

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

1

在您的库中,不要直接写入您应该使用的位置系统。诊断。跟踪。通过使用Trace,您可以使用TraceListener(跟踪侦听器).

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

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

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

4
  • 遗憾的是,我没有访问调用我的库的应用程序的权限,这是一个封闭源代码,他们基本上为他们的软件提供了一个钩子,但我无法进入该软件并添加跟踪。 评论 2011年9月20日5:03
  • 你在什么操作系统上运行这个?我之所以问这个问题,是因为Windows Server 2008和Vista有一些关于写入事件日志的新权限,如果运行应用程序的进程没有权限,那么您将无法获得输出。您可以尝试将输出写入“所有用户”区域或“ProgramData”区域中的文本文件,在这些区域中权限不会成为问题。 评论 2011年9月20日13:56
  • 我正在使用Windows XP进行此操作。我会尝试写入文件,看看是否有帮助。我希望获得此输出的原因是,当我使用我的测试应用程序进行测试时,它可以通过控制台运行,并且我可以在事件日志中看到输出。但是,当它实际在这个测试平台之外运行时(我的方法是由其他软件调用的另一个dll中的函数调用的),进程似乎没有正确运行(它生成一个输出文件,但从未创建),但由于我无法获得进程的输出,我不知道发生了什么问题。 评论 2011年9月21日15:05
  • 可能是因为没有打开任何控制台导致了这种情况吗? 评论 2011年9月21日15:06

您的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.