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 モード (画面にウィンドウが表示されるか、または何も表示されない) または "コンソール" プロセス (プロセスと同時にコマンド ウィンドウが開かれる) のいずれかで起動できます。ただし、この 2 つは相互に排他的ではありません。「コンソール」プロセスはウィンドウを作成でき、GUI プロセスは独自のコマンドライン ウィンドウを作成して所有できます。ただし、コンソール ウィンドウを作成する GUI アプリケーションは、親コンソール セッションでそのコンソールを開きません。

あなたの質問について私が理解していることから、既存の GUI アプリケーションがあり、アプリケーションをコンソールのみのプログラムに変換するのではなく、ある種のコンソール (Quake コンソールなど) をアプリケーションに有効にしたいと考えています。

これは、Win32 の AllocConsole 関数を使用して行うことができます。この Q&A を読むことをお勧めします: Winforms にコンソールを含めるにはどうすればよいですか?

于 2012-06-21T15:05:01.430 に答える
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 に答える
0

アプリケーションをマルチスレッド化する必要があるかどうかについて混乱している場合は、最初にスレッド化の長所と短所について少し読むことをお勧めします。Joe Albahari のWeb ブックの最初の章は、優れた紹介です。

プログラムの設計を完全に理解していない場合は、チャット ボットのすべての動作をバックグラウンド スレッドで実行することをお勧めします。さらに、コンソールに入力するコマンドはバックグラウンド作業もトリガーする必要があります。これにより、コンソールは自由に出力を出力したり、入力を受け入れたりできますが、実際のチャット業務は実行されません. ご不明な点がございましたら、お知らせください。

于 2012-06-21T15:06:33.903 に答える
0

コマンドを解析する場合、スレッドを使用する必要はありません

@ Codeplex.comには、いくつかのコマンド ライン パーサーがあります。それらは非常に複雑になるため、実行したいコマンドライン解析の量に応じて、それらを使用できます。

string.substring を使用することから始めます

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

本当にスレッドを使用する必要がある場合は、いつでもバックグラウンドワーカースレッドを使用できます

バックグラウンド スレッドの使用方法に関するチュートリアル

于 2012-06-21T15:07:27.733 に答える
0

Windows サービスの作成を検討しましたか? サービスには、「処理を行う」すべてのコードが含まれます。その後、( ExecuteCommandを介して) サービスにコマンドを発行できます。

その後、コンソールや GUI を含む複数の UI を作成できます。これらの UI は、単にサービスを呼び出して、情報を受け取ります。これにより、標準のコマンド ライン ウィンドウを介してコマンドを発行し、同じプロジェクト内から両方のウィンドウを管理しようとする複雑さなしに、GUI で結果を確認できます。

(これにより、自分でプロセスを明示的に管理しなくても、マルチプロセス アプリケーションが得られます。)

于 2012-06-21T15:10:16.923 に答える