将.NET程序的输出类型设置为Windows应用程序和控制台应用程序

10

我有一个C#应用程序,它具有GUI并将其输出类型设置为Windows应用程序。我还希望通过命令行(通过参数)调用它,因此它也需要成为控制台应用程序。

有没有办法使我的应用程序既可以作为Windows应用程序运行,又可以作为控制台应用程序运行?
是否可以在运行时设置此选项,还是只能在编译时设置?

4个回答

11

您可以连接控制台。请将Program.cs中的代码更改为以下内容:

    [STAThread]
    static void Main(string[] args) {
        if (args.Length > 0) {
            AttachConsole(-1);
            Console.WriteLine("");
            Console.WriteLine("Running in console, press ENTER to continue");
            Console.ReadLine();
        }
        else {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern bool AttachConsole(int pid);

这种方法可以工作,但似乎有点古怪。我会接受,但我选择了两个不同的应用程序,一个是Windows,一个是Console。 - DanDan
有趣的一点可能是你在一个你没有创建的控制台中编写代码。输出会混合在一起。你也可以使用AllocConsole(),但那样会创建一个新的控制台。 - Hans Passant

1
一个 Windows Forms 应用程序可以接受命令行参数。在显示应用程序主窗体之前,您只需在主函数中处理此情况即可。
static void Main(string[] args)
{
    if (args.Length > 0)
    {
        // Run it without Windows Forms GUI
    }
    else
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm());
    }
}

1
这是一个编译时的设置:在编译器上有一个target:选项。/target:winexe构建Windows应用程序(即带有GUI);/target:exe则构建控制台应用程序。但两种类型的应用程序都可以接受命令行参数。

我最终建立了两个应用程序——一个真正的 Windows 程序和一个真正的控制台应用程序。 - DanDan

0
即使您的应用程序输出类型设置为Windows应用程序,您仍然可以从命令行调用它并传递参数。
只需更改您的Main方法定义为:static void Main(string[] args) {...},您就可以在“args”变量中访问传递的参数。

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