Code: Select all
public static int Main(string[] args)
{
var executable = @"hardcoded path to childprocess.dll";
var psi = new ProcessStartInfo(executable)
{
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
using var process = Process.Start(psi)!;
process.OutputDataReceived += (_, dataReceivedEventArgs) => ProcessOnOutputDataReceived(dataReceivedEventArgs, Console.Out);
process.BeginOutputReadLine();
process.WaitForExit();
return process.ExitCode;
}
private static void ProcessOnOutputDataReceived(DataReceivedEventArgs args, TextWriter textWriter)
{
// never called for Console.Write + Flush
// called without issues with Console.WriteLine
if (args.Data is var data and not null)
{
textWriter.WriteLine(data);
}
}
Code: Select all
public static void Main(string[] args)
{
Console.Write("Output never visible :(");
Console.Out.Flush();
// Console.WriteLine("This works perfectly fine!");
Console.ReadLine(); // just to stop the process from quitting.
}
Für den Flush landen wir in ConsolePal ::WriteFileNative mit useFileAPIs auf true gesetzt, was bedeutet, dass wir am Ende Kernel32.WriteFile aufrufen, das die korrekt geschriebene Anzahl von Zeichen zurückgibt.
Aufruf FlushFileBuffers mit dem Dateihandle macht auch keinen Unterschied.