【问题标题】:.NET console output bypassing redirection.net 控制台输出绕过重定向
【发布时间】:2015-03-10 11:56:54
【问题描述】:

.net 中的控制台类支持将文本写入标准输出和标准错误,但是我相信还有另一个可以写入的流,但无法重定向。

http://www.robvanderwoude.com/battech_redirection.php

批处理文件可以这样实现: echo hello > CON

这个流,或者说不可重定向输出的效果,如何在c#中实现?

【问题讨论】:

  • 不是流,winapi函数你必须pinvoke。像 WriteFile() 到“CONOUT$”设备或 WriteConsole()。
  • @HansPassant 如果您将此添加为答案,我会接受 - 谢谢。

标签: .net console io-redirection


【解决方案1】:

感谢Hans Passant,以下解决方案有效(如果无法创建CONOUT$“文件”,则可以优雅地回退到Console.Out):

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$ 文件 - 因此是优雅的回退。

【讨论】:

    猜你喜欢
    • 2013-11-14
    • 1970-01-01
    • 2015-09-11
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多