我一直在使用C#进行一些项目,没什么大不了的。所以我想现在就开始研究一个真正的项目。我用C#创建了一个IRC机器人。 此IRC bot在命令行中没有GUI运行。现在当它运行时,它输出每个命令和东西。
我想要做的是在命令行内为应用程序创建一个界面。 这样我就可以在应用程序中输入命令并输出命令的结果。
我已经尝试阅读有关多线程我的软件的几个主题,因为我相信这是我实现此功能所必需的。但我不确定。
我读过Command-line interface in Java和http://msdn.microsoft.com/en-us/library/aa288457(v=vs.71).aspx等帖子。但我仍然非常困惑。
我已经尝试使用Google搜索任何工具包,例如http://alexis.royer.free.fr/CLI/
我想就此问题寻求建议,如有可能,请提供有关此计划的基础知识的帮助。如果有人强烈建议我不要在C#中搜索这个功能,那么我很乐意听到他/她对于为什么不这样做的意见以及对我应该使用/做什么的建议。
非常感谢提前! 罗伯特。
P.S。我对错误的英语语法表示歉意。
答案 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;
}
如果你真的达到了需要使用线程的程度,你可以随时使用后台工作线程
答案 4 :(得分:0)
您是否考虑过创建Windows服务?该服务将包含所有“做事”的代码。然后,您可以向服务发出命令(通过ExecuteCommand)。
然后,您可以创建多个UI,包括控制台和GUI,它们只需调用服务然后再接收信息。这将使您能够通过标准命令行窗口发出命令,并在GUI中查看结果,而无需尝试从同一项目内部管理两个窗口。
(这也可以为您提供一个多进程应用程序,而无需自己明确管理这些进程。)