c#调试器从本地DLL拦截WriteConsole事件

本文关键字:拦截 WriteConsole 事件 DLL 调试器 | 更新日期: 2023-09-27 18:15:36

我有一个调用本地DLL的c#应用程序。本机DLL调用AllocConsole来创建一个新的控制台,然后调用WriteConsole来写入它。在不附加调试器的情况下运行应用程序时,此行为可以正常工作。但是当它与Visual Studio的托管调试器连接时运行时,当调用AllocConsole时,新的控制台窗口仍然弹出,但是当我调用WriteConsole时,没有向它写入任何内容。

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

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

这是相当不优雅的,并没有给我我想要的功能。关于如何让VS调试器不拦截c++控制台事件的任何想法?当我在纯本地环境中,这个问题不会发生。

c#调试器从本地DLL拦截WriteConsole事件

在编写控制台之前尝试使用这段代码。

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

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