C# 调试器拦截来自 native DLL 的 WriteConsole 事件

标签 c# c++ dll visual-studio-debugging

我有一个调用 native DLL 的 C# 应用程序。 native DLL 调用 AllocConsole 创建一个新的控制台,然后 WriteConsole 写入它。当应用程序在没有附加调试器的情况下运行时,此行为工作正常。但是当它在附加了 Visual Studio 的托管调试器的情况下运行时,在调用 AllocConsole 时仍然会弹出新的控制台窗口,但在我调用 WriteConsole 时不会向其中写入任何内容。

调试器似乎正在拦截控制台命令并将它们发送到 VS,但是文本没有出现在我可以看到的任何 VS 窗口中(输出或中间。)我可以故意写入 VS 窗口调用 OutputDebugString,但我真的希望能够写入使用 AllocConsole 制作的控制台,因为我使用 SetConsoleCursorPosition 等函数来覆盖当前控制台行。目前我的解决方法是

if(debuggerAttached) OutputDebugString(...) else WriteConsole(...)

这相当不优雅,没有给我想要的功能。关于如何让 VS 调试器不拦截 C++ 控制台事件的任何想法?我在纯原生环境下就不会出现这个问题。

最佳答案

在向控制台写入任何内容之前尝试使用这段代码。

//AllocConsole() is called
StreamWriter standardOutput = new StreamWriter(Console.OpenStandardOutput());
standardOutput.AutoFlush = true;
Console.SetOut(standardOutput);

Here是我最近问的问题,可能对你有用,还有一个答案,里面解释了上面的代码。

关于C# 调试器拦截来自 native DLL 的 WriteConsole 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8266379/

相关文章:

c - SetWindowsHookEx 运行返回 NULL

c# - DLL 中未处理的异常 : System. EntryPointNotFoundException

c++ - QLabel定位问题

c# - 多线程:锁定属性 - 这是正确的吗?

c# - 将日期添加到日期时间

c# - 如何在另一个应用程序中挂接 api 调用

c++ - Visual C++ Win32 控制台应用程序 printf 在 while 循环中多行输出

c++ - Vulkan 将视口(viewport)结果翻转为黑屏

c - A从C中的多个位置访问相同的信息

c# - 使用 c# 框架 3.5 连接到 Oracle