Process.cs Interoperability

October 18, 2017

Geçtiğimiz hafta acceptance testlerimizi yazarken in house gelistirilen bir test aracını başlatıp stdout dan çıktı alacak test adapter’ı yazma ihtiyacımız oldu. Windows ortamında sorunsuz kodumuz mono üzerinde koşarken bir hata ile karşılastım.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public string Run(string executablePath, string arguments)
{
    StringBuilder output = new StringBuilder();

    var process = new Process()
    {
        EnableRaisingEvents = true,
        StartInfo = new ProcessStartInfo()
        {
            FileName = executablePath,
            Arguments = $"{arguments}",
            UseShellExecute = false,
            CreateNoWindow = true,
            RedirectStandardInput = true,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
        }
    };

    process.OutputDataReceived += (sender, eventArgs) => output.AppendLine(eventArgs.Data); // <---

    process.Start();
    process.BeginOutputReadLine();
    process.WaitForExit(1000);

    return EscapeTerminalChars(output.ToString());
}

Yukarıdaki kod bloğu windows ortamında beklediğimiz şekilde çalıştı ancak mono clr üzerinde koşturduğumda işaretli satırdaki handler ı çalıştırmadığını gördük. Muhtemel hata ise mono geliştiricilerinin eksik kontrol yapmasından kaynaklanıyor.

Satır satır okuma yapmak zorunda olmadığımız icin aşağıdaki gibi değiştirdik.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
public string Run(string executablePath, string arguments)
{
    var process = new Process()
    {
        EnableRaisingEvents = true,
        StartInfo = new ProcessStartInfo()
        {
            FileName = executablePath,
            Arguments = $"{arguments}",
            UseShellExecute = false,
            CreateNoWindow = true,
            RedirectStandardInput = true,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
        }
    };

    process.Start();
    process.WaitForExit(1000);

    return EscapeTerminalChars(process.StandardOutput?.ReadToEnd());
}

Hem MS hem de Mono CLR üzerinde istediğimiz sonucu elde ettik.

hidden

John von Neumann – The Man from the Future

Before I read The Man from the Future by Ananyo Bhattacharya, I only knew about John von Neumann in two contexts: that computers use the von Neumann architecture, and that he appeared in a story about a mathematical problem I … Continue reading →

via Henrik Warne's blog

The Review Is the Action Item

2024/05/30The Review Is the Action ItemI like to consider running an incident review to be its own action item. Other follow-ups emerging from it are a plus, but the point is to learn from incidents, and the review gives room for that to happen.This is no…

via Ferd.ca

HOWTO: Change your behavior

In theory, behavior change should be easy. At first glance, it seems like you control your behavior. So, if you desire different behavior, why doesn’t your behavior change as instantly as your desire to change it? In short, lasting change of habitual behavio…

via Matt Might's blog