apo*_*r96 3 c# console output visual-studio-2017
好的,在需要 Winform 时,我也一直使用AllocConsole()
控制台输出的方法,因为在写入控制台时我使用了多种颜色。
使用 VS 2015 及更低版本,调试模式下的 AllocConsole 始终正常工作,正确Console.WriteLine
写入。现在使用 VS 2017,控制台在调用 AllocConsole 时显示,但是,console.WriteLine 输出到该控制台,而不是到 Visual Studio 的输出窗口。
我更喜欢使用 AllocConsole 而不是输出窗口,因为我非常依赖颜色。我已经做了很多关于如何解决这个问题的搜索,但我似乎无法找到答案。
AllocConsole()
不能单独工作,因为 VS 2017 做了一些“调试标准输出重定向魔术”。要解决此问题,您需要创建一个控制台AllocConsole()
并修复 stdout 句柄。
这是我找到的剪辑:
[DllImport("kernel32.dll",
EntryPoint = "AllocConsole",
SetLastError = true,
CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
private static extern int AllocConsole();
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr CreateFile(
string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
uint lpSecurityAttributes,
uint dwCreationDisposition,
uint dwFlagsAndAttributes,
uint hTemplateFile);
private const int MY_CODE_PAGE = 437;
private const uint GENERIC_WRITE = 0x40000000;
private const uint FILE_SHARE_WRITE = 0x2;
private const uint OPEN_EXISTING = 0x3;
public static void CreateConsole()
{
AllocConsole();
IntPtr stdHandle = CreateFile(
"CONOUT$",
GENERIC_WRITE,
FILE_SHARE_WRITE,
0, OPEN_EXISTING, 0, 0
);
SafeFileHandle safeFileHandle = new SafeFileHandle(stdHandle, true);
FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
standardOutput.AutoFlush = true;
Console.SetOut(standardOutput);
Console.Write("This will show up in the Console window.");
}
Run Code Online (Sandbox Code Playgroud)
特别感谢Ramkumar Ramesh的解决方法: 控制台输出在 VS2017 中消失了