AttachConsole (-1), но Console.WriteLine не выводит в родительскую командную строку?

Если я настроил свою программу как приложение Windows и использовал AttachConsole (-1) API, как мне получить Console.WriteLine для записи в консоль, с которой я запустил приложение? У меня это не работает.

Если это актуально, я использую Windows 7 x64, и у меня включен UAC. Подъем, похоже, не решает проблему, как и использование start / wait .

Обновление

Некоторые дополнительные сведения, которые могут помочь:

Я только что обнаружил, что если я перейду в командную строку и наберу cmd / c MyProgram.exe , Затем консоль Выходные работы . То же самое верно, если я запускаю командную строку, открываю подпроцесс cmd.exe и запускаю программу из этой под-оболочки.

Я также пробовал выйти из системы и вернуться в нее, запустив cmd.exe из меню «Пуск» (в отличие от щелчка правой кнопкой мыши -> командная строка) и запустив экземпляр console2 . Ничего из этого не работает.

Справочная информация

Я читал на других сайтах и ​​в нескольких ответах SO, что я могу вызвать Win32 API AttachConsole , чтобы привязать мое приложение Windows к консоли, на которой запущена моя программа, чтобы я мог иметь то, что является «одновременно консольным приложением и приложением Windows».

Например, этот вопрос: Можно ли записывать сообщение в cmd.exe в C # /. Net? .

Я написал несколько логических схем, чтобы заставить эту работу работать (используя несколько других API-интерфейсов), и я заставил все остальные сценарии работать (включая перенаправление, которое, как утверждали другие, не будет работать). Остается только один сценарий - получить Console.WriteLine для записи в консоль, с которой я запускал свою программу. Судя по всему, что я читал, это должно работать, если я использую AttachConsole .

Repro

Вот минимальный образец - обратите внимание, что проект настроен как приложение Windows :

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        if (!AttachConsole(-1))
        {
            MessageBox.Show(
                new Win32Exception(Marshal.GetLastWin32Error())
                    .ToString()
                );
        }

        Console.WriteLine("Test");
    }

    [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
    private static extern bool AttachConsole(int processId);
}
  • Когда я запускаю его из командной строки, я не получаю сообщение об ошибке, но я также не получаю никакого вывода на консоль. Это проблема
  • Если я добавляю дополнительные окна сообщений в любом месте в потоке выполнения приложения, это окно отображается. Я ожидаю этого, так что здесь все хорошо.
  • Когда я запускаю это из Visual Studio или дважды щелкнув по нему, отображается окно сообщения с ошибкой. Я ожидаю этого, поэтому здесь не о чем беспокоиться (в моем реальном приложении я буду использовать AllocConsole ).

Если я вызываю Marshal.GetLastWin32Error после вызова Console.WriteLine , я получаю сообщение об ошибке «System.ComponentModel.Win32Exception (0x80004005): дескриптор недействителен». Я подозреваю, что подключение к консоли приводит к сбоям в работе Console.Out , но я не знаю, как это исправить.

22
задан Community 23 May 2017 в 12:10
поделиться