System.Console, Mono y NCurses

Hola a todos, en mi trabajo (y anteriormente en mis estudios) a menudo uso C # y este lenguaje me es familiar, como dicen. Habiendo decidido practicar un poco en programación, escribí un editor de texto de consola para Linux. Describiré brevemente la experiencia adquirida.

En Mono, la clase System.Console no es totalmente compatible, pero Mono es notable porque, al igual que en .NET, puede usar P / Invoke para llamar a métodos de biblioteca nativa de C / C ++ Linux.

En mi caso, era una biblioteca ncurses. Se ve así:

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

Todos los métodos ncurses en este proyecto se conectaron según sea necesario, en caso de que System.Console no funcionara correctamente, pero si el método estándar funcionaba, la vida era mucho más fácil.

Por ejemplo, el método ncurses wgetch () recibe dos bytes en lugar de uno para caracteres Unicode, y para el diseño cirílico tendría que usar un método más complejo al pasar el puntero. El uso de la consola estándar. ReadKey permitió dejar todo el código manejable y separar fácilmente las teclas de función de los caracteres de texto.

No hubo problemas con la lectura y escritura de archivos, y todo funcionó correctamente como lo hizo en .NET

imagen

Cuando todo funcionaba de manera estable, se intentó construir este portátil en Windows. Para no recopilar PDCurses de las fuentes, tomé un dll listo de MinGW, a saber, libpdcursesw.dll e hizo un buen trabajo como reemplazo de ncurses.

Ni siquiera necesitaba Mono para construir una computadora portátil, simplemente abrí la solución MonoDevelop en Visual Studio sin ninguna aventura.

Lo único que requirió ajuste fue la salida a la consola, tuve que abandonar mvwprintw y reescribí Print, la salida funcionó y los cambios en el código fueron mínimos:

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

También tuve que ajustar el tamaño del espacio de trabajo y los métodos para cambiar el color del texto.

Todo esto me convenció de que C # es bastante adecuado para tareas bajo Linux y la solución, en cuyo caso es fácil de portar a Windows.

La implementación completa está disponible en GitHub , la rama maestra para Linux y Windows para Windows.

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


All Articles