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/...). Отображается момент отображения консоли, затем она исчезает и появляется окно.