我编写的应用程序可以在命令行上运行,也可以使用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来执行它,则会弹出一个控制台窗口。如果未设置标志(通过命令args传入),我不想向用户显示控制台窗口。
但是,如果我将项目的输出类型设置为Windows应用程序,则双击行为很好,但是当我在控制台中运行它时,我没有控制台输出(Console.Writeline)
答案 0 :(得分:10)
最好的办法是将实际完成工作的代码抽象到一个没有UI的单独类库中,然后创建两个应用程序,一个控制台,另一个调用它的WPF。
控制台应用程序和WPF应用程序具有完全不同的应用程序模型,因此您无法在两个应用程序中重复使用相同的代码。
拥有一个单独的类库允许您执行其他操作,例如在其他应用程序(如网站或客户端/服务器体系结构)中使用它。
答案 1 :(得分:3)
创建一个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();
}
答案 2 :(得分:1)
您可以通过以下示例执行以下步骤来有条件地启动WPF应用程序。
在项目的“构建”属性下,选择“控制台应用程序”作为输出,选择新的“主”方法作为应用程序的“启动对象”。
using System;
public static class Program
{
[STAThreadAttribute]
public static void Main()
{
Console.WriteLine("What now?");
Console.ReadKey(true);
App.Main();
}
}
答案 3 :(得分:0)
我知道我参加派对有点晚了,但我觉得我可以投入两美分。您可以始终将其保留为控制台应用程序,然后根据此答案隐藏控制台(https://stackoverflow.com/a/3571628/1059953)。有一段时间显示控制台,然后它就消失了,窗口出现了。