ネイティブDLLからのC#デバッガによるWriteConsoleイベントの代行受信

ネイティブDLLを呼び出すC#アプリケーションがあります。ネイティブDLLはAllocConsoleを呼び出して新しいコンソールを作成し、WriteConsoleを作成して書き込みます。デバッガを接続せずにアプリケーションを実行すると、この動作は正常に動作します。しかし、Visual Studioのマネージデバッガを接続して実行すると、AllocConsoleが呼び出されたときに新しいコンソールウィンドウがポップアップしますが、WriteConsoleを呼び出すと何も書き込まれません。

デバッガがコンソールコマンドをインターセプトしてVSに送信しているように見えますが、テキストはVSウィンドウには表示されません(OutputまたはIntermediate)。VSウィンドウには、OutputDebugStringを呼び出すことによって意図的に書き込むことができます。私は本当に、現在のコンソール行を上書きするためにSetConsoleCursorPositionのような関数を使うので、AllocConsoleで作られたコンソールに書きたいと思っています。現時点で私の回避策は次のようなものです

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

これはかなりエレガントで、私が望む機能を私に与えてくれません。 VSデバッガをC ++コンソールイベントをインターセプトしないようにする方法に関するアイデアはありますか?この問題は、純粋にネイティブ環境の場合は発生しません。

2

1 答え

コンソールに何かを書く前に、このコードを試してみてください。

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

Here is the question I asked recently, which may be of use to you, there is also an answer, which explains the code above.

0
追加された
残念ながら、これは何の効果もないようですが、私は実験を続けます。管理されたデバッガが別のコンソールに自動的に接続している場合に、FreeConsole()を呼び出すことを試みましたが、これも問題を解決しません。
追加された 著者 Matt Fisher,