Как нажать на другой процесс `` stderr` и `stdout`? - PullRequest
0 голосов
/ 01 мая 2018

Этот вопрос отличается от вопроса, предложенного в качестве дубликата:

  1. Мой вопрос очень специфичен для . То есть даже если есть решение для «классического» .NET Framework, оно может быть неприменимо в среде .NET Core.
  2. Существует значительный (8 лет!) Промежуток времени между опубликованными вопросами.

Пожалуйста, не рассматривайте это как дубликат, потому что это не так.


Я не смог подключиться к stderr и stdout потокам процессов, которые были созданы вне процесса моего приложения .

targetProcessList относится к типу List<System.Diagnostics.Process>.


следующий код

foreach (var proc in targetProcessList)
{
    proc.StandardError.ReadToEndAsync().ContinueWith(t => Console.WriteLine(t.Result));
    proc.StandardOutput.ReadToEndAsync().ContinueWith(t => Console.WriteLine(t.Result));
}

приводит к InvalidOperationException (возможно, потому что Процесс не настроен для такого использования):

enter image description here

[c:\           HRIS.Web] dotnet run :       User profile is available. Using '                 \AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest.
[c:\           HRIS.Web] dotnet run :
[c:\           HRIS.SPA] npm run start-prodish-for-e2e ||| [12044] cmd
[c:\           HRIS.SPA] npm run start-prodish-for-e2e ||| [11080] conhost
System.InvalidOperationException: StandardError has not been redirected.
   at System.Diagnostics.Process.get_StandardError()
   at RunE2E.Program.StartProcessViaCmd(String command, String arguments, String workingDirectory)
   at RunE2E.Program.Main(String[] args)
System.NullReferenceException: Object reference not set to an instance of an object.
   at RunE2E.Program.Main(String[] args)

Итак, я пытаюсь динамически включить перенаправление следующим образом:

foreach (var proc in targetProcessList)
{
    proc.StartInfo.RedirectStandardError = true;
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StandardError.ReadToEndAsync().ContinueWith(t => Console.WriteLine(t.Result));
    proc.StandardOutput.ReadToEndAsync().ContinueWith(t => Console.WriteLine(t.Result));
}

но все еще получает удар во время выполнения

enter image description here

[c:\           \HRIS.Web] dotnet run :       User profile is available. Using '                 \AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest.
[c:\           \HRIS.Web] dotnet run :
[c:\           \HRIS.SPA] npm run start-prodish-for-e2e ||| [14952] cmd
[c:\           \HRIS.SPA] npm run start-prodish-for-e2e ||| [10784] conhost
System.InvalidOperationException: Process was not started by this object, so requested information cannot be determined.
   at System.Diagnostics.Process.get_StartInfo()
   at RunE2E.Program.StartProcessViaCmd(String command, String arguments, String workingDirectory)
   at RunE2E.Program.Main(String[] args)
System.NullReferenceException: Object reference not set to an instance of an object.
   at RunE2E.Program.Main(String[] args)

Есть ли способ обойти это?

...