我有一个应用程序(不是我所有的),可以执行编译为DLL的“插件”,只要它们将特定的接口实现为入口点即可。
使用此配置,控制我的插件DLL代码执行的Process与该应用程序相同(因此涉及单个Process),但我不控制该Process的启动。这意味着我无法设置
StartInfo.UseShellExecute = false;
StartInfo.RedirectStandardOutput = true;
似乎是访问标准输出所必需的(基于我发现的其他答案)...正在执行我的插件的进程似乎已经将其设置为“错误的”值(UseShellExecute = true和RedirectStandardOutput = false)。
所以...我的插件可以使用此应用程序的API调用一个函数,该函数使该应用程序执行长时间运行的计算。调用此函数将导致我的代码暂停执行,直到该函数完成其处理(即是同步的)为止。
我很想在单独的线程上添加进度指示器,但是来自父应用程序的唯一通信似乎已写入标准输出。我这样说的原因是,当我用Visual Studio调试应用程序时,即使我的代码在该函数的执行“冻结”了(see here)
,我仍可以在“输出”选项卡中看到“进度X%”更新。所以我的问题是:有什么方法可以捕获此输出?我尝试过
process.ErrorDataReceived += Process_ErrorDataReceived;
process.OutputDataReceived += ProcessOnOutputDataReceived;
但是这些文件似乎从未被调用(因为父应用程序似乎是用UseShellExecute = true和RedirectStandardOutput = false来启动的,而我无法控制流程的启动)
我还尝试了一个自定义的ConsoleWriter(在单独的线程上)
consoleWriter = new MyConsoleWriter();
consoleWriter.WriteEvent += MyCustomWrite;
consoleWriter.WriteLineEvent += MyCustomWriteLine;
Console.SetOut(consoleWriter);
但是尽管我在Visual Studio中看到了明显的Output消息,但从未使用过它(我想这意味着父应用程序没有利用.NET Console吗?)
鉴于我无法控制process.StartInfo.UseShellExecute和process.StartInfo.RedirectStandardOutput(嗯,我可以随时更改它们,但除了启动过程外,我认为它没有任何作用),但是我确实与父应用程序共享同一进程(即我的代码由同一进程执行),有人知道我怎么可能捕获这些对父应用程序的标准输出的写操作(看起来是这样)? / p>
答案 0 :(得分:0)
在我看来,Visual Studio的“输出”选项卡必须打印的不仅仅是控制台输出,这导致了我的到来:https://docs.microsoft.com/en-us/visualstudio/debugger/diagnostic-messages-in-the-output-window?view=vs-2019
确实,当我添加TraceListener时(我只从一个Console开始,就可以捕获此输出。我从一个简单的ConsoleTraceListener开始,并且可以正常工作。
当心有关仍在闲逛的TraceListener的警告(我认为这对我的应用程序来说是个问题)https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.trace?view=netframework-4.8