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 中消失了
| 归档时间: |
|
| 查看次数: |
1547 次 |
| 最近记录: |