C#应用程序的GUI和命令行

我目前有一个GUI的应用程序。

是否有可能从命令行使用这个相同的应用程序(没有GUI和使用参数)。

或者我必须为命令行工具创build一个单独的.exe(和应用程序)?

  1. 编辑您的项目属性,使您的应用程序“Windows应用程序”(而不是“控制台应用程序”)。 您仍然可以通过这种方式接受命令行参数。 如果你不这样做,那么当你双击应用程序的图标时,会popup一个控制台窗口。
  2. 确保您的Main函数接受命令行参数。
  3. 如果你得到任何命令行参数,不要显示窗口。

这是一个简短的例子:

 [STAThread] static void Main(string[] args) { if(args.Length == 0) { Application.Run(new MyMainForm()); } else { // Do command line/silent logic here... } } 

如果你的应用程序还没有被安排干净地进行无声处理(如果你所有的逻辑被阻塞到你的WinForm代码中),你可以在ala CharithJ的答案中进行无声处理 。

由OP编辑抱歉劫持你的答案Merlyn。 只需要在这里为他人的所有信息。

要能够在WinForms应用程序中写入控制台,只需执行以下操作:

 static class Program { // defines for commandline output [DllImport("kernel32.dll")] static extern bool AttachConsole(int dwProcessId); private const int ATTACH_PARENT_PROCESS = -1; /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(string[] args) { // redirect console output to parent process; // must be before any calls to Console.WriteLine() AttachConsole(ATTACH_PARENT_PROCESS); if (args.Length > 0) { Console.WriteLine("Yay! I have just created a commandline tool."); // sending the enter key is not really needed, but otherwise the user thinks the app is still running by looking at the commandline. The enter key takes care of displaying the prompt again. System.Windows.Forms.SendKeys.SendWait("{ENTER}"); Application.Exit(); } else { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new QrCodeSampleApp()); } } } 

在你的program.cs类中保持Main方法,但是将string[] Args添加到主窗体。 例如…

  [STAThread] static void Main(string[] Args) { .... Application.Run(new mainform(Args)); } 

在mainform.cs构造函数中

  public mainform(string[] Args) { InitializeComponent(); if (Args.Length > 0) { // Do what you want to do as command line application. // You can hide the form and do processing silently. // Remember to close the form after processing. } } 

您可能需要将您的应用程序构build为控制台应用程序,确定您在“操作”上执行的操作(如单击button),将其分配到单独的类中,包括可以显示的表单(如果没有提供命令行参数),以及处理事件通过将它们路由到“Action”类中的常用方法。

我认为这是可能的,只要将您的子系统设置为“控制台”,您将看到一个控制台窗口以及GUI窗口。

但是为了从控制台窗口接受命令,我想你将不得不创build一个额外的线程来做到这一点。