如何在运行时更改应用程序输出类型

时间:2016-06-30 13:41:43

标签: c# command-line visual-studio-2015 output

我正在尝试为我构建的桌面应用程序添加命令行支持,以便我可以从其他地方运行其命令而无需显示UI。这大约是我Main方法的样子:

[STAThread]
private static void Main(string[] args)
{
    // Run the desktop application
    if (args.Length == 0)
    {
        AppDomain.CurrentDomain.ProcessExit += OnProcessExit;

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        var mainForm = new Form1();
        Application.Run(mainForm);
        mainForm.BringToFront();
    }
    // Restart the session and log in console
    else if(args[0] == "restartsession")
    {
        Console.WriteLine("Restarting session...");
    }
    // argument not recognised (log to console)
    else
    {
        Console.WriteLine($"Argument \"{args[0]}\" not recognised");
    }
}

除了调用Console.WriteLine()时未显示控制台窗口这一事实外,这似乎工作得很好。

这是因为我的项目输出类型设置为Windows Application(我在属性中设置了它)。如果我将其更改为Console Application,控制台窗口会显示我的日志记录,但是当打开“UI”桌面版本时(即运行不带任何参数的应用程序),它也会显示。

是否有办法根据传递给Main()的参数更改输出类型?例如,这样的事情可能是:

private static void Main(string[] args)
{
    if (args.Length == 0)
    {
        Application.OutputType = WindowsApplication
    }
    else if(args[0] == "restartsession")
    {
        Application.OutputType = ConsoleApplication
    }
}

我能够找到this link,但它看起来很旧,而且不再相关。有没有其他方法来实现这一目标?

2 个答案:

答案 0 :(得分:0)

正如Leppie在评论中所说,这是不可能的,我将不得不构建2个独立的应用程序 - 一个用于桌面,一个用于命令行。

一个可能的解决方案是将RestartSession函数划分为dll,然后让2个小exes调用相同的dll(一个用于桌面,一个用于控制台)

答案 1 :(得分:0)

Leppie在评论中有正确的答案。对于这样的场景,您的实际应用程序项目应该非常小。它应该只包含特定于该应用程序类型的内容。

应将所有业务逻辑,应用程序共享初始化逻辑等移动到两者都使用的不同项目中。