Использование std :: cout в DLL, вызываемой из C # - PullRequest
5 голосов
/ 04 мая 2011

В моем приложении для Windows есть часть C # и часть C ++.Приложение C # показывает окно консоли при запуске.

Код C ++ компилируется в DLL, которая используется из C # через P / Invoke.

Проблема заключается в том, что печать текста из C ++DLL через std :: cout ничего не печатает.Печать из C # работает нормально.

Я подозреваю, что C # занял консоль, поэтому C ++ не может справиться с этим.Исправление может состоять в том, чтобы получить дескриптор консоли из C #, передать его в C ++ и использовать его для подключения std :: cout к окну консоли.Но я не знаю, как это сделать.

Есть идеи?

Редактировать: Мой код на C ++ неуправляем.

Ответы [ 3 ]

2 голосов
/ 03 июля 2011

Я нашел рабочее решение в этом SO ответе .

2 голосов
/ 04 мая 2011

cout подключается средой выполнения C / C ++ при выполнении main(). Поэтому, если код C ++ ограничен DLL, вероятно, нет cout для записи. (Это упрощение, но вы поняли.)

Console.Out является System.IO.TextWriter. Если ваш код C ++ управляется, вы можете передать его в свою DLL и записать в нее. Но если вы звоните через P / Invoke, я подозреваю, что это не так. Может использовать именованную трубу?

0 голосов
/ 04 мая 2011

По сути, среда выполнения C ++ неправильно связана с консолью, потому что она должна ее создавать. Существует функция std::sync_with_stdio, которая должна правильно связывать std::cout.

...