C# Процесс не может получить вывод с помощью специального exe - PullRequest
0 голосов
/ 02 августа 2020

Существует программа с именем mbinfo.exe, которая является частью mbsystem . Он был разработан для Linux (https://github.com/dwcaress/MB-System). GMT (поставщик инструментов Geographi c) создает версию Windows, и я хочу вызвать ее, чтобы получить ее результат. Когда я запускаю его в терминале, он работает нормально:

terminal image

But when I run it from C#, I cannot get the output. The C# code should be correct, because it can get output from other programs.

I tried to use ...> output.txt in terminal, and it suprisingly write nothing into the file; instread, the output is still displayed on the screen. I guess it writes to the console with a special stream, neither stdout or stderr. I think it is possible because it is designed for Linux.

I provide the program on my website: скачать . Вы можете запустить команду

./mbinfo.exe -f 211 -i a.xtf

, чтобы проверить это.

Вот коды:

asyn c:

var tcs = new TaskCompletionSource<int>();
            var process = new Process
            {
                StartInfo = new ProcessStartInfo()
                {
                    FileName = GetFileName(),
                    Arguments = GetArgs(),
                    CreateNoWindow = true,
                    UseShellExecute = false,
                    WindowStyle = ProcessWindowStyle.Hidden,
                    RedirectStandardError = true,
                    RedirectStandardOutput = true
                },
                EnableRaisingEvents = true,

            };

            process.Exited += (sender, args) =>
            {
                tcs.SetResult(process.ExitCode);
                process.Dispose();
            };
            process.ErrorDataReceived += Process_ErrorDataReceived;
            process.OutputDataReceived += Process_ErrorDataReceived;
            process.Start();
            process.BeginOutputReadLine();
            process.BeginErrorReadLine();

            return tcs.Task;

syn c:

            var process = new Process
            {
                StartInfo = new ProcessStartInfo()
                {
                    FileName = GetFileName(),
                    Arguments = GetArgs(),
                    CreateNoWindow = true,
                    UseShellExecute = false,
                    WindowStyle = ProcessWindowStyle.Hidden,
                    RedirectStandardError = true,
                    RedirectStandardInput = true,
                    RedirectStandardOutput = true
                },

            };

            process.Start();
            string result = process.StandardError.ReadToEnd() + process.StandardOutput.ReadToEnd();
            process.WaitForExit();
            return result;

Я даже пытался использовать Powershell SDK в C#, но все равно ничего не получил:

PowerShell ps = PowerShell.Create();
ps.AddScript(@"C:\programs\gmt5\bin\mbinfo.exe-f 211 -i C:\Users\autod\Desktop\test\a.xtf");
var result = ps.Invoke();
//return result[0].ToString();

Все get - пустой результат: "", а я может получить все результаты при запуске других exes.

Так что я думаю ключ к этой проблеме в том, что эта программа (mbinfo.exe) использует нестандартный выходной поток, а не stdout / stderr. Я не знаю, как захватить этот поток в C#.

Может ли кто-нибудь помочь мне и подсказать, как решить эту проблему?

...