WPF / Console 混合应用程序

16

我正在编写一个应用程序,可以在命令行上运行,也可以使用WPF UI界面。

[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个回答

11

您最好的选择是将实际完成工作的代码抽象出来成为一个没有UI的独立类库,然后创建两个应用程序,一个是控制台应用程序,另一个是WPF应用程序,它们分别调用这个类库。

控制台应用程序和WPF应用程序具有完全不同的应用程序模型,因此不能在两个应用程序中重复使用相同的代码。

拥有一个独立的类库允许您做其他事情,比如在其他应用程序中使用它,例如网站或客户端/服务器架构。


10

创建一个 WPF 应用程序,并将以下代码添加到您的 App 类中:

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
你可以通过以下步骤来有条件地启动WPF应用程序,具体操作如下所示:
  1. 使用STAThreadAttribute声明'Main'方法,添加另一个入口点。这是WPF所必需的。
  2. 在项目的“生成”属性下,选择“控制台应用程序”作为输出,将新的'Main'方法作为应用程序的“启动对象”。

    using System;
    
    public static class Program
    {
        [STAThreadAttribute]
        public static void Main()
        {
            Console.WriteLine("现在怎么办?");
            Console.ReadKey(true);
    
            App.Main();
        }
    }
    

0

我知道我来晚了,但是想分享我的看法。你可以将它保留为控制台应用程序,然后按照这个答案(https://dev59.com/53A65IYBdhLWcg3w5zDB#3571628)隐藏控制台。控制台会显示一段时间,然后消失,窗口就会出现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接