我正在尝试为我构建的桌面应用程序添加命令行支持,以便我可以从其他地方运行其命令而无需显示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,但它看起来很旧,而且不再相关。有没有其他方法来实现这一目标?
答案 0 :(得分:0)
正如Leppie在评论中所说,这是不可能的,我将不得不构建2个独立的应用程序 - 一个用于桌面,一个用于命令行。
一个可能的解决方案是将RestartSession
函数划分为dll
,然后让2个小exes调用相同的dll(一个用于桌面,一个用于控制台)
答案 1 :(得分:0)
Leppie在评论中有正确的答案。对于这样的场景,您的实际应用程序项目应该非常小。它应该只包含特定于该应用程序类型的内容。
应将所有业务逻辑,应用程序共享初始化逻辑等移动到两者都使用的不同项目中。