Интерфейс на командния ред във вашето C# приложение

Работя с C# за няколко проекта, нищо голямо или нещо подобно. Така че искам да започна работа по реален проект сега. Създадох IRC бот в C#. Този IRC бот работи без GUI в командния ред. Сега, когато работи, извежда всяка команда и други неща.

Това, което искам да направя, е да създам интерфейс за приложението в командния ред. Така че мога да въвеждам команди в приложението и да извеждам резултатите от командата.

Опитах се да прочета няколко теми за многонишковия софтуер, защото вярвам, че това е необходимо, за да постигна тази функционалност. Но не знам със сигурност.

Чел съм теми като Интерфейс на командния ред в Java и http://msdn.microsoft.com/en-us/library/aa288457(v=vs.71).aspx. Но все още съм много объркан.

Опитах да потърся в гугъл по въпроса за всякакви инструменти като http://alexis.royer.free.fr/CLI/

Бих искал да помоля за съвет по този въпрос и, ако е възможно, помощ относно основите на тази програма. Ако някой силно ми препоръча да не търся тази функционалност в рамките на C#, тогава ще се радвам да чуя неговото/нейното мнение защо не и съвет какво трябва да използвам/правя.

Много благодаря предварително! Роберто.

P.s. Моите извинения за моята неправилна английска граматика.


person Roberto    schedule 21.06.2012    source източник


Отговори (5)


Ето един много прост команден ред с пример как да правите различни цветове и да обработвате аргументи:

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

Не съм сигурен защо искате да е многонишков, но можете да добавите това, като взаимодействате с нишките в различните методи.

person markmuetz    schedule 21.06.2012
comment
Причината за многопоточността е, че мога да имам основна нишка за вход/изход, която е в моята конзола и има (няколко) фонови нишки, изпълняващи команди, свързани с чат. Ще разгледам предложения от вас код. Благодаря ти ! - person Roberto; 22.06.2012
comment
@Roberto: Има смисъл, може да искате да погледнете BackgroundWorkers, те предлагат опростен механизъм за нишки и могат лесно да бъдат интегрирани с кода по-горе, за да ви осигурят това, което търсите. (т.е. неблокираща фонова команда) - person markmuetz; 25.06.2012

В Windows изображение на процес може да се стартира или в GUI режим (с прозорци на екрана... или изобщо без нищо) или като процес "Конзола" (така че команден прозорец ще бъде отворен едновременно с процеса). Въпреки това двете не се изключват взаимно: процесът "Конзола" може да създава прозорци, а GUI процесът може да създава и притежава собствени прозорци на командния ред. Въпреки това GUI приложение, което създава прозорец на конзолата, няма да отвори тази конзола в нито една сесия на родителската конзола.

Доколкото разбирам за въпроса ви, имате съществуващо GUI приложение и искате да активирате някакъв вид конзола (като конзолата на Quake) към вашето приложение, вместо да го конвертирате в програма само за конзола.

Това може да стане с помощта на функцията AllocConsole в Win32. Предлагам ви да прочетете тези въпроси и отговори: Как да включа конзола в Winforms?

person Dai    schedule 21.06.2012
comment
Благодаря и за отговора, много съм благодарен за това! Може да съм ви объркал поради лошия си английски (който не е моят роден език). Нямам GUI, имам конзолно базирано приложение. Всичко работи в конзола. Но погледнах въпросите и отговорите, които ми свързахте, много са удобни и ги запазих. Почти съм сигурен, че ще го използвам в друг проект, който изпълнявам в момента, така че много ви благодаря за това! - person Roberto; 22.06.2012

Ако сте объркани относно това дали трябва или не да направите многонишково приложение, бих препоръчал първо да прочетете малко за предимствата и недостатъците на нишката. Първата глава от уеб книгата на Джо Албахари е чудесно въведение.

Без да разбирате напълно дизайна на вашата програма, бих ви препоръчал да извършите цялото поведение на бота за чат във фонова нишка. Освен това всички команди, които въвеждате в конзолата, също трябва да задействат фонова работа, което оставя конзолата свободна да отпечатва изход или да приема въвеждане, но не и да изпълнява никое от действителните задължения за чат. Моля, уведомете ме, ако имате въпроси.

person Chris    schedule 21.06.2012
comment

Опитвам се да обработя някои данни за изображения, които идват директно от камерата на устройството. За да разбера структурата на CGImage, използвам буфер за създаване на изображение, което не работи правилно за мен (знам, че не трябва да използвам C код в рамките на Obj-C Code, това е само за разбиране). Кодът е както следва:

int *outBuf = malloc(sizeof(int) * width * height);
for (int i = 0; i < width * height;i ++)
{
     outBuf[i] = (((float)i) / ((float) width * height)) * 255.f;
}
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();

CGContextRef ctx = CGBitmapContextCreate(outBuf, width, height, 8, width * 4, colorSpace, kCGImageAlphaNone);

CGImageRef img = CGBitmapContextCreateImage(ctx);
CFRelease(ref);
CGContextRelease(ctx);
free(outBuf);

CGColorSpaceRelease(colorSpace);

[view.imgView setImage: [UIImage imageWithCGImage:img]];

CGImageRelease(img);

Това трябва да създаде градиент от първия до последния пиксел, но води до странна графика:

генерирано изображение

Откъде идват хоризонталните разстояния? (Искам да разреша този проблем, знам, че има и други възможности за рисуване на градиента) Благодаря предварително.

- person Roberto; 22.06.2012

За парсване на команди наистина не е необходимо да използвате нишки, ето малко информация за най-добрия начин да постигнете това

Има няколко парсера на командния ред в @ Codeplex.com . Те ще бъдат много сложни, така че в зависимост от това колко разбор на командния ред искате да направите, можете да ги използвате.

Просто бих започнал с използване на string.substring

за CONNECT [ []] string command = "Свържете 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;
   }

ако наистина стигнете до точката, в която трябва да използвате нишка, винаги можете да използвате нишка backgroundworker

Урок за това как да използвайте фонова нишка

person Micah Armantrout    schedule 21.06.2012

Мислили ли сте да създадете услуга на Windows? Услугата ще съдържа целия ви код, който "върши неща". След това можете да издавате команди към услугата (чрез ExecuteCommand).

След това можете да създадете множество потребителски интерфейси, включително конзола и GUI, които просто се обаждат в услугата и след това получават информация обратно. Това би ви позволило да издавате команди чрез стандартен прозорец на командния ред и да виждате резултатите в GUI без усложнението да се опитвате да управлявате и двата прозореца от един и същи проект.

(Това също ще ви даде многопроцесно приложение, без да се налага сами изрично да управлявате процесите.)

person JDB still remembers Monica    schedule 21.06.2012
comment
Това би било наистина страхотно да се направи, но мисля, че също би било малко пресилено за моя малък проект за IRC бот. Какви биха били предимствата за такава настройка? Освен че можете да свържете повече от 1 UI и че услугата ще се рестартира при рестартиране на машината. - person Roberto; 22.06.2012
comment
Хм... Сигурно съм прочел грешно въпроса ти. Мислех, че търсите да създадете нещо с интерфейс на GUI, но след като препрочетох въпроса ви, вече не го виждам. Въпреки това, каквото си заслужава, една услуга на Windows не е толкова трудна за създаване и ще ви даде страхотна разширяемост в бъдеще (ако искате в крайна сметка да създадете GUI за настолен компютър или уеб страница). - person JDB still remembers Monica; 22.06.2012