Консольное приложение в контексте C # — это приложение, которое принимает ввод и отображает вывод на консоли командной строки с доступом к трем основным потокам данных: стандартный ввод, стандартный вывод и стандартная ошибка.
Консольное приложение облегчает чтение и запись символов с консоли — по отдельности или в виде целой строки. Это самая простая форма программы на C #, которая обычно вызывается из командной строки Windows. Консольное приложение обычно существует в виде отдельного исполняемого файла с минимальным графическим интерфейсом пользователя или без него.
Techopedia объясняет консольное приложение
Структура программы консольного приложения облегчает последовательный поток выполнения между операторами. Предназначенное для клавиатуры и экрана дисплея, консольное приложение управляется клавиатурой и системными событиями, генерируемыми сетевыми подключениями и объектами.
Консольное приложение в первую очередь разработано по следующим причинам:
- Предоставить простой пользовательский интерфейс для приложений, требующих минимального взаимодействия с пользователем или не требующих его вообще, таких как примеры для изучения функций языка C # и служебные программы командной строки.
- Автоматизированное тестирование, которое может уменьшить ресурсы автоматизации реализации.
Консольные приложения, разработанные на C #, имеют одну основную точку входа (статический основной метод) выполнения, которая принимает необязательный массив параметров в качестве единственного аргумента для представления параметров командной строки.
Уничтожаю C++
.NET Framework предоставляет библиотечные классы для быстрой разработки консольных приложений с возможностью вывода на экран в различных форматах. System.Console (закрытый класс) является одним из основных классов, используемых при разработке консольных приложений.
Одно из ограничений функциональности консольного приложения состоит в том, что строки, возвращаемые функциями консоли с использованием кодовой страницы изготовителя оборудования (OEM), могут неправильно обрабатываться функциями с использованием кодовой страницы Американского национального института стандартов (ANSI). Эта проблема может быть решена путем вызова функции SetFileApisToOEM для создания строк символов OEM, а не строк символов ANSI.
Это определение было написано в контексте C #
Приложение работает медленно? время уточнять
Нативное приложение или мобильное веб-приложение?
При принятии решения о разработке собственного приложения или мобильного веб-приложения необходимо учитывать множество факторов, поэтому здесь мы рассмотрим некоторые факторы.
Консольные приложения
Для этого есть приложение — в твоей машине
Автомобильные приложения, которые часто называют информационно-развлекательными, существуют уже несколько лет. По большей части, предложения были скромными, с приложениями для потоковой передачи музыки, новостей и разговорного радио, а также приложениями GPS .
Источник: ru.theastrologypage.com
Осмысленное использование консольных приложений в C#
Когда что-то уже написано, оттестировано и достойно справляется со своей работой, то лучше использовать это средство, нежели изобретать велосипед. Например, есть консольная утилита cpctest.exe, которая позволяет выполнять все те-же действия что и графическая оболочка, и масса других утилит из стандартного набора Windows. На разработку, отладку и покрытие тестами аналогичной функциональности уйдет драгоценное время. Так зачем его прожигать? Приступим.
Для начала нам нужно залезть на MSDN и посмотреть синтаксис стандартных команд. В результате мы увидим, что запуск любого консольного приложения состоит из имени приложения и его параметров. Приложение инстанцируется системным классом Process. Прототип нашей функции для запуска консольного приложения будет выглядеть следующим образом:
bool Execute(string commandName, IEnumerable paramsList)
Если мы захотим получать результат выполнения запущенного приложения и обрабатывать его, нам потребуется соответствующий метод:
string GetResult (string commandName, IEnumerable paramsList)
Далее идем снова на MSDN и смотрим ProcessStartInfo Arguments, UseShellExecute, RedirectStandardOutput и RedirectStandardError, если Вы будете строго обрабатывать исключения как в Java. В итоге для инициализации процесса нам потребуется свойство, которое будет определять режим запуска консольного приложения и метод для инициации процесса. Для своего класса я использовал паттерн Facade.
public class CommandHelpers < public CommandHelpers() < Invisible = true; >public bool Invisible < get; set; >private Process CreateProcess(string commandName, IEnumerable paramsList, bool output = false) < string paramString = paramsList.Aggregate(null, (current, param) => current + » » + param); return new Process < StartInfo = < FileName = commandName, Arguments = paramString, UseShellExecute = output ? !output : !Invisible, RedirectStandardOutput = output >>; >
Необходимо учесть, что запускаемое приложение может работать бесконечно долго, например, ping –t youwebsite.org. Для его запуска нам потребуется соответствующий метод:
public Task ExecuteAsync(string commandName, IEnumerable paramsList)
Пример использования:
CommandHelpers.cs
using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Common.Security < /// /// See for correct use https://technet.microsoft.com/en-us/library/bb491070.aspx /// public class CommandHelpers < public CommandHelpers() < Invisible = true; >/// /// Not show CMD window /// public bool Invisible < get; set; >/// /// Execete CMD command /// /// Command name only /// Params and keys for command public bool Execute(string commandName, IEnumerable paramsList) < return CreateProcess(commandName, paramsList).Start(); >/// /// Async execete CMD command /// /// Command name only /// Params and keys for command public Task ExecuteAsync(string commandName, IEnumerable paramsList) < return Task.Factory.StartNew(() => CreateProcess(commandName, paramsList).Start()); > /// /// Returns result of command execution /// /// Command name only /// Params and keys for command /// public string GetResult(string commandName, IEnumerable paramsList) < var bufer = new StringBuilder(); using (var proc = CreateProcess(commandName, paramsList, true)) < proc.Start(); while (!proc.StandardOutput.EndOfStream) < bufer.AppendLine(proc.StandardOutput.ReadLine()); >> return bufer.ToString(); > /// /// Returns result of command execution /// Experemental. Not Tested. /// /// Command name only /// Params and keys for command /// public string GetResultAsync(string commandName, IEnumerable paramsList) < var bufer = new StringBuilder(); using (var proc = CreateProcess(commandName, paramsList, true)) < proc.OutputDataReceived += (sender, e) => < if (!string.IsNullOrEmpty(e.Data)) < bufer.AppendLine(e.Data); >>; proc.BeginOutputReadLine(); proc.EnableRaisingEvents = true; proc.WaitForExit(); > return bufer.ToString(); > private Process CreateProcess(string commandName, IEnumerable paramsList, bool output = false) < var paramString = paramsList.Aggregate(null, (current, param) => current + » » + param); return new Process < StartInfo = < FileName = commandName, Arguments = paramString, UseShellExecute = output ? !output : !Invisible, RedirectStandardOutput = output >>; > > >
Источник вдохновения для статьи:
От пользователя vedmaka: toster.ru/q/7644
Источник: habr.com
Возможности консольных приложений для Windows
В настоящее время, когда у разработчиков программного обеспечения появляется всё больше возможностей для сознания приложений со сложным графическим интерфейсом, консольные приложения по-прежнему прочно удерживают свои позиции, даже в такой, казалось бы им среде, как современная операционная система Windows. Это объясняется в первую очередь простотой их исполнения и некоторыми специфическими особенностями консольных приложений, которые делают их в ряде случаев более подходящими для решения задачи, чем приложения с графическим интерфейсом. Один минус: выглядят такие приложения очень уныло и однообразно, как безликая серая масса букв и цифр на чёрном фоне окна консоли. Но не всё так безнадёжно, как может показаться на первый взгляд. В этой статье я попытаюсь дать несколько полезных рецептов расширения функциональности консольных приложений и придания их внешнему виду большей выразительности.
И так: начнём с заголовка окна консоли. При запуске программы в заголовке окна отображается полное имя файла, с которого было запущено приложение. Вместо имени файла, в заголовке окна можно указать любой другой текст: название приложения, например. Это делается с помощью функции SetConsoleTitle.
::SetConsoleTitle(_T(«Пример программы на C++»));
Далее рассмотрим проблему с выводом на консоль текста кириллицы. Практически каждому программисту когда-нибудь приходилось с этим сталкиваться.
По сложившейся традиции, для вывода текста на консоль в большинстве примеров на C++ используются функции стандартной библиотеки, такие как printf или puts, которые работают с текстом в кодировке OEM, что соответствует кодовой странице 866 для русского языка. То же самое происходит при использовании потока вывода cout. Но проблема в том, что большинство текстовых редакторов для Windows работают с текстом в кодировке ANSI, что для русского языка соответствует кодовой странице 1251.
Как решить эту проблему? Проще всего использовать функции, которые записывают текст непосредственно в буфер консоли, а не в стандартный поток. Для этого нужно в программный код включить заголовочный файл CONIO.H и, вместо функций printf и puts, вызывать аналогичные функции _cprintf и _cputs.
Так они выглядят в коде на Visual C++:
_cputts(_T(«Всем привет от меня!rn»)); _tcprintf(_T(«%srn»), _T(«Благодарю за внимание.»));
Несложно написать и собственную процедуру вывода текста на консоль с использованием системной функции WriteConsole. Вот пример такой процедуры:
BOOL PrintText(LPCTSTR szText) < static HANDLE hConsole = ::GetStdHandle(STD_OUTPUT_HANDLE); // DWORD dw(0); return ::WriteConsole(hConsole, szText, ::lstrlen(szText), >
А вот так она используется:
PrintText(_T(«Всем пока. rn»));
Как вы уже наверно заметили, для перевода строки необходимо указывать последовательность из двух символов: «rn», в отличие от стандартного потока, где указывается лишь один символ ‘n’. Но бывает и так, что нужно вывести текст именно через стандартный поток, чтобы его можно было перенаправить в текстовый файл или в другое консольное приложение. Для этого текст нужно перевести в другую кодировку с помощью функции CharToOem. Или использовать функцию WideCharToMultiByte с параметром CP_OEMCP, если ваш текст в кодировке UNICODE.
Размер буфера консоли по умолчанию равен 80х300, т.е. 300 строк по 80 символов каждая. Задать буферу консоли другой размер можно при помощи функции SetConsoleScreenBufferSize.
Атрибутами текста консоли являются: цвет символов и цвет заднего фона. Код атрибута соответствует числовому значению в диапазоне от 0x00 до 0x7F. Так выглядит таблица с числовыми значениями атрибутов текста в шестнадцатеричном коде:
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C | 1D | 1E | 1F |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 2A | 2B | 2C | 2D | 2E | 2F |
30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 3A | 3B | 3C | 3D | 3E | 3F |
40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 4A | 4B | 4C | 4D | 4E | 4F |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 5A | 5B | 5C | 5D | 5E | 5F |
60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 6A | 6B | 6C | 6D | 6E | 6F |
70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 7A | 7B | 7C | 7D | 7E | 7F |
Функция SetConsoleTextAttribute задаёт выводимому тексту указанный атрибут. Для задания всему окну консоли указанных атрибутов применяется функция FillConsoleOutputAttribute.
Позиционирование текста (т.е. установка курсора на позицию с заданными координатами) производится с помощью функции SetConsoleCursorPosition.
Полный код моего примера в Visual C++ 2005 выглядит так:
#include «stdafx.h» #include BOOL PrintText(LPCTSTR szText); BOOL SetConsoleAttrib(WORD wAttrib); BOOL SetCurrentPos(SHORT x, SHORT y); BOOL SetConsoleSize(SHORT x, SHORT y); int _tmain(int argc, _TCHAR* argv[]) < ::SetConsoleTitle(_T(«Пример программы на C++»)); // SetConsoleSize(160, 80); SetConsoleAttrib(0x6F); // _cputts(_T(«Всем привет от меня!rn»)); _tcprintf(_T(«%srn»), _T(«Благодарю за внимание.»)); // SetCurrentPos(25, 10); PrintText(_T(«Всем пока. rn»)); // _gettch(); // ожидание нажатия клавиши. return 0; >static HANDLE _ConsoleOut = ::GetStdHandle(STD_OUTPUT_HANDLE); BOOL SetConsoleAttrib(WORD wAttrib) < ::SetConsoleTextAttribute(_ConsoleOut, wAttrib); CONSOLE_SCREEN_BUFFER_INFO csbi = ; ::GetConsoleScreenBufferInfo(_ConsoleOut, DWORD dw(0); COORD cr = ; return ::FillConsoleOutputAttribute(_ConsoleOut, wAttrib, csbi.dwSize.X * csbi.dwSize.Y, cr, > BOOL PrintText(LPCTSTR szText) < DWORD dw(0); return ::WriteConsole(_ConsoleOut, szText, ::lstrlen(szText), >BOOL SetCurrentPos(SHORT x, SHORT y) < COORD pos = ; return ::SetConsoleCursorPosition(_ConsoleOut, pos); > BOOL SetConsoleSize(SHORT x, SHORT y) < COORD size = ; return ::SetConsoleScreenBufferSize(_ConsoleOut, size); >
Приведённый пример был создан в среде Visual C++ 2005 как проект Win32 Console Application.
В заключение хочу отметить, что возможности консольного интерфейса Windows отнюдь не исчерпываются теми функциями, которые были упомянуты в этой статье. Не было рассказано про получение и обработку сообщений от мыши, об использовании в консольных приложениях возможностей графического интерфейса Windows. Но об этом речь пойдёт в дальнейших публикациях.
Источник: codenet.ru