проблемы с Console.SetOut в режиме выпуска? - PullRequest
13 голосов
/ 15 апреля 2010

У меня есть куча Console.WriteLines в моем коде, которые я могу наблюдать во время выполнения. Я общаюсь с родной библиотекой, которую я тоже написал.

Я бы хотел вставить некоторые printf в нативную библиотеку и посмотреть их тоже. Я не вижу их во время выполнения, однако.

Я создал приложение «Привет, мир!», Чтобы продемонстрировать свою проблему. Когда приложение запускается, я могу выполнить отладку в нативной библиотеке и увидеть, что hello world называется. Вывод никогда не попадает в текстовщик, хотя. Обратите внимание, что если тот же код запускается как консольное приложение, то все работает нормально.

C #:

    [DllImport("native.dll")]
    static extern void Test();

    StreamWriter writer;

    public Form1()
    {
        InitializeComponent();

        writer = new StreamWriter(@"c:\output.txt");
        writer.AutoFlush = true;
        System.Console.SetOut(writer);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Test();
    }

и родная часть:

__declspec(dllexport) void Test()
{
    printf("Hello World");
}

Обновление: Хамишмин ниже начал говорить о сборках отладки / выпуска. Я удалил собственный вызов в вышеупомянутом методе button1_click и просто заменил его стандартным вызовом Console.WriteLine .net. Когда я скомпилировал и запустил это в режиме отладки, сообщения были перенаправлены в выходной файл. Когда я переключился в режим выпуска, однако, звонки не были перенаправлены. Перенаправление консоли работает только в режиме отладки. Как мне обойти это?

Ответы [ 4 ]

2 голосов
/ 17 апреля 2010

Возможно, ваша родная библиотека по какой-то причине не знает о консоли.
Вы можете попробовать вызвать GetConsole и посмотреть, возвращен ли дескриптор. Если нет, вы можете попробовать выделить собственную консоль , чтобы проверить, работает ли она.
Удачи! :-)


Обновление:
Я также написал пример приложения (консольное приложение C #, вызывающее нативную C ++ dll), и на консоли появляются как C # Console.WriteLine, так и нативный printf ... Так чего нам не хватает?
Вы всегда запускаете его в режиме отладки - вы вообще видите окно консоли, если вы запускаете его в режиме выпуска?
Обновление 2:
Извините, я должен сказать, что вижу текст на консоли, но если я установлю вывод консоли на StreamWriter, как у вас в вашем примере, тогда только текст WriteConsole перейдет в выходной файл, printf все равно перейдет экран

1 голос
/ 18 августа 2010

Перенаправление консоли работает только в режиме отладки.

1 голос
/ 16 апреля 2010

У меня нет ни одного проекта, на котором я мог бы это попробовать, но я бы определенно заподозрил буферизацию.stdout буферизируется, если мне не изменяет память.Он сбрасывает буфер каждый раз, когда достигает конца строки:

printf("Should be flushed immediatelly\n");

Или вы можете использовать fflush для очистки stdout:

printf("Will be buffered and then flushed");
fflush(stdout);

Вы также можете отключить буферизациюиспользуя setbuf:

setbuf(stdout, NULL);
0 голосов
/ 17 апреля 2010

Реализуйте свой собственный printf (поверх vsnprintf, чтобы позаботиться о грязных деталях), который пишет в консоль:

#include <stdarg.h>

int printf(const char *fmt, ...)
{
    char buffer[LARGESIZE];
    int rv;
    va_list ap;
    va_start(ap, fmt);
    rv = vsnprintf(buffer, sizeof(buffer), fmt, ap);
    va_end(ap);

    Console.WriteLine(buffer);

    return rv;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...