C#应用程序中的命令行界面

时间:2012-06-21 14:55:39

标签: c# multithreading command-line-interface

我一直在使用C#进行一些项目,没什么大不了的。所以我想现在就开始研究一个真正的项目。我用C#创建了一个IRC机器人。 此IRC bot在命令行中没有GUI运行。现在当它运行时,它输出每个命令和东西。

我想要做的是在命令行内为应用程序创建一个界面。 这样我就可以在应用程序中输入命令并输出命令的结果。

我已经尝试阅读有关多线程我的软件的几个主题,因为我相信这是我实现此功能所必需的。但我不确定。

我读过Command-line interface in Javahttp://msdn.microsoft.com/en-us/library/aa288457(v=vs.71).aspx等帖子。但我仍然非常困惑。

我已经尝试使用Google搜索任何工具包,例如http://alexis.royer.free.fr/CLI/

我想就此问题寻求建议,如有可能,请提供有关此计划的基础知识的帮助。如果有人强烈建议我不要在C#中搜索这个功能,那么我很乐意听到他/她对于为什么不这样做的意见以及对我应该使用/做什么的建议。

非常感谢提前! 罗伯特。

P.S。我对错误的英语语法表示歉意。

5 个答案:

答案 0 :(得分:1)

这是一个非常简单的命令行,有一个如何做不同颜色和处理参数的例子:

using System;
using System.Linq;

namespace SOSimpleCLI
{
    class Program
    {
        static void Main(string[] args)
        {
            string cmdLine = null;
            while (cmdLine != "end")
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write("SOSimpleCLI: ");
                Console.ForegroundColor = ConsoleColor.White;

                cmdLine = Console.ReadLine();

                string[] cmd = cmdLine.Split(' ');
                switch (cmd.FirstOrDefault())
                {
                    case "cmd1":
                        Console.WriteLine(Cmd1());
                        break;

                    case "cmd2":
                        if (cmd.Length != 2)
                        {
                            Console.WriteLine("Wrong number of args for cmd2");
                        }
                        else
                        {
                            Console.WriteLine(Cmd2(cmd[1]));
                        }
                        break;
                }
            }
        }

        static string Cmd1()
        {
            return "Came from command 1";
        }

        static string Cmd2(string arg)
        {
            return string.Format("Came from command 2: {0}", arg);
        }
    }
}

我不确定为什么你希望它是多线程的,但你可以通过与不同方法中的线程交互来添加它。

答案 1 :(得分:0)

在Windows中,过程映像可以在GUI模式下启动(在屏幕上显示窗口......或者根本不启动)或者作为"控制台"进程(因此命令窗口将与进程同时打开)。然而,这两者并不相互排斥:a" Console"进程可以创建窗口,GUI进程可以创建并拥有自己的命令行窗口。但是,创建控制台窗口的GUI应用程序不会在任何父控制台会话中打开该控制台。

根据我对您的问题的理解,您有一个现有的GUI应用程序,并且您希望为您的应用程序启用某种控制台(如Quake控制台),而不是将其转换为仅限控制台的程序。

这可以使用Win32中的AllocConsole函数完成。我建议你阅读这个Q& A:How do I include a console in Winforms?

答案 2 :(得分:0)

如果您对是否需要多线程应用程序感到困惑,我建议您先阅读一下有关优势的信息。线程的缺点。 Joe Albahari的web book的第一章是一个很好的介绍。

如果不完全理解程序的设计,我会建议您在后台线程上执行所有Chat bot行为。此外,您在控制台中键入的任何命令也应触发后台工作,这使得控制台可以自由地打印输出或接受输入,但不执行任何实际的聊天任务。如果您有任何问题,请与我们联系。

答案 3 :(得分:0)

对于解析命令,您实际上不需要使用线程,这里有一些关于实现此目的的最佳方法的信息

@ Codeplex.com上有几个命令行解析器。它们将变得非常复杂,因此根据你想要做多少命令行解析,你可以使用它们。

我刚开始使用string.substring

表示CONNECT [[]]       string command =“Connect irc:// QuakeNet”

  int end = command.IndexOf(" ");
  string cmd = command.substring(0,end);

  switch(cmd.ToLower())
  {
    case "connect":
         string site = command.SubString(end + 1, cmd.Length -1)
         //Do what you need to do to connect to the site
    break;
   }

如果你真的达到了需要使用线程的程度,你可以随时使用后台工作线程

Tutorial on how to use a background thread

答案 4 :(得分:0)

您是否考虑过创建Windows服务?该服务将包含所有“做事”的代码。然后,您可以向服务发出命令(通过ExecuteCommand)。

然后,您可以创建多个UI,包括控制台和GUI,它们只需调用服务然后再接收信息。这将使您能够通过标准命令行窗口发出命令,并在GUI中查看结果,而无需尝试从同一项目内部管理两个窗口。

(这也可以为您提供一个多进程应用程序,而无需自己明确管理这些进程。)