【问题标题】:C# debugger intercepting WriteConsole events from a native DLLC# 调试器从本机 DLL 拦截 WriteConsole 事件
【发布时间】:2011-11-25 08:27:31
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 不幸的是,这似乎没有任何效果,但我会继续试验。我尝试先调用 FreeConsole() 以防托管调试器自动将其附加到不同的控制台,但这也不能解决问题。
    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    相关资源
    最近更新 更多