.NET 控制台输出绕过重定向
.NET console output bypassing redirection
.NET 中的 Console class 支持将文本写入 standard output and standard error。但是,我相信还有另一个流可以写入,但不能重定向。
批处理文件可以这样实现:
echo hello > CON
如何在 C# 中实现此流或效果不可重定向输出?
感谢 Hans Passant,以下解决方案有效(如果 CONOUT$
'file'创建):
public static class Progress
{
private static readonly TextWriter _writer;
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CreateFile(
[MarshalAs(UnmanagedType.LPTStr)] string filename,
uint fileAccess,
[MarshalAs(UnmanagedType.U4)] FileShare share,
IntPtr securityAttributes, // optional SECURITY_ATTRIBUTES struct or IntPtr.Zero
[MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
[MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes,
IntPtr templateFile);
const int FILE_ACCESS_WRITE = 0x40000000;
static Progress()
{
var realStdOut = new SafeFileHandle(CreateFile("CONOUT$", FILE_ACCESS_WRITE, FileShare.ReadWrite, IntPtr.Zero, FileMode.OpenOrCreate, 0, IntPtr.Zero), true);
_writer = !realStdOut.IsInvalid
? new StreamWriter(new FileStream(realStdOut, FileAccess.Write))
: Console.Out;
}
public static void WriteLine(string format, params object[] args)
{
_writer.WriteLine(format, args);
_writer.Flush();
}
}
有时在通过 Visual Studio 调试应用程序时我发现它无法创建 CONOUT$
文件 - 因此优雅的回退。
.NET 中的 Console class 支持将文本写入 standard output and standard error。但是,我相信还有另一个流可以写入,但不能重定向。
批处理文件可以这样实现:
echo hello > CON
如何在 C# 中实现此流或效果不可重定向输出?
感谢 Hans Passant,以下解决方案有效(如果 CONOUT$
'file'创建):
public static class Progress
{
private static readonly TextWriter _writer;
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CreateFile(
[MarshalAs(UnmanagedType.LPTStr)] string filename,
uint fileAccess,
[MarshalAs(UnmanagedType.U4)] FileShare share,
IntPtr securityAttributes, // optional SECURITY_ATTRIBUTES struct or IntPtr.Zero
[MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
[MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes,
IntPtr templateFile);
const int FILE_ACCESS_WRITE = 0x40000000;
static Progress()
{
var realStdOut = new SafeFileHandle(CreateFile("CONOUT$", FILE_ACCESS_WRITE, FileShare.ReadWrite, IntPtr.Zero, FileMode.OpenOrCreate, 0, IntPtr.Zero), true);
_writer = !realStdOut.IsInvalid
? new StreamWriter(new FileStream(realStdOut, FileAccess.Write))
: Console.Out;
}
public static void WriteLine(string format, params object[] args)
{
_writer.WriteLine(format, args);
_writer.Flush();
}
}
有时在通过 Visual Studio 调试应用程序时我发现它无法创建 CONOUT$
文件 - 因此优雅的回退。