【发布时间】:2017-08-06 17:32:52
【问题描述】:
我有一个 WinForm 项目,可以打开一个控制台进行调试。这在 C++ 中的游戏开发中非常常见。当我在 C# 中尝试这个时,我没有得到想要的结果。我想是因为我需要将标准输出设置到控制台。
虽然它使用了 Console.WriteLine(),但它会跳过将输出句柄设置到控制台。如何在 C# 中设置它?
我的代码:
namespace MVS
{
public partial class frmMVS : Form
{
[DllImport("kernel32")]
static extern bool AllocConsole();
public frmMVS()
{
InitializeComponent();
AllocConsole();
Console.WriteLine("Hello World!");
}
}
}
当前尝试(尽管没有任何内容输出到控制台): 来源:No console output when using AllocConsole and target architecture x86
namespace MVS
{
public partial class frmMVS : Form
{
public frmMVS()
{
InitializeComponent();
CreateConsole();
Console.WriteLine("Hello World!");
}
public static void CreateConsole()
{
AllocConsole();
// stdout's handle seems to always be equal to 7
IntPtr defaultStdout = new IntPtr(7);
IntPtr currentStdout = GetStdHandle(StdOutputHandle);
if (currentStdout != defaultStdout)
// reset stdout
SetStdHandle(StdOutputHandle, defaultStdout);
// reopen stdout
TextWriter writer = new StreamWriter(Console.OpenStandardOutput())
{ AutoFlush = true };
Console.SetOut(writer);
}
// P/Invoke required:
private const UInt32 StdOutputHandle = 0xFFFFFFF5;
[DllImport("kernel32.dll")]
private static extern IntPtr GetStdHandle(UInt32 nStdHandle);
[DllImport("kernel32.dll")]
private static extern void SetStdHandle(UInt32 nStdHandle, IntPtr handle);
[DllImport("kernel32")]
static extern bool AllocConsole();
}
}
目前的解决方案: 目前,我当前的解决方案是删除所有这些互操作代码并将输出类型设置为我的 Windows 应用程序中的控制台应用程序。这允许表单和控制台并排工作。因为运行应用程序的用户也会看到控制台,所以请记住在发布之前将输出类型设置回 Windows。由于控制台无论如何都用于调试,因此这似乎是一个简单的解决方案。我不知道在我开发过程中它会如何影响解决方案,因此仍然感兴趣的替代方案。
【问题讨论】:
-
这对你有帮助吗stackoverflow.com/questions/15604014/… ??
-
抱歉,如果我误解了,但你试过
Debug.WriteLine()吗? -
是的,这也不显示任何输出。事实上,控制台窗口也没有打开。当我打开控制台窗口时,它仍然没有显示任何输出。
-
对于游戏,没有。使用 VS 查找是一团糟。我需要控制台窗口。我上面的解决方案是临时的,但它现在可以工作,直到我找到相关的响应。