System.Console, Mono et NCurses

Bonjour à tous, dans mon travail (et plus tôt dans mes études) j'utilise souvent le C # et ce langage m'est devenu familier, comme on dit. Ayant décidé de pratiquer la programmation, j'ai écrit un éditeur de texte de console pour Linux. Je décrirai brièvement l'expérience acquise.

Dans Mono, la classe System.Console n'est pas entièrement prise en charge, mais Mono est remarquable en ce que, tout comme dans .NET, vous pouvez utiliser P / Invoke pour appeler des méthodes de bibliothèques Linux C / C ++ natives.

Dans mon cas, c'était une bibliothèque ncurses. Cela ressemble à ceci:

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

Toutes les méthodes ncurses de ce projet ont été connectées selon les besoins, au cas où System.Console ne fonctionnerait pas correctement, mais si la méthode standard fonctionnait, elle rendait la vie beaucoup plus facile.

Par exemple, la méthode ncurses wgetch () reçoit deux octets au lieu d'un pour les caractères Unicode, et pour la disposition cyrillique, je devrais utiliser une méthode plus complexe en passant le pointeur. L'utilisation de la Console.ReadKey standard a permis de laisser tout le code gérable et de séparer facilement les touches de fonction des caractères de texte.

Il n'y a eu aucun problème de lecture et d'écriture de fichiers, et tout a fonctionné correctement comme sur NET.

image

Lorsque tout fonctionnait de manière stable, une tentative a été faite pour construire ce portable sur Windows. Afin de ne pas collecter PDCurses à partir des sources, j'ai pris une DLL prête à l'emploi de MinGW, à savoir libpdcursesw.dll et elle a fait du bon travail en remplacement de ncurses.

Je n'avais même pas besoin de Mono pour construire un bloc-notes, je viens d'ouvrir la solution MonoDevelop dans Visual Studio sans aucune aventure.

La seule chose qui nécessitait un ajustement était la sortie vers la console, j'ai dû abandonner mvwprintw et j'ai réécrit Print, la sortie fonctionnait et les changements dans le code étaient minimes:

 public void Print(int x, int y, string message) { Console.SetCursorPosition(x, y); Console.Write(message); } 

J'ai également dû ajuster la taille de l'espace de travail et les méthodes pour changer la couleur du texte.

Tout cela m'a convaincu que C # est tout à fait adapté aux tâches sous Linux et à la solution, auquel cas il est facile de porter sur Windows.

L'implémentation complète est disponible sur GitHub , la branche principale pour Linux et Windows pour Windows.

Source: https://habr.com/ru/post/fr468805/


All Articles