WPF / Консольное гибридное приложение - PullRequest
14 голосов
/ 17 марта 2011

Я пишу приложение, которое может быть запущено либо из командной строки, либо с пользовательским интерфейсом 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());
    }
}

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

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

Ответы [ 4 ]

10 голосов
/ 17 марта 2011

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

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

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

4 голосов
/ 06 июля 2017

Создайте приложение 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();
}
1 голос
/ 06 декабря 2013

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

  1. Добавьте еще одну точку входа с помощью метода 'Main', объявленного с помощью STAThreadAttribute. Это требуется WPF.
  2. В свойствах «Build» вашего проекта выберите «Console Application» в качестве выходных данных и новый метод «Main» в качестве «Startup Object» приложения.

    using System;
    
    public static class Program
    {
        [STAThreadAttribute]
        public static void Main()
        {
            Console.WriteLine("What now?");
            Console.ReadKey(true);
    
            App.Main();
        }
    }
    
0 голосов
/ 03 декабря 2015

Я знаю, что немного опоздал на вечеринку, но подумал, что могу бросить свои два цента.Вы всегда можете сохранить его как консольное приложение, а затем скрыть консоль в соответствии с этим ответом (https://stackoverflow.com/a/3571628/1059953).. В данный момент отображается консоль, затем она исчезает и появляется окно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...