Если я настроил свою программу как приложение 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);
}
AllocConsole
). Если я вызываю Marshal.GetLastWin32Error
после вызова Console.WriteLine
, я получаю сообщение об ошибке «System.ComponentModel.Win32Exception (0x80004005): дескриптор недействителен». Я подозреваю, что подключение к консоли приводит к сбоям в работе Console.Out
, но я не знаю, как это исправить.