C # закрыть стандарт - PullRequest
8 голосов
/ 28 марта 2012

Я хотел бы иметь возможность отсоединить мою программу от консоли так же, как wget -b.Фрагмент кода может выглядеть как

static void Main(string[] args)
{
    var settings = new Settings(args);
    if (settings.Background)
    {
        /*Tell the user what's going on.*/
        System.Console.WriteLine("Detatching from console. The program will still be running.");
        System.Console.Out.Close();
    }
    /*do work then exit.*/
}

Но System.Console.Out.Close(); не делает правильных действий.

Чтобы уточнить, "правильная вещь" заключается в том, что при запуске этой программы из консолизапрос должен появиться снова.Или при запуске этой программы из explorer.exe окно консоли должно закрыться.

Пожалуйста, дайте мне знать, если я не ясен.

Ответы [ 4 ]

1 голос
/ 29 марта 2012

Вместо создания консольного приложения и возникновения проблем с вызовом FreeConsole вы можете получить желаемое, создав обычное приложение для Windows без графического интерфейса, в котором используется AllocConsole / AttachConsole / FreeConsole при необходимости.

Таким образом, у вас есть приложение, которое может работать в фоновом режиме, но которое может показывать и скрывать окно консоли по мере необходимости. Хотя, насколько я помню, между этими консольными окнами и обычными командными приглашениями Windows есть некоторые различия, поэтому они могут не сработать, как вы хотите.

1 голос
/ 28 марта 2012

Источник для wget, на который вы ссылаетесь, доступен здесь .Вы заметите, что в строках mswindows.c 193 - 314 реализована процедура fork.Они порождают новый экземпляр wget и передают ему те же параметры.

Комментарии также информативны:

Windows не поддерживает вызов fork ();поэтому мы подделываем его, вызывая другую копию Wget с теми же аргументами, с которыми мы были вызваны.

И в строке 102:

В Windows 9x еслизапущен из 16-битного процесса ... родительский процесс должен возобновиться сразу же.Под NT ... это бесполезный жест, так как родитель будет ждать, пока мы закончим, прежде чем возобновить.

Краткий ответ, кажется, "Не делай этого".

1 голос
/ 28 марта 2012

Для любого работающего консольного приложения открыто 3 канала: STDIN, STDOUT, STDERR.Традиционно все 3 должны быть закрыты для того, чтобы приложение выпустило консоль.

В Windows, похоже, есть метод API для этого: FreeConsole ... и pinvoke.net .

Редактировать: еще один пост SO говорит, что это невозможно без запуска фонового процесса: Как вернуть приложение без окон / из командной строки, но продолжить выполнение в фоновом режиме? ... В Unix этого было бы достаточно с fork();.

0 голосов
/ 28 марта 2012

Чтобы уточнить, "правильная вещь" в том, что при запуске этой программы из консоли приглашение должно появиться снова. Или при запуске этой программы из explorer.exe окно консоли должно закрыться.

Дело не в том, что вы хотите, чтобы «окно консоли закрывалось», а в том, чтобы оно не существовало. Есть очень простой способ получить то, что вы хотите: не создавайте консольное приложение. : -)

При сборке из командной строки используйте CSC /target:winexe .... Это создаст программу Windows, которая никогда не будет связана с какой-либо командной строкой.

...