Всем привет, в своей работе (а ранее и в учебе) я часто использую C# и этот язык стал мне, что называется, привычным. Решив немного потренироваться в программировании, я написал консольный текстовый редактор для Linux. Вкратце опишу полученный опыт.
В Mono класс System.Console поддерживается не полностью, но Mono замечателен тем, что также как и в .NET можно использовать P/Invoke, для вызова методов нативных C/C++ Linux библиотек.
В моем случае это была библиотека ncurses. Выглядит это так:
Все методы ncurses в этом проекте подключались по мере необходимости, в случае если System.Console работал не должным образом, но если же стандартный метод работал это значительно облегчало жизнь.
Например метод ncurses wgetch() получает два байта вместо одного для символов Юникода, и для кириллической раскладки мне пришлось бы использовать более сложный метод с передачей указателя. Использование стандартного Console.ReadKey позволило оставить весь код управляемым и легко разделить функциональные клавиши от текстовых символов.
С чтением и записью файлов также не возникло проблем и все работало штатно как и на .NET
Когда уже все стабильно работало, была предпринята попытка собрать этот блокнот на Windows. Дабы не собирать PDCurses из исходников, я взял готовую dll из состава MinGW, а именно libpdcursesw.dll и она хорошо справилась в качестве замены ncurses.
Для сборки блокнота мне даже не понадобился Mono, я просто открыл решение MonoDevelop в Visual Studio без всяких приключений.
Единственное что потребовало корректировки, это вывод в консоль, мне пришлось отказаться от mvwprintw и я переписал Print, вывод заработал а изменения в коде были минимальны:
Также пришлось подкорректировать размеры рабочей области, и методы изменения цвета текста.
Все это убедило меня в том, что C# вполне годится для задач под Linux и решения в случае чего легко портировать на Windows.
Полная реализация доступна на GitHub, ветка master для Linux и windows для Windows.
В Mono класс System.Console поддерживается не полностью, но Mono замечателен тем, что также как и в .NET можно использовать P/Invoke, для вызова методов нативных C/C++ Linux библиотек.
В моем случае это была библиотека ncurses. Выглядит это так:
public class Curses
{
/// <summary>
/// файл подключаемой библиотеки
/// </summary>
const string NCurses = "libncursesw.so.5";
/// <summary>
/// указатель на окно терминала
/// </summary>
private IntPtr window;
[DllImport(NCurses)]
private extern static IntPtr initscr();
/// <summary>
/// конструктор класса обертки
/// </summary>
public Curses()
{
window = initscr();
}
[DllImport(NCurses)]
private extern static int endwin();
/// <summary>
/// Деструктор обертки
/// </summary>
~Curses()
{
int result = endwin();
}
[DllImport(NCurses)]
private extern static int mvwprintw(IntPtr window, int y, int x, string message);
/// <summary>
/// Вывод сообщения по координатам
/// </summary>
public int Print(int x, int y, string message)
{
return mvwprintw(window, y, x, message);
}
[DllImport(NCurses)]
private extern static int refresh(IntPtr window);
/// <summary>
/// Обновление окна терминала
/// </summary>
public int Refresh()
{
return refresh(window);
}
. . .
Все методы ncurses в этом проекте подключались по мере необходимости, в случае если System.Console работал не должным образом, но если же стандартный метод работал это значительно облегчало жизнь.
Например метод ncurses wgetch() получает два байта вместо одного для символов Юникода, и для кириллической раскладки мне пришлось бы использовать более сложный метод с передачей указателя. Использование стандартного Console.ReadKey позволило оставить весь код управляемым и легко разделить функциональные клавиши от текстовых символов.
С чтением и записью файлов также не возникло проблем и все работало штатно как и на .NET
Когда уже все стабильно работало, была предпринята попытка собрать этот блокнот на Windows. Дабы не собирать PDCurses из исходников, я взял готовую dll из состава MinGW, а именно libpdcursesw.dll и она хорошо справилась в качестве замены ncurses.
Для сборки блокнота мне даже не понадобился Mono, я просто открыл решение MonoDevelop в Visual Studio без всяких приключений.
Единственное что потребовало корректировки, это вывод в консоль, мне пришлось отказаться от mvwprintw и я переписал Print, вывод заработал а изменения в коде были минимальны:
public void Print(int x, int y, string message)
{
Console.SetCursorPosition(x, y);
Console.Write(message);
}
Также пришлось подкорректировать размеры рабочей области, и методы изменения цвета текста.
Все это убедило меня в том, что C# вполне годится для задач под Linux и решения в случае чего легко портировать на Windows.
Полная реализация доступна на GitHub, ветка master для Linux и windows для Windows.