2

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

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

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

我已经阅读了 Java 中的命令行界面http://msdn.microsoft.com/en-us/library/aa288457(v=vs.71).aspx等线程。但我还是很困惑。

我试过用谷歌搜索任何工具包,比如http://alexis.royer.free.fr/CLI/

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

提前谢谢了!罗伯托。

Ps 对于我不正确的英语语法,我深表歉意。

4

5 回答 5

0

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

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

这可以使用 Win32 中的 AllocConsole 函数来完成。我建议您阅读此问答:如何在 Winforms 中包含控制台?

于 2012-06-21T15:05:01.430 回答
0

如果您对是否需要对应用程序进行多线程感到困惑,我建议您先阅读一些有关线程的优点和缺点的内容。Joe Albahari 的网络书的第一章是一个很好的介绍。

在不完全了解您的程序设计的情况下,我建议您在后台线程上执行所有聊天机器人行为。此外,您在控制台中键入的任何命令也应该触发后台工作,这使控制台可以自由打印输出或接受输入,但不执行任何实际的聊天任务。请让我知道,如果你有任何问题。

于 2012-06-21T15:06:33.903 回答
0

对于解析命令,您真的不需要使用线程,这里有一些关于完成此操作的最佳方法的信息

@ Codeplex.com上有几个命令行解析器。它们将非常复杂,因此取决于您想要进行多少命令行解析,您可以使用它们。

我会从使用 string.substring 开始

对于 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;
   }

如果你真的到了需要使用线程的地步,你总是可以使用后台工作线程

关于如何使用后台线程的教程

于 2012-06-21T15:07:27.733 回答
0

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

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

(这也将为您提供多进程应用程序,而无需自己显式管理进程。)

于 2012-06-21T15:10:16.923 回答
0

这是一个非常简单的命令行,示例说明了如何使用不同的颜色和处理参数:

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);
        }
    }
}

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

于 2012-06-21T15:14:36.763 回答