WPF/консольное гибридное приложение

Я пишу приложение, которое может быть запущено в командной строке или с помощью интерфейса WPF.

[STAThread]
static void Main(string[] args)
{
    // Does magic parse args and sets IsCommandLine to true if flag is present
    ParseArgs(args);     

    if(IsCommandLine)
    {
        // Write a bunch of things to the console
    }
    else
    {
        var app = new App();
        app.Run(new Window());
    }
}

Я устанавливаю тип Output проекта в Console Application, я получаю окно консоли, которое появляется, если я пытаюсь выполнить его, дважды щелкнув exe. Я не хочу показывать окно консоли пользователю, если флаг не установлен (передается через команды args).

Однако, если я устанавливаю тип вывода проекта в приложение Windows, поведение двойного щелчка в порядке, но когда я запускаю его в консоли, я не получаю никакого вывода консоли (Console.Writeline)

Ответ 1

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

Консольное приложение и приложение WPF имеют совершенно разные модели приложений, поэтому вы не можете повторно использовать один и тот же код в обоих приложениях.

Наличие отдельной библиотеки классов позволяет вам делать другие вещи, например использовать ее в других приложениях, таких как веб-сайт или архитектура клиент/сервер.

Ответ 2

Создайте приложение WPF и добавьте следующий код в класс приложения:

public partial class App
{
    protected override void OnStartup(StartupEventArgs e)
    {
        if (e.Args.Length > 0)
        {                
            List<string> lowercaseArgs = e.Args.ToList().ConvertAll(x => x.ToLower());
            if (AttachConsole(ATTACH_PARENT_PROCESS))
            {
                // your console app code                

                Console.Write("\rPress any key to continue...");
                Console.ReadKey();
                FreeConsole();
            }
            Shutdown();
        }
        else
        {
            base.OnStartup(e);
        }
    }

    private const int ATTACH_PARENT_PROCESS = -1;

    [DllImport("kernel32", SetLastError = true)]
    private static extern bool AttachConsole(int dwProcessId);

    [DllImport("kernel32.dll")]
    private static extern bool FreeConsole();
}

Ответ 3

Вы можете условно запустить приложение WPF, выполнив следующие шаги с примером ниже.

  • Добавьте еще одну точку входа с методом Main, объявленным с помощью STAThreadAttribute. Это требуется WPF.
  • В свойствах проекта "Создать" выберите "Консольное приложение" в качестве вывода и новый "Основной" метод в качестве приложения "Объект запуска".

    using System;
    
    public static class Program
    {
        [STAThreadAttribute]
        public static void Main()
        {
            Console.WriteLine("What now?");
            Console.ReadKey(true);
    
            App.Main();
        }
    }
    

Ответ 4

Я знаю, что немного опоздал на вечеринку, но решил, что смогу бросить свои два цента. Вы всегда можете сохранить его как консольное приложение, а затем скрыть консоль в соответствии с этим ответом (fooobar.com/info/45191/...). Отображается момент отображения консоли, затем она исчезает и появляется окно.