簡體   English   中英

在 C# DLL 文件中作為進程運行時,如何獲取控制台應用程序輸出?

[英]How can I obtain console application output when running it as a process in a C# DLL file?

我正在研究 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:沒有任何輸出。 但是,我可以說它正在運行,因為我可以看到許多輸出文件正在更新。

為什么我沒有得到任何輸出以及如何解決這個問題?

根據Process.StandardOutput 文檔,您的代碼可能存在死鎖。

當調用者從子進程的重定向流中讀取時,它依賴於子進程。 調用者等待讀取操作,直到孩子寫入流或關閉流。 當子進程寫入足夠的數據來填充其重定向流時,它依賴於父進程。 子進程等待下一個寫操作,直到父進程從完整的流中讀取或關閉流。 當調用者和子進程相互等待以完成操作,並且都不能繼續時,就會導致死鎖條件。

為避免可能出現的死鎖,應切換示例代碼的最后兩行。 您還應該考慮重定向 StandardError。

在您的庫中,您應該使用System.Diagnostics.Trace而不是直接寫入選擇的位置。 通過使用 Trace,您可以讓外部控制台應用程序或任何使用TraceListener訂閱 Trace 事件的應用程序。

通過使用 Trace 和 TraceListeners,您可以使您的應用程序適應您需要的任何日志記錄情況,而無需在每次想要更改日志記錄系統時修改您的庫。

下面是另一個關於跟蹤日志記錄的 Stack Overflow 線程的鏈接,其中包含一些很好的示例和信息。

如何在 C# 中添加(簡單)跟蹤?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM