C#: действительно ли возможно иметь отдельное приложение, ведут себя как Консоль или Приложение Windows в зависимости от переключателей?

Я выполняю XCode на текущем генерале Macbook только с одним ГБ RAM, и это хорошо работает, пока я ограничиваю объем общего выполнения приложений.

8
задан Svish 23 November 2009 в 23:40
поделиться

6 ответов

Хотя это не совсем то, о чем вы просили, я добивался появления этого поведения в прошлом, используя FreeConsole pInvoke для удаления окно консоли.

Вы устанавливаете тип вывода проекта как консольное приложение. Затем вы определяете внешний вызов FreeConsole :

[DllImport("kernel32.dll", SetLastError=true)]
private static extern int FreeConsole();

Затем в своем методе Main вы переключаетесь в зависимости от ваших условий. Если вам нужен пользовательский интерфейс, вызовите FreeConsole перед открытием формы, чтобы очистить окно консоли.

if (asWinForms)
{
    FreeConsole();       
    Application.Run(new MainForm());
}
else
{
    // console logic here 
}

Окно консоли ненадолго появляется при запуске, но в моем случае это было приемлемо.

Это немного хакерский и имеет неприятный запах, так что я бы серьезно подумал, действительно ли вы хотите пойти по этому пути.

11
ответ дан 5 December 2019 в 05:56
поделиться

From 'The Old New Thing'

How написать программу, которую можно запускать как консоль или приложение с графическим интерфейсом пользователя?

Вы не можете.

(Я позволю вам щелкнуть статью, чтобы узнать, как ее подделать)

8
ответ дан 5 December 2019 в 05:56
поделиться

Конечно, просто поместите оператор switch (или конструкцию другого типа) в статический main (string [] args) на основе аргументов, переданных в командной строке . Я также делаю это, чтобы переключаться между выполнением в качестве службы или в качестве консоли ...

ПРИМЕЧАНИЕ. Установите тип проекта как консольное приложение.

[DllImport("kernel32.dll", SetLastError=true)]
private static extern int FreeConsole();    
[STAThread]
static void Main(string[] args)
        {
            if (args.Length == 0 && args[0] == "C") // Console
            {                    
                // Run as console code  
                Console.WriteLine("Running as Console App");
                Console.WriteLine("Hit any Key to exit");
                Console.ReadLine();
          }
            else
            {
                //Console.SetWindowSize(1,1);
                //string procName = Assembly.GetExecutingAssembly().FullName;
                //ProcessStartInfo info = new ProcessStartInfo(procName );
                //info.WindowStyle = ProcessWindowStyle.Minimized;

                // EDIT: Thanks to Adrian Bank's answer - 
                // a better approach is to use FreeConsole()
                FreeConsole();
                Application.Run(new MyForm());
            }
        }

РЕДАКТИРОВАТЬ: Благодаря ответу Адриана Банка FreeConsole () - гораздо лучший подход к "распределению" "с окном консоли, чем просто свернуть его ...

6
ответ дан 5 December 2019 в 05:56
поделиться

Это две разные парадигмы, я не думаю, что использование такого переключателя командной строки - хорошая идея. Почему бы не встроить основную логику в консольное приложение, а затем при необходимости вызвать ее из графического интерфейса? Это красиво отделит пользовательский интерфейс от реализации, но все же предоставит возможность использовать автономное консольное приложение при необходимости.

2
ответ дан 5 December 2019 в 05:56
поделиться

Я считаю, что ответ отрицательный, или это был последний раз, когда я рассматривал эту проблему.

Исполняемый файл помечен либо как оконное приложение, либо как консольное приложение. Вы можете увидеть это в свойствах вашего проекта в Visual Studio, в разделе «Тип вывода»

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

1
ответ дан 5 December 2019 в 05:56
поделиться

Без реализации вашей собственной версии окна консоли ответ будет отрицательным. Когда Windows загружает ваш исполняемый файл, она решает, предоставлять ли вам консольное окно на основе данных в заголовке PE. Таким образом, вы можете сделать оконное приложение без окна, но вы не можете сделать так, чтобы у оконного приложения была консоль.

0
ответ дан 5 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: